From c7927a3c0ef1d97faf24f1df31baf419e2d92fa1 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Tue, 29 Sep 2009 14:17:19 +0000 Subject: bfd * Makefile.am (ALL_MACHINES): Add cpu-rx.lo. (ALL_MACHINES_CFILES): Add cpu-rx.c. (BFD32_BACKENDS): Add elf32-rx.lo. (BFD32_BACKENDS_CFILES): Add elf32-rx.c. * archures.c (bfd_architecture): Add bfd_arch_rx and bfd_mach_rx. Export bfd_rx_arch. (bfd_archures_list): Add bfd_rx_arch. * config.bfd: Add entry for rx-*-elf. * configure.in: Add entries for bfd_elf32_rx_le_vec and bfd_elf32_rx_be_vec. * reloc.c: Add RX relocations. * targets.c: Add RX target vectors. * Makefile.in: Regenerate. * bfd-in2.h: Regenerate. * configure: Regenerate. * libbfd.h: Regenerate. * cpu-rx.c: New file. * elf32-rx.c: New file. binutils * readelf.c: Add support for RX target. * MAINTAINERS: Add DJ and NickC as maintainers for RX. gas * Makefile.am: Add RX target. * configure.in: Likewise. * configure.tgt: Likewise. * read.c (do_repeat_with_expander): New function. * read.h: Provide a prototype for do_repeat_with_expander. * doc/Makefile.am: Add RX target documentation. * doc/all.texi: Likewise. * doc/as.texinfo: Likewise. * Makefile.in: Regenerate. * NEWS: Mention support for RX architecture. * configure: Regenerate. * doc/Makefile.in: Regenerate. * config/rx-defs.h: New file. * config/rx-parse.y: New file. * config/tc-rx.h: New file. * config/tc-rx.c: New file. * doc/c-rx.texi: New file. gas/testsuite * gas/rx: New directory. * gas/rx/*: New set of test cases. * gas/elf/section2.e-rx: New expected output file. * gas/all/gas.exp: Add support for RX target. * gas/elf/elf.exp: Likewise. * gas/lns/lns.exp: Likewise. * gas/macros/macros.exp: Likewise. include * dis-asm.h: Add prototype for print_insn_rx. include/elf * rx.h: New file. include/opcode * rx.h: New file. ld * Makefile.am: Add rules to build RX emulation. * configure.tgt: Likewise. * NEWS: Mention support for RX architecture. * Makefile.in: Regenerate. * emulparams/elf32rx.sh: New file. * emultempl/rxelf.em: New file. opcodes * Makefile.am: Add RX files. * configure.in: Add support for RX target. * disassemble.c: Likewise. * Makefile.in: Regenerate. * configure: Regenerate. * opc2c.c: New file. * rx-decode.c: New file. * rx-decode.opc: New file. * rx-dis.c: New file. --- bfd/ChangeLog | 21 + bfd/Makefile.am | 4 + bfd/Makefile.in | 6 + bfd/archures.c | 4 + bfd/bfd-in2.h | 28 + bfd/config.bfd | 5 + bfd/configure | 2 + bfd/configure.in | 2 + bfd/cpu-rx.c | 57 + bfd/elf32-rx.c | 3402 ++++++++ bfd/libbfd.h | 24 + bfd/reloc.c | 51 + bfd/targets.c | 4 + binutils/ChangeLog | 5 + binutils/MAINTAINERS | 2 + binutils/readelf.c | 15 + gas/ChangeLog | 20 + gas/Makefile.am | 15 +- gas/Makefile.in | 30 +- gas/NEWS | 2 + gas/config/rx-defs.h | 57 + gas/config/rx-parse.y | 1555 ++++ gas/config/tc-rx.c | 2394 ++++++ gas/config/tc-rx.h | 93 + gas/configure | 7 + gas/configure.in | 7 + gas/configure.tgt | 1 + gas/doc/Makefile.am | 1 + gas/doc/Makefile.in | 1 + gas/doc/all.texi | 1 + gas/doc/as.texinfo | 7 + gas/doc/c-rx.texi | 145 + gas/read.c | 51 + gas/read.h | 1 + gas/testsuite/ChangeLog | 10 + gas/testsuite/gas/all/gas.exp | 14 +- gas/testsuite/gas/elf/elf.exp | 4 + gas/testsuite/gas/elf/section2.e-rx | 9 + gas/testsuite/gas/lns/lns.exp | 1 + gas/testsuite/gas/macros/macros.exp | 1 + gas/testsuite/gas/rx/abs.d | 14 + gas/testsuite/gas/rx/abs.sm | 2 + gas/testsuite/gas/rx/adc.d | 40 + gas/testsuite/gas/rx/adc.sm | 4 + gas/testsuite/gas/rx/add.d | 132 + gas/testsuite/gas/rx/add.sm | 8 + gas/testsuite/gas/rx/and.d | 100 + gas/testsuite/gas/rx/and.sm | 7 + gas/testsuite/gas/rx/bclr.d | 40 + gas/testsuite/gas/rx/bclr.sm | 5 + gas/testsuite/gas/rx/bcnd.d | 104 + gas/testsuite/gas/rx/bcnd.sm | 5 + gas/testsuite/gas/rx/bmcnd.d | 296 + gas/testsuite/gas/rx/bmcnd.sm | 2 + gas/testsuite/gas/rx/bnot.d | 40 + gas/testsuite/gas/rx/bnot.sm | 5 + gas/testsuite/gas/rx/bra.d | 30 + gas/testsuite/gas/rx/bra.sm | 6 + gas/testsuite/gas/rx/brk.d | 10 + gas/testsuite/gas/rx/brk.sm | 2 + gas/testsuite/gas/rx/bset.d | 40 + gas/testsuite/gas/rx/bset.sm | 5 + gas/testsuite/gas/rx/bsr.d | 18 + gas/testsuite/gas/rx/bsr.sm | 3 + gas/testsuite/gas/rx/btst.d | 40 + gas/testsuite/gas/rx/btst.sm | 5 + gas/testsuite/gas/rx/clrpsw.d | 14 + gas/testsuite/gas/rx/clrpsw.sm | 1 + gas/testsuite/gas/rx/cmp.d | 96 + gas/testsuite/gas/rx/cmp.sm | 6 + gas/testsuite/gas/rx/dbt.d | 9 + gas/testsuite/gas/rx/dbt.sm | 1 + gas/testsuite/gas/rx/div.d | 88 + gas/testsuite/gas/rx/div.sm | 4 + gas/testsuite/gas/rx/divu.d | 88 + gas/testsuite/gas/rx/divu.sm | 4 + gas/testsuite/gas/rx/emul.d | 88 + gas/testsuite/gas/rx/emul.sm | 4 + gas/testsuite/gas/rx/emulu.d | 88 + gas/testsuite/gas/rx/emulu.sm | 4 + gas/testsuite/gas/rx/explode | 199 + gas/testsuite/gas/rx/fadd.d | 28 + gas/testsuite/gas/rx/fadd.sm | 3 + gas/testsuite/gas/rx/fcmp.d | 28 + gas/testsuite/gas/rx/fcmp.sm | 3 + gas/testsuite/gas/rx/fdiv.d | 28 + gas/testsuite/gas/rx/fdiv.sm | 3 + gas/testsuite/gas/rx/fmul.d | 28 + gas/testsuite/gas/rx/fmul.sm | 3 + gas/testsuite/gas/rx/fsub.d | 28 + gas/testsuite/gas/rx/fsub.sm | 3 + gas/testsuite/gas/rx/ftoi.d | 24 + gas/testsuite/gas/rx/ftoi.sm | 2 + gas/testsuite/gas/rx/gprel.d | 53 + gas/testsuite/gas/rx/gprel.sm | 9 + gas/testsuite/gas/rx/int.d | 10 + gas/testsuite/gas/rx/int.sm | 1 + gas/testsuite/gas/rx/itof.d | 72 + gas/testsuite/gas/rx/itof.sm | 2 + gas/testsuite/gas/rx/jmp.d | 10 + gas/testsuite/gas/rx/jmp.sm | 1 + gas/testsuite/gas/rx/jsr.d | 10 + gas/testsuite/gas/rx/jsr.sm | 1 + gas/testsuite/gas/rx/machi.d | 12 + gas/testsuite/gas/rx/machi.sm | 1 + gas/testsuite/gas/rx/maclo.d | 12 + gas/testsuite/gas/rx/maclo.sm | 1 + gas/testsuite/gas/rx/macros.inc | 49 + gas/testsuite/gas/rx/make-d | 31 + gas/testsuite/gas/rx/max.d | 88 + gas/testsuite/gas/rx/max.sm | 3 + gas/testsuite/gas/rx/min.d | 88 + gas/testsuite/gas/rx/min.sm | 3 + gas/testsuite/gas/rx/mov.d | 476 ++ gas/testsuite/gas/rx/mov.sm | 27 + gas/testsuite/gas/rx/movu.d | 88 + gas/testsuite/gas/rx/movu.sm | 9 + gas/testsuite/gas/rx/mul.d | 100 + gas/testsuite/gas/rx/mul.sm | 6 + gas/testsuite/gas/rx/mulhi.d | 12 + gas/testsuite/gas/rx/mulhi.sm | 1 + gas/testsuite/gas/rx/mullo.d | 12 + gas/testsuite/gas/rx/mullo.sm | 1 + gas/testsuite/gas/rx/mvfachi.d | 10 + gas/testsuite/gas/rx/mvfachi.sm | 1 + gas/testsuite/gas/rx/mvfaclo.d | 10 + gas/testsuite/gas/rx/mvfaclo.sm | 1 + gas/testsuite/gas/rx/mvfacmi.d | 10 + gas/testsuite/gas/rx/mvfacmi.sm | 1 + gas/testsuite/gas/rx/mvfc.d | 26 + gas/testsuite/gas/rx/mvfc.sm | 1 + gas/testsuite/gas/rx/mvfcp.d | 4 + gas/testsuite/gas/rx/mvfcp.sm | 1 + gas/testsuite/gas/rx/mvtachi.d | 10 + gas/testsuite/gas/rx/mvtachi.sm | 1 + gas/testsuite/gas/rx/mvtaclo.d | 10 + gas/testsuite/gas/rx/mvtaclo.sm | 1 + gas/testsuite/gas/rx/mvtc.d | 98 + gas/testsuite/gas/rx/mvtc.sm | 2 + gas/testsuite/gas/rx/mvtcp.d | 4 + gas/testsuite/gas/rx/mvtcp.sm | 2 + gas/testsuite/gas/rx/neg.d | 14 + gas/testsuite/gas/rx/neg.sm | 2 + gas/testsuite/gas/rx/nop.d | 9 + gas/testsuite/gas/rx/nop.sm | 1 + gas/testsuite/gas/rx/not.d | 14 + gas/testsuite/gas/rx/not.sm | 2 + gas/testsuite/gas/rx/opecp.d | 4 + gas/testsuite/gas/rx/opecp.sm | 1 + gas/testsuite/gas/rx/or.d | 100 + gas/testsuite/gas/rx/or.sm | 7 + gas/testsuite/gas/rx/pop.d | 10 + gas/testsuite/gas/rx/pop.sm | 1 + gas/testsuite/gas/rx/popc.d | 17 + gas/testsuite/gas/rx/popc.sm | 1 + gas/testsuite/gas/rx/popm.d | 13 + gas/testsuite/gas/rx/popm.sm | 2 + gas/testsuite/gas/rx/push.d | 32 + gas/testsuite/gas/rx/push.sm | 2 + gas/testsuite/gas/rx/pushc.d | 17 + gas/testsuite/gas/rx/pushc.sm | 1 + gas/testsuite/gas/rx/pushm.d | 13 + gas/testsuite/gas/rx/pushm.sm | 2 + gas/testsuite/gas/rx/r-bcc.d | 43 + gas/testsuite/gas/rx/r-bcc.sm | 29 + gas/testsuite/gas/rx/r-bra.d | 34 + gas/testsuite/gas/rx/r-bra.sm | 22 + gas/testsuite/gas/rx/racw.d | 10 + gas/testsuite/gas/rx/racw.sm | 2 + gas/testsuite/gas/rx/revl.d | 12 + gas/testsuite/gas/rx/revl.sm | 1 + gas/testsuite/gas/rx/revw.d | 12 + gas/testsuite/gas/rx/revw.sm | 1 + gas/testsuite/gas/rx/rmpa.d | 11 + gas/testsuite/gas/rx/rmpa.sm | 1 + gas/testsuite/gas/rx/rolc.d | 10 + gas/testsuite/gas/rx/rolc.sm | 1 + gas/testsuite/gas/rx/rorc.d | 10 + gas/testsuite/gas/rx/rorc.sm | 1 + gas/testsuite/gas/rx/rotl.d | 16 + gas/testsuite/gas/rx/rotl.sm | 2 + gas/testsuite/gas/rx/rotr.d | 16 + gas/testsuite/gas/rx/rotr.sm | 2 + gas/testsuite/gas/rx/round.d | 24 + gas/testsuite/gas/rx/round.sm | 2 + gas/testsuite/gas/rx/rte.d | 9 + gas/testsuite/gas/rx/rte.sm | 1 + gas/testsuite/gas/rx/rtfi.d | 9 + gas/testsuite/gas/rx/rtfi.sm | 1 + gas/testsuite/gas/rx/rts.d | 9 + gas/testsuite/gas/rx/rts.sm | 1 + gas/testsuite/gas/rx/rtsd.d | 18 + gas/testsuite/gas/rx/rtsd.sm | 2 + gas/testsuite/gas/rx/rx-asm-bad.l | 1 + gas/testsuite/gas/rx/rx-asm-bad.s | 58 + gas/testsuite/gas/rx/rx-asm-good.d | 41 + gas/testsuite/gas/rx/rx-asm-good.inc | 20 + gas/testsuite/gas/rx/rx-asm-good.s | 86 + gas/testsuite/gas/rx/rx.exp | 17 + gas/testsuite/gas/rx/sat.d | 10 + gas/testsuite/gas/rx/sat.sm | 1 + gas/testsuite/gas/rx/satr.d | 9 + gas/testsuite/gas/rx/satr.sm | 1 + gas/testsuite/gas/rx/sbb.d | 40 + gas/testsuite/gas/rx/sbb.sm | 5 + gas/testsuite/gas/rx/sccnd.d | 368 + gas/testsuite/gas/rx/sccnd.sm | 3 + gas/testsuite/gas/rx/scmpu.d | 9 + gas/testsuite/gas/rx/scmpu.sm | 1 + gas/testsuite/gas/rx/setpsw.d | 14 + gas/testsuite/gas/rx/setpsw.sm | 1 + gas/testsuite/gas/rx/shar.d | 24 + gas/testsuite/gas/rx/shar.sm | 3 + gas/testsuite/gas/rx/shll.d | 24 + gas/testsuite/gas/rx/shll.sm | 3 + gas/testsuite/gas/rx/shlr.d | 24 + gas/testsuite/gas/rx/shlr.sm | 3 + gas/testsuite/gas/rx/smovb.d | 9 + gas/testsuite/gas/rx/smovb.sm | 1 + gas/testsuite/gas/rx/smovf.d | 9 + gas/testsuite/gas/rx/smovf.sm | 1 + gas/testsuite/gas/rx/smovu.d | 9 + gas/testsuite/gas/rx/smovu.sm | 1 + gas/testsuite/gas/rx/sstr.d | 11 + gas/testsuite/gas/rx/sstr.sm | 1 + gas/testsuite/gas/rx/stnz.d | 24 + gas/testsuite/gas/rx/stnz.sm | 1 + gas/testsuite/gas/rx/stz.d | 24 + gas/testsuite/gas/rx/stz.sm | 1 + gas/testsuite/gas/rx/sub.d | 84 + gas/testsuite/gas/rx/sub.sm | 6 + gas/testsuite/gas/rx/suntil.d | 11 + gas/testsuite/gas/rx/suntil.sm | 1 + gas/testsuite/gas/rx/swhile.d | 11 + gas/testsuite/gas/rx/swhile.sm | 1 + gas/testsuite/gas/rx/tst.d | 88 + gas/testsuite/gas/rx/tst.sm | 4 + gas/testsuite/gas/rx/wait.d | 9 + gas/testsuite/gas/rx/wait.sm | 1 + gas/testsuite/gas/rx/xchg.d | 72 + gas/testsuite/gas/rx/xchg.sm | 2 + gas/testsuite/gas/rx/xor.d | 88 + gas/testsuite/gas/rx/xor.sm | 4 + include/ChangeLog | 4 + include/dis-asm.h | 1 + include/elf/ChangeLog | 4 + include/elf/rx.h | 134 + include/opcode/ChangeLog | 4 + include/opcode/rx.h | 218 + ld/ChangeLog | 9 + ld/Makefile.am | 5 + ld/Makefile.in | 6 + ld/NEWS | 2 + ld/configure.tgt | 1 + ld/emulparams/elf32rx.sh | 32 + ld/emultempl/rxelf.em | 64 + opcodes/ChangeLog | 12 + opcodes/Makefile.am | 10 + opcodes/Makefile.in | 12 + opcodes/configure | 1 + opcodes/configure.in | 1 + opcodes/disassemble.c | 6 + opcodes/opc2c.c | 810 ++ opcodes/rx-decode.c | 14814 +++++++++++++++++++++++++++++++++ opcodes/rx-decode.opc | 977 +++ opcodes/rx-dis.c | 199 + 266 files changed, 30415 insertions(+), 7 deletions(-) create mode 100644 bfd/cpu-rx.c create mode 100644 bfd/elf32-rx.c create mode 100644 gas/config/rx-defs.h create mode 100644 gas/config/rx-parse.y create mode 100644 gas/config/tc-rx.c create mode 100644 gas/config/tc-rx.h create mode 100644 gas/doc/c-rx.texi create mode 100644 gas/testsuite/gas/elf/section2.e-rx create mode 100644 gas/testsuite/gas/rx/abs.d create mode 100644 gas/testsuite/gas/rx/abs.sm create mode 100644 gas/testsuite/gas/rx/adc.d create mode 100644 gas/testsuite/gas/rx/adc.sm create mode 100644 gas/testsuite/gas/rx/add.d create mode 100644 gas/testsuite/gas/rx/add.sm create mode 100644 gas/testsuite/gas/rx/and.d create mode 100644 gas/testsuite/gas/rx/and.sm create mode 100644 gas/testsuite/gas/rx/bclr.d create mode 100644 gas/testsuite/gas/rx/bclr.sm create mode 100644 gas/testsuite/gas/rx/bcnd.d create mode 100644 gas/testsuite/gas/rx/bcnd.sm create mode 100644 gas/testsuite/gas/rx/bmcnd.d create mode 100644 gas/testsuite/gas/rx/bmcnd.sm create mode 100644 gas/testsuite/gas/rx/bnot.d create mode 100644 gas/testsuite/gas/rx/bnot.sm create mode 100644 gas/testsuite/gas/rx/bra.d create mode 100644 gas/testsuite/gas/rx/bra.sm create mode 100644 gas/testsuite/gas/rx/brk.d create mode 100644 gas/testsuite/gas/rx/brk.sm create mode 100644 gas/testsuite/gas/rx/bset.d create mode 100644 gas/testsuite/gas/rx/bset.sm create mode 100644 gas/testsuite/gas/rx/bsr.d create mode 100644 gas/testsuite/gas/rx/bsr.sm create mode 100644 gas/testsuite/gas/rx/btst.d create mode 100644 gas/testsuite/gas/rx/btst.sm create mode 100644 gas/testsuite/gas/rx/clrpsw.d create mode 100644 gas/testsuite/gas/rx/clrpsw.sm create mode 100644 gas/testsuite/gas/rx/cmp.d create mode 100644 gas/testsuite/gas/rx/cmp.sm create mode 100644 gas/testsuite/gas/rx/dbt.d create mode 100644 gas/testsuite/gas/rx/dbt.sm create mode 100644 gas/testsuite/gas/rx/div.d create mode 100644 gas/testsuite/gas/rx/div.sm create mode 100644 gas/testsuite/gas/rx/divu.d create mode 100644 gas/testsuite/gas/rx/divu.sm create mode 100644 gas/testsuite/gas/rx/emul.d create mode 100644 gas/testsuite/gas/rx/emul.sm create mode 100644 gas/testsuite/gas/rx/emulu.d create mode 100644 gas/testsuite/gas/rx/emulu.sm create mode 100755 gas/testsuite/gas/rx/explode create mode 100644 gas/testsuite/gas/rx/fadd.d create mode 100644 gas/testsuite/gas/rx/fadd.sm create mode 100644 gas/testsuite/gas/rx/fcmp.d create mode 100644 gas/testsuite/gas/rx/fcmp.sm create mode 100644 gas/testsuite/gas/rx/fdiv.d create mode 100644 gas/testsuite/gas/rx/fdiv.sm create mode 100644 gas/testsuite/gas/rx/fmul.d create mode 100644 gas/testsuite/gas/rx/fmul.sm create mode 100644 gas/testsuite/gas/rx/fsub.d create mode 100644 gas/testsuite/gas/rx/fsub.sm create mode 100644 gas/testsuite/gas/rx/ftoi.d create mode 100644 gas/testsuite/gas/rx/ftoi.sm create mode 100644 gas/testsuite/gas/rx/gprel.d create mode 100644 gas/testsuite/gas/rx/gprel.sm create mode 100644 gas/testsuite/gas/rx/int.d create mode 100644 gas/testsuite/gas/rx/int.sm create mode 100644 gas/testsuite/gas/rx/itof.d create mode 100644 gas/testsuite/gas/rx/itof.sm create mode 100644 gas/testsuite/gas/rx/jmp.d create mode 100644 gas/testsuite/gas/rx/jmp.sm create mode 100644 gas/testsuite/gas/rx/jsr.d create mode 100644 gas/testsuite/gas/rx/jsr.sm create mode 100644 gas/testsuite/gas/rx/machi.d create mode 100644 gas/testsuite/gas/rx/machi.sm create mode 100644 gas/testsuite/gas/rx/maclo.d create mode 100644 gas/testsuite/gas/rx/maclo.sm create mode 100644 gas/testsuite/gas/rx/macros.inc create mode 100755 gas/testsuite/gas/rx/make-d create mode 100644 gas/testsuite/gas/rx/max.d create mode 100644 gas/testsuite/gas/rx/max.sm create mode 100644 gas/testsuite/gas/rx/min.d create mode 100644 gas/testsuite/gas/rx/min.sm create mode 100644 gas/testsuite/gas/rx/mov.d create mode 100644 gas/testsuite/gas/rx/mov.sm create mode 100644 gas/testsuite/gas/rx/movu.d create mode 100644 gas/testsuite/gas/rx/movu.sm create mode 100644 gas/testsuite/gas/rx/mul.d create mode 100644 gas/testsuite/gas/rx/mul.sm create mode 100644 gas/testsuite/gas/rx/mulhi.d create mode 100644 gas/testsuite/gas/rx/mulhi.sm create mode 100644 gas/testsuite/gas/rx/mullo.d create mode 100644 gas/testsuite/gas/rx/mullo.sm create mode 100644 gas/testsuite/gas/rx/mvfachi.d create mode 100644 gas/testsuite/gas/rx/mvfachi.sm create mode 100644 gas/testsuite/gas/rx/mvfaclo.d create mode 100644 gas/testsuite/gas/rx/mvfaclo.sm create mode 100644 gas/testsuite/gas/rx/mvfacmi.d create mode 100644 gas/testsuite/gas/rx/mvfacmi.sm create mode 100644 gas/testsuite/gas/rx/mvfc.d create mode 100644 gas/testsuite/gas/rx/mvfc.sm create mode 100644 gas/testsuite/gas/rx/mvfcp.d create mode 100644 gas/testsuite/gas/rx/mvfcp.sm create mode 100644 gas/testsuite/gas/rx/mvtachi.d create mode 100644 gas/testsuite/gas/rx/mvtachi.sm create mode 100644 gas/testsuite/gas/rx/mvtaclo.d create mode 100644 gas/testsuite/gas/rx/mvtaclo.sm create mode 100644 gas/testsuite/gas/rx/mvtc.d create mode 100644 gas/testsuite/gas/rx/mvtc.sm create mode 100644 gas/testsuite/gas/rx/mvtcp.d create mode 100644 gas/testsuite/gas/rx/mvtcp.sm create mode 100644 gas/testsuite/gas/rx/neg.d create mode 100644 gas/testsuite/gas/rx/neg.sm create mode 100644 gas/testsuite/gas/rx/nop.d create mode 100644 gas/testsuite/gas/rx/nop.sm create mode 100644 gas/testsuite/gas/rx/not.d create mode 100644 gas/testsuite/gas/rx/not.sm create mode 100644 gas/testsuite/gas/rx/opecp.d create mode 100644 gas/testsuite/gas/rx/opecp.sm create mode 100644 gas/testsuite/gas/rx/or.d create mode 100644 gas/testsuite/gas/rx/or.sm create mode 100644 gas/testsuite/gas/rx/pop.d create mode 100644 gas/testsuite/gas/rx/pop.sm create mode 100644 gas/testsuite/gas/rx/popc.d create mode 100644 gas/testsuite/gas/rx/popc.sm create mode 100644 gas/testsuite/gas/rx/popm.d create mode 100644 gas/testsuite/gas/rx/popm.sm create mode 100644 gas/testsuite/gas/rx/push.d create mode 100644 gas/testsuite/gas/rx/push.sm create mode 100644 gas/testsuite/gas/rx/pushc.d create mode 100644 gas/testsuite/gas/rx/pushc.sm create mode 100644 gas/testsuite/gas/rx/pushm.d create mode 100644 gas/testsuite/gas/rx/pushm.sm create mode 100644 gas/testsuite/gas/rx/r-bcc.d create mode 100644 gas/testsuite/gas/rx/r-bcc.sm create mode 100644 gas/testsuite/gas/rx/r-bra.d create mode 100644 gas/testsuite/gas/rx/r-bra.sm create mode 100644 gas/testsuite/gas/rx/racw.d create mode 100644 gas/testsuite/gas/rx/racw.sm create mode 100644 gas/testsuite/gas/rx/revl.d create mode 100644 gas/testsuite/gas/rx/revl.sm create mode 100644 gas/testsuite/gas/rx/revw.d create mode 100644 gas/testsuite/gas/rx/revw.sm create mode 100644 gas/testsuite/gas/rx/rmpa.d create mode 100644 gas/testsuite/gas/rx/rmpa.sm create mode 100644 gas/testsuite/gas/rx/rolc.d create mode 100644 gas/testsuite/gas/rx/rolc.sm create mode 100644 gas/testsuite/gas/rx/rorc.d create mode 100644 gas/testsuite/gas/rx/rorc.sm create mode 100644 gas/testsuite/gas/rx/rotl.d create mode 100644 gas/testsuite/gas/rx/rotl.sm create mode 100644 gas/testsuite/gas/rx/rotr.d create mode 100644 gas/testsuite/gas/rx/rotr.sm create mode 100644 gas/testsuite/gas/rx/round.d create mode 100644 gas/testsuite/gas/rx/round.sm create mode 100644 gas/testsuite/gas/rx/rte.d create mode 100644 gas/testsuite/gas/rx/rte.sm create mode 100644 gas/testsuite/gas/rx/rtfi.d create mode 100644 gas/testsuite/gas/rx/rtfi.sm create mode 100644 gas/testsuite/gas/rx/rts.d create mode 100644 gas/testsuite/gas/rx/rts.sm create mode 100644 gas/testsuite/gas/rx/rtsd.d create mode 100644 gas/testsuite/gas/rx/rtsd.sm create mode 100644 gas/testsuite/gas/rx/rx-asm-bad.l create mode 100644 gas/testsuite/gas/rx/rx-asm-bad.s create mode 100644 gas/testsuite/gas/rx/rx-asm-good.d create mode 100644 gas/testsuite/gas/rx/rx-asm-good.inc create mode 100644 gas/testsuite/gas/rx/rx-asm-good.s create mode 100644 gas/testsuite/gas/rx/rx.exp create mode 100644 gas/testsuite/gas/rx/sat.d create mode 100644 gas/testsuite/gas/rx/sat.sm create mode 100644 gas/testsuite/gas/rx/satr.d create mode 100644 gas/testsuite/gas/rx/satr.sm create mode 100644 gas/testsuite/gas/rx/sbb.d create mode 100644 gas/testsuite/gas/rx/sbb.sm create mode 100644 gas/testsuite/gas/rx/sccnd.d create mode 100644 gas/testsuite/gas/rx/sccnd.sm create mode 100644 gas/testsuite/gas/rx/scmpu.d create mode 100644 gas/testsuite/gas/rx/scmpu.sm create mode 100644 gas/testsuite/gas/rx/setpsw.d create mode 100644 gas/testsuite/gas/rx/setpsw.sm create mode 100644 gas/testsuite/gas/rx/shar.d create mode 100644 gas/testsuite/gas/rx/shar.sm create mode 100644 gas/testsuite/gas/rx/shll.d create mode 100644 gas/testsuite/gas/rx/shll.sm create mode 100644 gas/testsuite/gas/rx/shlr.d create mode 100644 gas/testsuite/gas/rx/shlr.sm create mode 100644 gas/testsuite/gas/rx/smovb.d create mode 100644 gas/testsuite/gas/rx/smovb.sm create mode 100644 gas/testsuite/gas/rx/smovf.d create mode 100644 gas/testsuite/gas/rx/smovf.sm create mode 100644 gas/testsuite/gas/rx/smovu.d create mode 100644 gas/testsuite/gas/rx/smovu.sm create mode 100644 gas/testsuite/gas/rx/sstr.d create mode 100644 gas/testsuite/gas/rx/sstr.sm create mode 100644 gas/testsuite/gas/rx/stnz.d create mode 100644 gas/testsuite/gas/rx/stnz.sm create mode 100644 gas/testsuite/gas/rx/stz.d create mode 100644 gas/testsuite/gas/rx/stz.sm create mode 100644 gas/testsuite/gas/rx/sub.d create mode 100644 gas/testsuite/gas/rx/sub.sm create mode 100644 gas/testsuite/gas/rx/suntil.d create mode 100644 gas/testsuite/gas/rx/suntil.sm create mode 100644 gas/testsuite/gas/rx/swhile.d create mode 100644 gas/testsuite/gas/rx/swhile.sm create mode 100644 gas/testsuite/gas/rx/tst.d create mode 100644 gas/testsuite/gas/rx/tst.sm create mode 100644 gas/testsuite/gas/rx/wait.d create mode 100644 gas/testsuite/gas/rx/wait.sm create mode 100644 gas/testsuite/gas/rx/xchg.d create mode 100644 gas/testsuite/gas/rx/xchg.sm create mode 100644 gas/testsuite/gas/rx/xor.d create mode 100644 gas/testsuite/gas/rx/xor.sm create mode 100644 include/elf/rx.h create mode 100644 include/opcode/rx.h create mode 100644 ld/emulparams/elf32rx.sh create mode 100644 ld/emultempl/rxelf.em create mode 100644 opcodes/opc2c.c create mode 100644 opcodes/rx-decode.c create mode 100644 opcodes/rx-decode.opc create mode 100644 opcodes/rx-dis.c diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 4ee8731..ba923a5 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,24 @@ +2009-09-29 DJ Delorie + + * Makefile.am (ALL_MACHINES): Add cpu-rx.lo. + (ALL_MACHINES_CFILES): Add cpu-rx.c. + (BFD32_BACKENDS): Add elf32-rx.lo. + (BFD32_BACKENDS_CFILES): Add elf32-rx.c. + * archures.c (bfd_architecture): Add bfd_arch_rx and bfd_mach_rx. + Export bfd_rx_arch. + (bfd_archures_list): Add bfd_rx_arch. + * config.bfd: Add entry for rx-*-elf. + * configure.in: Add entries for bfd_elf32_rx_le_vec and + bfd_elf32_rx_be_vec. + * reloc.c: Add RX relocations. + * targets.c: Add RX target vectors. + * Makefile.in: Regenerate. + * bfd-in2.h: Regenerate. + * configure: Regenerate. + * libbfd.h: Regenerate. + * cpu-rx.c: New file. + * elf32-rx.c: New file. + 2009-09-29 M R Swami Reddy * elf32-cr16.c (elf32_cr16_relocate_section): Removed diff --git a/bfd/Makefile.am b/bfd/Makefile.am index 13ace29..b569f84 100644 --- a/bfd/Makefile.am +++ b/bfd/Makefile.am @@ -120,6 +120,7 @@ ALL_MACHINES = \ cpu-plugin.lo \ cpu-powerpc.lo \ cpu-rs6000.lo \ + cpu-rx.lo \ cpu-s390.lo \ cpu-score.lo \ cpu-sh.lo \ @@ -191,6 +192,7 @@ ALL_MACHINES_CFILES = \ cpu-plugin.c \ cpu-powerpc.c \ cpu-rs6000.c \ + cpu-rx.c \ cpu-s390.c \ cpu-score.c \ cpu-sh.c \ @@ -307,6 +309,7 @@ BFD32_BACKENDS = \ elf32-or32.lo \ elf32-pj.lo \ elf32-ppc.lo \ + elf32-rx.lo \ elf32-s390.lo \ elf32-sh-symbian.lo \ elf32-sh.lo \ @@ -490,6 +493,7 @@ BFD32_BACKENDS_CFILES = \ elf32-or32.c \ elf32-pj.c \ elf32-ppc.c \ + elf32-rx.c \ elf32-s390.c \ elf32-sh-symbian.c \ elf32-sh.c \ diff --git a/bfd/Makefile.in b/bfd/Makefile.in index 721069f..5700ed3 100644 --- a/bfd/Makefile.in +++ b/bfd/Makefile.in @@ -415,6 +415,7 @@ ALL_MACHINES = \ cpu-plugin.lo \ cpu-powerpc.lo \ cpu-rs6000.lo \ + cpu-rx.lo \ cpu-s390.lo \ cpu-score.lo \ cpu-sh.lo \ @@ -486,6 +487,7 @@ ALL_MACHINES_CFILES = \ cpu-plugin.c \ cpu-powerpc.c \ cpu-rs6000.c \ + cpu-rx.c \ cpu-s390.c \ cpu-score.c \ cpu-sh.c \ @@ -603,6 +605,7 @@ BFD32_BACKENDS = \ elf32-or32.lo \ elf32-pj.lo \ elf32-ppc.lo \ + elf32-rx.lo \ elf32-s390.lo \ elf32-sh-symbian.lo \ elf32-sh.lo \ @@ -786,6 +789,7 @@ BFD32_BACKENDS_CFILES = \ elf32-or32.c \ elf32-pj.c \ elf32-ppc.c \ + elf32-rx.c \ elf32-s390.c \ elf32-sh-symbian.c \ elf32-sh.c \ @@ -1271,6 +1275,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-plugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-powerpc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-rs6000.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-rx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-s390.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-score.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-sh.Plo@am__quote@ @@ -1345,6 +1350,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-or32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-pj.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-ppc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-rx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-s390.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-score.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-score7.Plo@am__quote@ diff --git a/bfd/archures.c b/bfd/archures.c index df73b3f..8df2ce1 100644 --- a/bfd/archures.c +++ b/bfd/archures.c @@ -380,6 +380,8 @@ DESCRIPTION .#define bfd_mach_cris_v0_v10 255 .#define bfd_mach_cris_v32 32 .#define bfd_mach_cris_v10_v32 1032 +. bfd_arch_rx, {* Renesas RX. *} +.#define bfd_mach_rx 0x75 . bfd_arch_s390, {* IBM s390 *} .#define bfd_mach_s390_31 31 .#define bfd_mach_s390_64 64 @@ -513,6 +515,7 @@ extern const bfd_arch_info_type bfd_plugin_arch; extern const bfd_arch_info_type bfd_powerpc_archs[]; #define bfd_powerpc_arch bfd_powerpc_archs[0] extern const bfd_arch_info_type bfd_rs6000_arch; +extern const bfd_arch_info_type bfd_rx_arch; extern const bfd_arch_info_type bfd_s390_arch; extern const bfd_arch_info_type bfd_score_arch; extern const bfd_arch_info_type bfd_sh_arch; @@ -586,6 +589,7 @@ static const bfd_arch_info_type * const bfd_archures_list[] = &bfd_pdp11_arch, &bfd_powerpc_arch, &bfd_rs6000_arch, + &bfd_rx_arch, &bfd_s390_arch, &bfd_score_arch, &bfd_sh_arch, diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index b5fceb7..263e0f5 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -2047,6 +2047,8 @@ enum bfd_architecture #define bfd_mach_cris_v0_v10 255 #define bfd_mach_cris_v32 32 #define bfd_mach_cris_v10_v32 1032 + bfd_arch_rx, /* Renesas RX. */ +#define bfd_mach_rx 0x75 bfd_arch_s390, /* IBM s390 */ #define bfd_mach_s390_31 31 #define bfd_mach_s390_64 64 @@ -3844,6 +3846,32 @@ instructions */ instructions */ BFD_RELOC_AVR_6_ADIW, +/* Renesas RX Relocations. */ + BFD_RELOC_RX_NEG8, + BFD_RELOC_RX_NEG16, + BFD_RELOC_RX_NEG24, + BFD_RELOC_RX_NEG32, + BFD_RELOC_RX_16_OP, + BFD_RELOC_RX_24_OP, + BFD_RELOC_RX_32_OP, + BFD_RELOC_RX_8U, + BFD_RELOC_RX_16U, + BFD_RELOC_RX_24U, + BFD_RELOC_RX_DIR3U_PCREL, + BFD_RELOC_RX_DIFF, + BFD_RELOC_RX_GPRELB, + BFD_RELOC_RX_GPRELW, + BFD_RELOC_RX_GPRELL, + BFD_RELOC_RX_SYM, + BFD_RELOC_RX_OP_SUBTRACT, + BFD_RELOC_RX_ABS8, + BFD_RELOC_RX_ABS16, + BFD_RELOC_RX_ABS32, + BFD_RELOC_RX_ABS16U, + BFD_RELOC_RX_ABS16UW, + BFD_RELOC_RX_ABS16UL, + BFD_RELOC_RX_RELAX, + /* Direct 12 bit. */ BFD_RELOC_390_12, diff --git a/bfd/config.bfd b/bfd/config.bfd index e340251..89b664c 100644 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -1191,6 +1191,11 @@ case "${targ}" in targ_selvecs="bfd_powerpcle_pei_vec bfd_powerpc_pei_vec bfd_powerpcle_pe_vec bfd_powerpc_pe_vec" ;; + rx-*-elf) + targ_defvec=bfd_elf32_rx_le_vec + targ_selvecs="bfd_elf32_rx_be_vec bfd_elf32_rx_le_vec" + ;; + s390-*-linux*) targ_defvec=bfd_elf32_s390_vec targ64_selvecs=bfd_elf64_s390_vec diff --git a/bfd/configure b/bfd/configure index 865ef69..d5aec74 100755 --- a/bfd/configure +++ b/bfd/configure @@ -14868,6 +14868,8 @@ do bfd_elf32_powerpc_vec) tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;; bfd_elf32_powerpcle_vec) tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;; bfd_elf32_powerpc_vxworks_vec) tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;; + bfd_elf32_rx_le_vec) tb="$tb elf32-rx.lo elf32.lo $elf" ;; + bfd_elf32_rx_be_vec) tb="$tb elf32-rx.lo elf32.lo $elf" ;; bfd_elf32_s390_vec) tb="$tb elf32-s390.lo elf32.lo $elf" ;; bfd_elf32_bigscore_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo $elf"; want64=true; target_size=64;; bfd_elf32_littlescore_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo $elf"; want64=true; target_size=64;; diff --git a/bfd/configure.in b/bfd/configure.in index bf4dc6c..7ca59b0 100644 --- a/bfd/configure.in +++ b/bfd/configure.in @@ -756,6 +756,8 @@ do bfd_elf32_powerpc_vec) tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;; bfd_elf32_powerpcle_vec) tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;; bfd_elf32_powerpc_vxworks_vec) tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;; + bfd_elf32_rx_le_vec) tb="$tb elf32-rx.lo elf32.lo $elf" ;; + bfd_elf32_rx_be_vec) tb="$tb elf32-rx.lo elf32.lo $elf" ;; bfd_elf32_s390_vec) tb="$tb elf32-s390.lo elf32.lo $elf" ;; bfd_elf32_bigscore_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo $elf"; want64=true; target_size=64;; bfd_elf32_littlescore_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo $elf"; want64=true; target_size=64;; diff --git a/bfd/cpu-rx.c b/bfd/cpu-rx.c new file mode 100644 index 0000000..92eebb0 --- /dev/null +++ b/bfd/cpu-rx.c @@ -0,0 +1,57 @@ +/* BFD support for the RX processor. + Copyright (C) 2008, 2009 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#include "sysdep.h" +#include "bfd.h" +#include "libbfd.h" + +static const bfd_arch_info_type arch_info_struct[] = +{ + { + 32, /* Bits per word. */ + 32, /* Bits per address. */ + 8, /* Bits per byte. */ + bfd_arch_rx, /* Architecture. */ + bfd_mach_rx, /* Machine. */ + "rx", /* Architecture name. */ + "rx", /* Printable name. */ + 3, /* Section align power. */ + FALSE, /* The default ? */ + bfd_default_compatible, /* Architecture comparison fn. */ + bfd_default_scan, /* String to architecture convert fn. */ + NULL /* Next in list. */ + }, +}; + +const bfd_arch_info_type bfd_rx_arch = +{ + 32, /* Bits per word. */ + 32, /* Bits per address. */ + 8, /* Bits per byte. */ + bfd_arch_rx, /* Architecture. */ + bfd_mach_rx, /* Machine. */ + "rx", /* Architecture name. */ + "rx", /* Printable name. */ + 4, /* Section align power. */ + TRUE, /* The default ? */ + bfd_default_compatible, /* Architecture comparison fn. */ + bfd_default_scan, /* String to architecture convert fn. */ + & arch_info_struct[0], /* Next in list. */ +}; diff --git a/bfd/elf32-rx.c b/bfd/elf32-rx.c new file mode 100644 index 0000000..dadd407 --- /dev/null +++ b/bfd/elf32-rx.c @@ -0,0 +1,3402 @@ +/* Renesas RX specific support for 32-bit ELF. + Copyright (C) 2008, 2009 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "sysdep.h" +#include "bfd.h" +#include "libbfd.h" +#include "elf-bfd.h" +#include "elf/rx.h" +#include "libiberty.h" + +#define RX_OPCODE_BIG_ENDIAN 0 + +#ifdef DEBUG +char * rx_get_reloc (long); +void dump_symtab (bfd *, void *, void *); +#endif + +#define RXREL(n,sz,bit,shift,complain,pcrel) \ + HOWTO (R_RX_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \ + bfd_elf_generic_reloc, "R_RX_" #n, FALSE, 0, ~0, FALSE) + +/* Note that the relocations around 0x7f are internal to this file; + feel free to move them as needed to avoid conflicts with published + relocation numbers. */ + +static reloc_howto_type rx_elf_howto_table [] = +{ + RXREL (NONE, 0, 0, 0, dont, FALSE), + RXREL (DIR32, 2, 32, 0, signed, FALSE), + RXREL (DIR24S, 2, 24, 0, signed, FALSE), + RXREL (DIR16, 1, 16, 0, dont, FALSE), + RXREL (DIR16U, 1, 16, 0, unsigned, FALSE), + RXREL (DIR16S, 1, 16, 0, signed, FALSE), + RXREL (DIR8, 0, 8, 0, dont, FALSE), + RXREL (DIR8U, 0, 8, 0, unsigned, FALSE), + RXREL (DIR8S, 0, 8, 0, signed, FALSE), + RXREL (DIR24S_PCREL, 2, 24, 0, signed, TRUE), + RXREL (DIR16S_PCREL, 1, 16, 0, signed, TRUE), + RXREL (DIR8S_PCREL, 0, 8, 0, signed, TRUE), + RXREL (DIR16UL, 1, 16, 2, unsigned, FALSE), + RXREL (DIR16UW, 1, 16, 1, unsigned, FALSE), + RXREL (DIR8UL, 0, 8, 2, unsigned, FALSE), + RXREL (DIR8UW, 0, 8, 1, unsigned, FALSE), + RXREL (DIR32_REV, 1, 16, 0, dont, FALSE), + RXREL (DIR16_REV, 1, 16, 0, dont, FALSE), + RXREL (DIR3U_PCREL, 0, 3, 0, dont, TRUE), + + EMPTY_HOWTO (0x13), + EMPTY_HOWTO (0x14), + EMPTY_HOWTO (0x15), + EMPTY_HOWTO (0x16), + EMPTY_HOWTO (0x17), + EMPTY_HOWTO (0x18), + EMPTY_HOWTO (0x19), + EMPTY_HOWTO (0x1a), + EMPTY_HOWTO (0x1b), + EMPTY_HOWTO (0x1c), + EMPTY_HOWTO (0x1d), + EMPTY_HOWTO (0x1e), + EMPTY_HOWTO (0x1f), + + RXREL (RH_3_PCREL, 0, 3, 0, signed, TRUE), + RXREL (RH_16_OP, 1, 16, 0, signed, FALSE), + RXREL (RH_24_OP, 2, 24, 0, signed, FALSE), + RXREL (RH_32_OP, 2, 32, 0, signed, FALSE), + RXREL (RH_24_UNS, 2, 24, 0, unsigned, FALSE), + RXREL (RH_8_NEG, 0, 8, 0, signed, FALSE), + RXREL (RH_16_NEG, 1, 16, 0, signed, FALSE), + RXREL (RH_24_NEG, 2, 24, 0, signed, FALSE), + RXREL (RH_32_NEG, 2, 32, 0, signed, FALSE), + RXREL (RH_DIFF, 2, 32, 0, signed, FALSE), + RXREL (RH_GPRELB, 1, 16, 0, unsigned, FALSE), + RXREL (RH_GPRELW, 1, 16, 0, unsigned, FALSE), + RXREL (RH_GPRELL, 1, 16, 0, unsigned, FALSE), + RXREL (RH_RELAX, 0, 0, 0, dont, FALSE), + + EMPTY_HOWTO (0x2e), + EMPTY_HOWTO (0x2f), + EMPTY_HOWTO (0x30), + EMPTY_HOWTO (0x31), + EMPTY_HOWTO (0x32), + EMPTY_HOWTO (0x33), + EMPTY_HOWTO (0x34), + EMPTY_HOWTO (0x35), + EMPTY_HOWTO (0x36), + EMPTY_HOWTO (0x37), + EMPTY_HOWTO (0x38), + EMPTY_HOWTO (0x39), + EMPTY_HOWTO (0x3a), + EMPTY_HOWTO (0x3b), + EMPTY_HOWTO (0x3c), + EMPTY_HOWTO (0x3d), + EMPTY_HOWTO (0x3e), + EMPTY_HOWTO (0x3f), + EMPTY_HOWTO (0x40), + + RXREL (ABS32, 2, 32, 0, dont, FALSE), + RXREL (ABS24S, 2, 24, 0, signed, FALSE), + RXREL (ABS16, 1, 16, 0, dont, FALSE), + RXREL (ABS16U, 1, 16, 0, unsigned, FALSE), + RXREL (ABS16S, 1, 16, 0, signed, FALSE), + RXREL (ABS8, 0, 8, 0, dont, FALSE), + RXREL (ABS8U, 0, 8, 0, unsigned, FALSE), + RXREL (ABS8S, 0, 8, 0, signed, FALSE), + RXREL (ABS24S_PCREL, 2, 24, 0, signed, TRUE), + RXREL (ABS16S_PCREL, 1, 16, 0, signed, TRUE), + RXREL (ABS8S_PCREL, 0, 8, 0, signed, TRUE), + RXREL (ABS16UL, 1, 16, 0, unsigned, FALSE), + RXREL (ABS16UW, 1, 16, 0, unsigned, FALSE), + RXREL (ABS8UL, 0, 8, 0, unsigned, FALSE), + RXREL (ABS8UW, 0, 8, 0, unsigned, FALSE), + RXREL (ABS32_REV, 2, 32, 0, dont, FALSE), + RXREL (ABS16_REV, 1, 16, 0, dont, FALSE), + +#define STACK_REL_P(x) ((x) <= R_RX_ABS16_REV && (x) >= R_RX_ABS32) + + EMPTY_HOWTO (0x52), + EMPTY_HOWTO (0x53), + EMPTY_HOWTO (0x54), + EMPTY_HOWTO (0x55), + EMPTY_HOWTO (0x56), + EMPTY_HOWTO (0x57), + EMPTY_HOWTO (0x58), + EMPTY_HOWTO (0x59), + EMPTY_HOWTO (0x5a), + EMPTY_HOWTO (0x5b), + EMPTY_HOWTO (0x5c), + EMPTY_HOWTO (0x5d), + EMPTY_HOWTO (0x5e), + EMPTY_HOWTO (0x5f), + EMPTY_HOWTO (0x60), + EMPTY_HOWTO (0x61), + EMPTY_HOWTO (0x62), + EMPTY_HOWTO (0x63), + EMPTY_HOWTO (0x64), + EMPTY_HOWTO (0x65), + EMPTY_HOWTO (0x66), + EMPTY_HOWTO (0x67), + EMPTY_HOWTO (0x68), + EMPTY_HOWTO (0x69), + EMPTY_HOWTO (0x6a), + EMPTY_HOWTO (0x6b), + EMPTY_HOWTO (0x6c), + EMPTY_HOWTO (0x6d), + EMPTY_HOWTO (0x6e), + EMPTY_HOWTO (0x6f), + EMPTY_HOWTO (0x70), + EMPTY_HOWTO (0x71), + EMPTY_HOWTO (0x72), + EMPTY_HOWTO (0x73), + EMPTY_HOWTO (0x74), + EMPTY_HOWTO (0x75), + EMPTY_HOWTO (0x76), + EMPTY_HOWTO (0x77), + + /* These are internal. */ + /* A 5-bit unsigned displacement to a B/W/L address, at bit position 8/12. */ + /* ---- ---- 4--- 3210. */ +#define R_RX_RH_ABS5p8B 0x78 + RXREL (RH_ABS5p8B, 0, 0, 0, dont, FALSE), +#define R_RX_RH_ABS5p8W 0x79 + RXREL (RH_ABS5p8W, 0, 0, 0, dont, FALSE), +#define R_RX_RH_ABS5p8L 0x7a + RXREL (RH_ABS5p8L, 0, 0, 0, dont, FALSE), + /* A 5-bit unsigned displacement to a B/W/L address, at bit position 5/12. */ + /* ---- -432 1--- 0---. */ +#define R_RX_RH_ABS5p5B 0x7b + RXREL (RH_ABS5p5B, 0, 0, 0, dont, FALSE), +#define R_RX_RH_ABS5p5W 0x7c + RXREL (RH_ABS5p5W, 0, 0, 0, dont, FALSE), +#define R_RX_RH_ABS5p5L 0x7d + RXREL (RH_ABS5p5L, 0, 0, 0, dont, FALSE), + /* A 4-bit unsigned immediate at bit position 8. */ +#define R_RX_RH_UIMM4p8 0x7e + RXREL (RH_UIMM4p8, 0, 0, 0, dont, FALSE), + /* A 4-bit negative unsigned immediate at bit position 8. */ +#define R_RX_RH_UNEG4p8 0x7f + RXREL (RH_UNEG4p8, 0, 0, 0, dont, FALSE), + /* End of internal relocs. */ + + RXREL (SYM, 2, 32, 0, dont, FALSE), + RXREL (OPneg, 2, 32, 0, dont, FALSE), + RXREL (OPadd, 2, 32, 0, dont, FALSE), + RXREL (OPsub, 2, 32, 0, dont, FALSE), + RXREL (OPmul, 2, 32, 0, dont, FALSE), + RXREL (OPdiv, 2, 32, 0, dont, FALSE), + RXREL (OPshla, 2, 32, 0, dont, FALSE), + RXREL (OPshra, 2, 32, 0, dont, FALSE), + RXREL (OPsctsize, 2, 32, 0, dont, FALSE), + RXREL (OPscttop, 2, 32, 0, dont, FALSE), + RXREL (OPand, 2, 32, 0, dont, FALSE), + RXREL (OPor, 2, 32, 0, dont, FALSE), + RXREL (OPxor, 2, 32, 0, dont, FALSE), + RXREL (OPnot, 2, 32, 0, dont, FALSE), + RXREL (OPmod, 2, 32, 0, dont, FALSE), + RXREL (OPromtop, 2, 32, 0, dont, FALSE), + RXREL (OPramtop, 2, 32, 0, dont, FALSE) +}; + +/* Map BFD reloc types to RX ELF reloc types. */ + +struct rx_reloc_map +{ + bfd_reloc_code_real_type bfd_reloc_val; + unsigned int rx_reloc_val; +}; + +static const struct rx_reloc_map rx_reloc_map [] = +{ + { BFD_RELOC_NONE, R_RX_NONE }, + { BFD_RELOC_8, R_RX_DIR8S }, + { BFD_RELOC_16, R_RX_DIR16S }, + { BFD_RELOC_24, R_RX_DIR24S }, + { BFD_RELOC_32, R_RX_DIR32 }, + { BFD_RELOC_RX_16_OP, R_RX_DIR16 }, + { BFD_RELOC_RX_DIR3U_PCREL, R_RX_DIR3U_PCREL }, + { BFD_RELOC_8_PCREL, R_RX_DIR8S_PCREL }, + { BFD_RELOC_16_PCREL, R_RX_DIR16S_PCREL }, + { BFD_RELOC_24_PCREL, R_RX_DIR24S_PCREL }, + { BFD_RELOC_RX_8U, R_RX_DIR8U }, + { BFD_RELOC_RX_16U, R_RX_DIR16U }, + { BFD_RELOC_RX_24U, R_RX_RH_24_UNS }, + { BFD_RELOC_RX_NEG8, R_RX_RH_8_NEG }, + { BFD_RELOC_RX_NEG16, R_RX_RH_16_NEG }, + { BFD_RELOC_RX_NEG24, R_RX_RH_24_NEG }, + { BFD_RELOC_RX_NEG32, R_RX_RH_32_NEG }, + { BFD_RELOC_RX_DIFF, R_RX_RH_DIFF }, + { BFD_RELOC_RX_GPRELB, R_RX_RH_GPRELB }, + { BFD_RELOC_RX_GPRELW, R_RX_RH_GPRELW }, + { BFD_RELOC_RX_GPRELL, R_RX_RH_GPRELL }, + { BFD_RELOC_RX_RELAX, R_RX_RH_RELAX }, + { BFD_RELOC_RX_SYM, R_RX_SYM }, + { BFD_RELOC_RX_OP_SUBTRACT, R_RX_OPsub }, + { BFD_RELOC_RX_ABS8, R_RX_ABS8 }, + { BFD_RELOC_RX_ABS16, R_RX_ABS16 }, + { BFD_RELOC_RX_ABS32, R_RX_ABS32 }, + { BFD_RELOC_RX_ABS16UL, R_RX_ABS16UL }, + { BFD_RELOC_RX_ABS16UW, R_RX_ABS16UW }, + { BFD_RELOC_RX_ABS16U, R_RX_ABS16U } +}; + +#define BIGE(abfd) ((abfd)->xvec->byteorder == BFD_ENDIAN_BIG) + +static reloc_howto_type * +rx_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, + bfd_reloc_code_real_type code) +{ + unsigned int i; + + if (code == BFD_RELOC_RX_32_OP) + return rx_elf_howto_table + R_RX_DIR32; + + for (i = ARRAY_SIZE (rx_reloc_map); --i;) + if (rx_reloc_map [i].bfd_reloc_val == code) + return rx_elf_howto_table + rx_reloc_map[i].rx_reloc_val; + + return NULL; +} + +static reloc_howto_type * +rx_reloc_name_lookup (bfd * abfd ATTRIBUTE_UNUSED, const char * r_name) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE (rx_elf_howto_table); i++) + if (rx_elf_howto_table[i].name != NULL + && strcasecmp (rx_elf_howto_table[i].name, r_name) == 0) + return rx_elf_howto_table + i; + + return NULL; +} + +/* Set the howto pointer for an RX ELF reloc. */ + +static void +rx_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED, + arelent * cache_ptr, + Elf_Internal_Rela * dst) +{ + unsigned int r_type; + + r_type = ELF32_R_TYPE (dst->r_info); + BFD_ASSERT (r_type < (unsigned int) R_RX_max); + cache_ptr->howto = rx_elf_howto_table + r_type; +} + +static bfd_vma +get_symbol_value (const char * name, + bfd_reloc_status_type * stat, + struct bfd_link_info * info, + bfd * input_bfd, + asection * input_section, + int offset) +{ + bfd_vma value = 0; + struct bfd_link_hash_entry * h; + + h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE); + + if (h == NULL + || (h->type != bfd_link_hash_defined + && h->type != bfd_link_hash_defweak)) + * stat = info->callbacks->undefined_symbol + (info, name, input_bfd, input_section, offset, TRUE); + else + value = (h->u.def.value + + h->u.def.section->output_section->vma + + h->u.def.section->output_offset); + + return value; +} + +static bfd_vma +get_gp (bfd_reloc_status_type * stat, + struct bfd_link_info * info, + bfd * abfd, + asection * sec, + int offset) +{ + static bfd_boolean cached = FALSE; + static bfd_vma cached_value = 0; + + if (!cached) + { + cached_value = get_symbol_value ("__gp", stat, info, abfd, sec, offset); + cached = TRUE; + } + return cached_value; +} + +static bfd_vma +get_romstart (bfd_reloc_status_type * stat, + struct bfd_link_info * info, + bfd * abfd, + asection * sec, + int offset) +{ + static bfd_boolean cached = FALSE; + static bfd_vma cached_value = 0; + + if (!cached) + { + cached_value = get_symbol_value ("_start", stat, info, abfd, sec, offset); + cached = TRUE; + } + return cached_value; +} + +static bfd_vma +get_ramstart (bfd_reloc_status_type * stat, + struct bfd_link_info * info, + bfd * abfd, + asection * sec, + int offset) +{ + static bfd_boolean cached = FALSE; + static bfd_vma cached_value = 0; + + if (!cached) + { + cached_value = get_symbol_value ("__datastart", stat, info, abfd, sec, offset); + cached = TRUE; + } + return cached_value; +} + +#define NUM_STACK_ENTRIES 16 +static int32_t rx_stack [ NUM_STACK_ENTRIES ]; +static unsigned int rx_stack_top; + +#define RX_STACK_PUSH(val) \ + do \ + { \ + if (rx_stack_top < NUM_STACK_ENTRIES) \ + rx_stack [rx_stack_top ++] = (val); \ + else \ + r = bfd_reloc_dangerous; \ + } \ + while (0) + +#define RX_STACK_POP(dest) \ + do \ + { \ + if (rx_stack_top > 0) \ + (dest) = rx_stack [-- rx_stack_top]; \ + else \ + (dest) = 0, r = bfd_reloc_dangerous; \ + } \ + while (0) + +/* Relocate an RX ELF section. + There is some attempt to make this function usable for many architectures, + both USE_REL and USE_RELA ['twould be nice if such a critter existed], + if only to serve as a learning tool. + + The RELOCATE_SECTION function is called by the new ELF backend linker + to handle the relocations for a section. + + The relocs are always passed as Rela structures; if the section + actually uses Rel structures, the r_addend field will always be + zero. + + This function is responsible for adjusting the section contents as + necessary, and (if using Rela relocs and generating a relocatable + output file) adjusting the reloc addend as necessary. + + This function does not have to worry about setting the reloc + address or the reloc symbol index. + + LOCAL_SYMS is a pointer to the swapped in local symbols. + + LOCAL_SECTIONS is an array giving the section in the input file + corresponding to the st_shndx field of each local symbol. + + The global hash table entry for the global symbols can be found + via elf_sym_hashes (input_bfd). + + When generating relocatable output, this function must handle + STB_LOCAL/STT_SECTION symbols specially. The output symbol is + going to be the section symbol corresponding to the output + section, which means that the addend must be adjusted + accordingly. */ + +static bfd_boolean +rx_elf_relocate_section + (bfd * output_bfd, + struct bfd_link_info * info, + bfd * input_bfd, + asection * input_section, + bfd_byte * contents, + Elf_Internal_Rela * relocs, + Elf_Internal_Sym * local_syms, + asection ** local_sections) +{ + Elf_Internal_Shdr * symtab_hdr; + struct elf_link_hash_entry ** sym_hashes; + Elf_Internal_Rela * rel; + Elf_Internal_Rela * relend; + bfd * dynobj; + asection * splt; + + symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr; + sym_hashes = elf_sym_hashes (input_bfd); + relend = relocs + input_section->reloc_count; + + dynobj = elf_hash_table (info)->dynobj; + splt = NULL; + if (dynobj != NULL) + splt = bfd_get_section_by_name (dynobj, ".plt"); + + for (rel = relocs; rel < relend; rel ++) + { + reloc_howto_type * howto; + unsigned long r_symndx; + Elf_Internal_Sym * sym; + asection * sec; + struct elf_link_hash_entry * h; + bfd_vma relocation; + bfd_reloc_status_type r; + const char * name = NULL; + bfd_boolean unresolved_reloc = TRUE; + int r_type; + + r_type = ELF32_R_TYPE (rel->r_info); + r_symndx = ELF32_R_SYM (rel->r_info); + + howto = rx_elf_howto_table + ELF32_R_TYPE (rel->r_info); + h = NULL; + sym = NULL; + sec = NULL; + relocation = 0; + + if (r_symndx < symtab_hdr->sh_info) + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; + relocation = _bfd_elf_rela_local_sym (output_bfd, sym, & sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); + name = (sym->st_name == 0) ? bfd_section_name (input_bfd, sec) : name; + } + else + { + bfd_boolean warned; + + RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, + r_symndx, symtab_hdr, sym_hashes, h, + sec, relocation, unresolved_reloc, + warned); + + name = h->root.root.string; + } + + if (sec != NULL && elf_discarded_section (sec)) + { + /* For relocs against symbols from removed linkonce sections, + or sections discarded by a linker script, we just want the + section contents zeroed. Avoid any special processing. */ + _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset); + rel->r_info = 0; + rel->r_addend = 0; + continue; + } + + if (info->relocatable) + { + /* This is a relocatable link. We don't have to change + anything, unless the reloc is against a section symbol, + in which case we have to adjust according to where the + section symbol winds up in the output section. */ + if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION) + rel->r_addend += sec->output_offset; + continue; + } + + if (h != NULL && h->root.type == bfd_link_hash_undefweak) + /* If the symbol is undefined and weak + then the relocation resolves to zero. */ + relocation = 0; + else + { + if (howto->pc_relative) + { + relocation -= (input_section->output_section->vma + + input_section->output_offset + + rel->r_offset); + if (r_type != R_RX_RH_3_PCREL + && r_type != R_RX_DIR3U_PCREL) + relocation ++; + } + + relocation += rel->r_addend; + } + + r = bfd_reloc_ok; + +#define RANGE(a,b) if (a > (long) relocation || (long) relocation > b) r = bfd_reloc_overflow +#define ALIGN(m) if (relocation & m) r = bfd_reloc_other; +#define OP(i) (contents[rel->r_offset + (i)]) +#define WARN_REDHAT(type) \ + _bfd_error_handler (_("%B:%A: Warning: deprecated Red Hat reloc " type " detected against: %s."), \ + input_bfd, input_section, name) + + /* Opcode relocs are always big endian. Data relocs are bi-endian. */ + switch (r_type) + { + case R_RX_NONE: + break; + + case R_RX_RH_RELAX: + break; + + case R_RX_RH_3_PCREL: + WARN_REDHAT ("RX_RH_3_PCREL"); + RANGE (3, 10); + OP (0) &= 0xf8; + OP (0) |= relocation & 0x07; + break; + + case R_RX_RH_8_NEG: + WARN_REDHAT ("RX_RH_8_NEG"); + relocation = - relocation; + case R_RX_DIR8S_PCREL: + RANGE (-128, 127); + OP (0) = relocation; + break; + + case R_RX_DIR8S: + RANGE (-128, 255); + OP (0) = relocation; + break; + + case R_RX_DIR8U: + RANGE (0, 255); + OP (0) = relocation; + break; + + case R_RX_RH_16_NEG: + WARN_REDHAT ("RX_RH_16_NEG"); + relocation = - relocation; + case R_RX_DIR16S_PCREL: + RANGE (-32768, 32767); +#if RX_OPCODE_BIG_ENDIAN +#else + OP (0) = relocation; + OP (1) = relocation >> 8; +#endif + break; + + case R_RX_RH_16_OP: + WARN_REDHAT ("RX_RH_16_OP"); + RANGE (-32768, 32767); +#if RX_OPCODE_BIG_ENDIAN + OP (1) = relocation; + OP (0) = relocation >> 8; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; +#endif + break; + + case R_RX_DIR16S: + RANGE (-32768, 65535); + if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE)) + { + OP (1) = relocation; + OP (0) = relocation >> 8; + } + else + { + OP (0) = relocation; + OP (1) = relocation >> 8; + } + break; + + case R_RX_DIR16U: + RANGE (0, 65536); +#if RX_OPCODE_BIG_ENDIAN + OP (1) = relocation; + OP (0) = relocation >> 8; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; +#endif + break; + + case R_RX_DIR16: + RANGE (-32768, 65536); +#if RX_OPCODE_BIG_ENDIAN + OP (1) = relocation; + OP (0) = relocation >> 8; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; +#endif + break; + + case R_RX_DIR16_REV: + RANGE (-32768, 65536); +#if RX_OPCODE_BIG_ENDIAN + OP (0) = relocation; + OP (1) = relocation >> 8; +#else + OP (1) = relocation; + OP (0) = relocation >> 8; +#endif + break; + + case R_RX_DIR3U_PCREL: + RANGE (3, 10); + OP (0) &= 0xf8; + OP (0) |= relocation & 0x07; + break; + + case R_RX_RH_24_NEG: + WARN_REDHAT ("RX_RH_24_NEG"); + relocation = - relocation; + case R_RX_DIR24S_PCREL: + RANGE (-0x800000, 0x7fffff); +#if RX_OPCODE_BIG_ENDIAN + OP (2) = relocation; + OP (1) = relocation >> 8; + OP (0) = relocation >> 16; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; + OP (2) = relocation >> 16; +#endif + break; + + case R_RX_RH_24_OP: + WARN_REDHAT ("RX_RH_24_OP"); + RANGE (-0x800000, 0x7fffff); +#if RX_OPCODE_BIG_ENDIAN + OP (2) = relocation; + OP (1) = relocation >> 8; + OP (0) = relocation >> 16; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; + OP (2) = relocation >> 16; +#endif + break; + + case R_RX_DIR24S: + RANGE (-0x800000, 0x7fffff); + if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE)) + { + OP (2) = relocation; + OP (1) = relocation >> 8; + OP (0) = relocation >> 16; + } + else + { + OP (0) = relocation; + OP (1) = relocation >> 8; + OP (2) = relocation >> 16; + } + break; + + case R_RX_RH_24_UNS: + WARN_REDHAT ("RX_RH_24_UNS"); + RANGE (0, 0xffffff); +#if RX_OPCODE_BIG_ENDIAN + OP (2) = relocation; + OP (1) = relocation >> 8; + OP (0) = relocation >> 16; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; + OP (2) = relocation >> 16; +#endif + break; + + case R_RX_RH_32_NEG: + WARN_REDHAT ("RX_RH_32_NEG"); + relocation = - relocation; +#if RX_OPCODE_BIG_ENDIAN + OP (3) = relocation; + OP (2) = relocation >> 8; + OP (1) = relocation >> 16; + OP (0) = relocation >> 24; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; + OP (2) = relocation >> 16; + OP (3) = relocation >> 24; +#endif + break; + + case R_RX_RH_32_OP: + WARN_REDHAT ("RX_RH_32_OP"); +#if RX_OPCODE_BIG_ENDIAN + OP (3) = relocation; + OP (2) = relocation >> 8; + OP (1) = relocation >> 16; + OP (0) = relocation >> 24; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; + OP (2) = relocation >> 16; + OP (3) = relocation >> 24; +#endif + break; + + case R_RX_DIR32: + if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE)) + { + OP (3) = relocation; + OP (2) = relocation >> 8; + OP (1) = relocation >> 16; + OP (0) = relocation >> 24; + } + else + { + OP (0) = relocation; + OP (1) = relocation >> 8; + OP (2) = relocation >> 16; + OP (3) = relocation >> 24; + } + break; + + case R_RX_DIR32_REV: + if (BIGE (output_bfd)) + { + OP (0) = relocation; + OP (1) = relocation >> 8; + OP (2) = relocation >> 16; + OP (3) = relocation >> 24; + } + else + { + OP (3) = relocation; + OP (2) = relocation >> 8; + OP (1) = relocation >> 16; + OP (0) = relocation >> 24; + } + break; + + case R_RX_RH_DIFF: + { + bfd_vma val; + WARN_REDHAT ("RX_RH_DIFF"); + val = bfd_get_32 (output_bfd, & OP (0)); + val -= relocation; + bfd_put_32 (output_bfd, val, & OP (0)); + } + break; + + case R_RX_RH_GPRELB: + WARN_REDHAT ("RX_RH_GPRELB"); + relocation -= get_gp (&r, info, input_bfd, input_section, rel->r_offset); + RANGE (0, 65535); +#if RX_OPCODE_BIG_ENDIAN + OP (1) = relocation; + OP (0) = relocation >> 8; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; +#endif + break; + + case R_RX_RH_GPRELW: + WARN_REDHAT ("RX_RH_GPRELW"); + relocation -= get_gp (&r, info, input_bfd, input_section, rel->r_offset); + ALIGN (1); + relocation >>= 1; + RANGE (0, 65535); +#if RX_OPCODE_BIG_ENDIAN + OP (1) = relocation; + OP (0) = relocation >> 8; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; +#endif + break; + + case R_RX_RH_GPRELL: + WARN_REDHAT ("RX_RH_GPRELL"); + relocation -= get_gp (&r, info, input_bfd, input_section, rel->r_offset); + ALIGN (3); + relocation >>= 2; + RANGE (0, 65535); +#if RX_OPCODE_BIG_ENDIAN + OP (1) = relocation; + OP (0) = relocation >> 8; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; +#endif + break; + + /* Internal relocations just for relaxation: */ + case R_RX_RH_ABS5p5B: + RX_STACK_POP (relocation); + RANGE (0, 31); + OP (0) &= 0xf8; + OP (0) |= relocation >> 2; + OP (1) &= 0x77; + OP (1) |= (relocation << 6) & 0x80; + OP (1) |= (relocation << 3) & 0x08; + break; + + case R_RX_RH_ABS5p5W: + RX_STACK_POP (relocation); + RANGE (0, 62); + ALIGN (1); + relocation >>= 1; + OP (0) &= 0xf8; + OP (0) |= relocation >> 2; + OP (1) &= 0x77; + OP (1) |= (relocation << 6) & 0x80; + OP (1) |= (relocation << 3) & 0x08; + break; + + case R_RX_RH_ABS5p5L: + RX_STACK_POP (relocation); + RANGE (0, 124); + ALIGN (3); + relocation >>= 2; + OP (0) &= 0xf8; + OP (0) |= relocation >> 2; + OP (1) &= 0x77; + OP (1) |= (relocation << 6) & 0x80; + OP (1) |= (relocation << 3) & 0x08; + break; + + case R_RX_RH_ABS5p8B: + RX_STACK_POP (relocation); + RANGE (0, 31); + OP (0) &= 0x70; + OP (0) |= (relocation << 3) & 0x80; + OP (0) |= relocation & 0x0f; + break; + + case R_RX_RH_ABS5p8W: + RX_STACK_POP (relocation); + RANGE (0, 62); + ALIGN (1); + relocation >>= 1; + OP (0) &= 0x70; + OP (0) |= (relocation << 3) & 0x80; + OP (0) |= relocation & 0x0f; + break; + + case R_RX_RH_ABS5p8L: + RX_STACK_POP (relocation); + RANGE (0, 124); + ALIGN (3); + relocation >>= 2; + OP (0) &= 0x70; + OP (0) |= (relocation << 3) & 0x80; + OP (0) |= relocation & 0x0f; + break; + + case R_RX_RH_UIMM4p8: + RANGE (0, 15); + OP (0) &= 0x0f; + OP (0) |= relocation << 4; + break; + + case R_RX_RH_UNEG4p8: + RANGE (-15, 0); + OP (0) &= 0x0f; + OP (0) |= (-relocation) << 4; + break; + + /* Complex reloc handling: */ + + case R_RX_ABS32: + RX_STACK_POP (relocation); +#if RX_OPCODE_BIG_ENDIAN + OP (3) = relocation; + OP (2) = relocation >> 8; + OP (1) = relocation >> 16; + OP (0) = relocation >> 24; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; + OP (2) = relocation >> 16; + OP (3) = relocation >> 24; +#endif + break; + + case R_RX_ABS32_REV: + RX_STACK_POP (relocation); +#if RX_OPCODE_BIG_ENDIAN + OP (0) = relocation; + OP (1) = relocation >> 8; + OP (2) = relocation >> 16; + OP (3) = relocation >> 24; +#else + OP (3) = relocation; + OP (2) = relocation >> 8; + OP (1) = relocation >> 16; + OP (0) = relocation >> 24; +#endif + break; + + case R_RX_ABS24S_PCREL: + case R_RX_ABS24S: + RX_STACK_POP (relocation); + RANGE (-0x800000, 0x7fffff); + if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE)) + { + OP (2) = relocation; + OP (1) = relocation >> 8; + OP (0) = relocation >> 16; + } + else + { + OP (0) = relocation; + OP (1) = relocation >> 8; + OP (2) = relocation >> 16; + } + break; + + case R_RX_ABS16: + RX_STACK_POP (relocation); + RANGE (-32768, 65535); +#if RX_OPCODE_BIG_ENDIAN + OP (1) = relocation; + OP (0) = relocation >> 8; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; +#endif + break; + + case R_RX_ABS16_REV: + RX_STACK_POP (relocation); + RANGE (-32768, 65535); +#if RX_OPCODE_BIG_ENDIAN + OP (0) = relocation; + OP (1) = relocation >> 8; +#else + OP (1) = relocation; + OP (0) = relocation >> 8; +#endif + break; + + case R_RX_ABS16S_PCREL: + case R_RX_ABS16S: + RX_STACK_POP (relocation); + RANGE (-32768, 32767); + if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE)) + { + OP (1) = relocation; + OP (0) = relocation >> 8; + } + else + { + OP (0) = relocation; + OP (1) = relocation >> 8; + } + break; + + case R_RX_ABS16U: + RX_STACK_POP (relocation); + RANGE (0, 65536); +#if RX_OPCODE_BIG_ENDIAN + OP (1) = relocation; + OP (0) = relocation >> 8; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; +#endif + break; + + case R_RX_ABS16UL: + RX_STACK_POP (relocation); + relocation >>= 2; + RANGE (0, 65536); +#if RX_OPCODE_BIG_ENDIAN + OP (1) = relocation; + OP (0) = relocation >> 8; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; +#endif + break; + + case R_RX_ABS16UW: + RX_STACK_POP (relocation); + relocation >>= 1; + RANGE (0, 65536); +#if RX_OPCODE_BIG_ENDIAN + OP (1) = relocation; + OP (0) = relocation >> 8; +#else + OP (0) = relocation; + OP (1) = relocation >> 8; +#endif + break; + + case R_RX_ABS8: + RX_STACK_POP (relocation); + RANGE (-128, 255); + OP (0) = relocation; + break; + + case R_RX_ABS8U: + RX_STACK_POP (relocation); + RANGE (0, 255); + OP (0) = relocation; + break; + + case R_RX_ABS8UL: + RX_STACK_POP (relocation); + relocation >>= 2; + RANGE (0, 255); + OP (0) = relocation; + break; + + case R_RX_ABS8UW: + RX_STACK_POP (relocation); + relocation >>= 1; + RANGE (0, 255); + OP (0) = relocation; + break; + + case R_RX_ABS8S_PCREL: + case R_RX_ABS8S: + RX_STACK_POP (relocation); + RANGE (-128, 127); + OP (0) = relocation; + break; + + case R_RX_SYM: + if (r_symndx < symtab_hdr->sh_info) + RX_STACK_PUSH (sec->output_section->vma + + sec->output_offset + + sym->st_value); + else + { + if (h != NULL + && (h->root.type == bfd_link_hash_defined + || h->root.type == bfd_link_hash_defweak)) + RX_STACK_PUSH (h->root.u.def.value + + sec->output_section->vma + + sec->output_offset); + else + _bfd_error_handler (_("Warning: RX_SYM reloc with an unknown symbol")); + } + break; + + case R_RX_OPneg: + { + int32_t tmp; + + RX_STACK_POP (tmp); + tmp = - tmp; + RX_STACK_PUSH (tmp); + } + break; + + case R_RX_OPadd: + { + int32_t tmp1, tmp2; + + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 += tmp2; + RX_STACK_PUSH (tmp1); + } + break; + + case R_RX_OPsub: + { + int32_t tmp1, tmp2; + + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp2 -= tmp1; + RX_STACK_PUSH (tmp2); + } + break; + + case R_RX_OPmul: + { + int32_t tmp1, tmp2; + + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 *= tmp2; + RX_STACK_PUSH (tmp1); + } + break; + + case R_RX_OPdiv: + { + int32_t tmp1, tmp2; + + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 /= tmp2; + RX_STACK_PUSH (tmp1); + } + break; + + case R_RX_OPshla: + { + int32_t tmp1, tmp2; + + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 <<= tmp2; + RX_STACK_PUSH (tmp1); + } + break; + + case R_RX_OPshra: + { + int32_t tmp1, tmp2; + + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 >>= tmp2; + RX_STACK_PUSH (tmp1); + } + break; + + case R_RX_OPsctsize: + RX_STACK_PUSH (input_section->size); + break; + + case R_RX_OPscttop: + RX_STACK_PUSH (input_section->output_section->vma); + break; + + case R_RX_OPand: + { + int32_t tmp1, tmp2; + + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 &= tmp2; + RX_STACK_PUSH (tmp1); + } + break; + + case R_RX_OPor: + { + int32_t tmp1, tmp2; + + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 |= tmp2; + RX_STACK_PUSH (tmp1); + } + break; + + case R_RX_OPxor: + { + int32_t tmp1, tmp2; + + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 ^= tmp2; + RX_STACK_PUSH (tmp1); + } + break; + + case R_RX_OPnot: + { + int32_t tmp; + + RX_STACK_POP (tmp); + tmp = ~ tmp; + RX_STACK_PUSH (tmp); + } + break; + + case R_RX_OPmod: + { + int32_t tmp1, tmp2; + + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 %= tmp2; + RX_STACK_PUSH (tmp1); + } + break; + + case R_RX_OPromtop: + RX_STACK_PUSH (get_romstart (&r, info, input_bfd, input_section, rel->r_offset)); + break; + + case R_RX_OPramtop: + RX_STACK_PUSH (get_ramstart (&r, info, input_bfd, input_section, rel->r_offset)); + break; + + default: + r = bfd_reloc_notsupported; + break; + } + + if (r != bfd_reloc_ok) + { + const char * msg = NULL; + + switch (r) + { + case bfd_reloc_overflow: + /* Catch the case of a missing function declaration + and emit a more helpful error message. */ + if (r_type == R_RX_DIR24S_PCREL) + msg = _("%B(%A): error: call to undefined function '%s'"); + else + r = info->callbacks->reloc_overflow + (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0, + input_bfd, input_section, rel->r_offset); + break; + + case bfd_reloc_undefined: + r = info->callbacks->undefined_symbol + (info, name, input_bfd, input_section, rel->r_offset, + TRUE); + break; + + case bfd_reloc_other: + msg = _("%B(%A): warning: unaligned access to symbol '%s' in the small data area"); + break; + + case bfd_reloc_outofrange: + msg = _("%B(%A): internal error: out of range error"); + break; + + case bfd_reloc_notsupported: + msg = _("%B(%A): internal error: unsupported relocation error"); + break; + + case bfd_reloc_dangerous: + msg = _("%B(%A): internal error: dangerous relocation"); + break; + + default: + msg = _("%B(%A): internal error: unknown error"); + break; + } + + if (msg) + _bfd_error_handler (msg, input_bfd, input_section, name); + + if (! r) + return FALSE; + } + } + + return TRUE; +} + +/* Relaxation Support. */ + +/* Progression of relocations from largest operand size to smallest + operand size. */ + +static int +next_smaller_reloc (int r) +{ + switch (r) + { + case R_RX_DIR32: return R_RX_DIR24S; + case R_RX_DIR24S: return R_RX_DIR16S; + case R_RX_DIR16S: return R_RX_DIR8S; + case R_RX_DIR8S: return R_RX_NONE; + + case R_RX_DIR16: return R_RX_DIR8; + case R_RX_DIR8: return R_RX_NONE; + + case R_RX_DIR16U: return R_RX_DIR8U; + case R_RX_DIR8U: return R_RX_NONE; + + case R_RX_DIR24S_PCREL: return R_RX_DIR16S_PCREL; + case R_RX_DIR16S_PCREL: return R_RX_DIR8S_PCREL; + case R_RX_DIR8S_PCREL: return R_RX_DIR3U_PCREL; + + case R_RX_DIR16UL: return R_RX_DIR8UL; + case R_RX_DIR8UL: return R_RX_NONE; + case R_RX_DIR16UW: return R_RX_DIR8UW; + case R_RX_DIR8UW: return R_RX_NONE; + + case R_RX_RH_32_OP: return R_RX_RH_24_OP; + case R_RX_RH_24_OP: return R_RX_RH_16_OP; + case R_RX_RH_16_OP: return R_RX_DIR8; + + case R_RX_ABS32: return R_RX_ABS24S; + case R_RX_ABS24S: return R_RX_ABS16S; + case R_RX_ABS16: return R_RX_ABS8; + case R_RX_ABS16U: return R_RX_ABS8U; + case R_RX_ABS16S: return R_RX_ABS8S; + case R_RX_ABS8: return R_RX_NONE; + case R_RX_ABS8U: return R_RX_NONE; + case R_RX_ABS8S: return R_RX_NONE; + case R_RX_ABS24S_PCREL: return R_RX_ABS16S_PCREL; + case R_RX_ABS16S_PCREL: return R_RX_ABS8S_PCREL; + case R_RX_ABS8S_PCREL: return R_RX_NONE; + case R_RX_ABS16UL: return R_RX_ABS8UL; + case R_RX_ABS16UW: return R_RX_ABS8UW; + case R_RX_ABS8UL: return R_RX_NONE; + case R_RX_ABS8UW: return R_RX_NONE; + } + return r; +}; + +/* Delete some bytes from a section while relaxing. */ + +static bfd_boolean +elf32_rx_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count, + Elf_Internal_Rela *alignment_rel, int force_snip) +{ + Elf_Internal_Shdr * symtab_hdr; + unsigned int sec_shndx; + bfd_byte * contents; + Elf_Internal_Rela * irel; + Elf_Internal_Rela * irelend; + Elf_Internal_Rela * irelalign; + Elf_Internal_Sym * isym; + Elf_Internal_Sym * isymend; + bfd_vma toaddr; + unsigned int symcount; + struct elf_link_hash_entry ** sym_hashes; + struct elf_link_hash_entry ** end_hashes; + + if (!alignment_rel) + force_snip = 1; + + sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec); + + contents = elf_section_data (sec)->this_hdr.contents; + + /* The deletion must stop at the next alignment boundary, if + ALIGNMENT_REL is non-NULL. */ + irelalign = NULL; + toaddr = sec->size; + if (alignment_rel) + toaddr = alignment_rel->r_offset; + + irel = elf_section_data (sec)->relocs; + irelend = irel + sec->reloc_count; + + /* Actually delete the bytes. */ + memmove (contents + addr, contents + addr + count, + (size_t) (toaddr - addr - count)); + + /* If we don't have an alignment marker to worry about, we can just + shrink the section. Otherwise, we have to fill in the newly + created gap with NOP insns (0x03). */ + if (force_snip) + sec->size -= count; + else + memset (contents + toaddr - count, 0x03, count); + + /* Adjust all the relocs. */ + for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++) + { + /* Get the new reloc address. */ + if (irel->r_offset > addr + && (irel->r_offset < toaddr + || (force_snip && irel->r_offset == toaddr))) + irel->r_offset -= count; + + /* If we see an ALIGN marker at the end of the gap, we move it + to the beginning of the gap, since marking these gaps is what + they're for. */ + if (irel->r_offset == toaddr + && ELF32_R_TYPE (irel->r_info) == R_RX_RH_RELAX + && irel->r_addend & RX_RELAXA_ALIGN) + irel->r_offset -= count; + } + + /* Adjust the local symbols defined in this section. */ + symtab_hdr = &elf_tdata (abfd)->symtab_hdr; + isym = (Elf_Internal_Sym *) symtab_hdr->contents; + isymend = isym + symtab_hdr->sh_info; + + for (; isym < isymend; isym++) + { + /* If the symbol is in the range of memory we just moved, we + have to adjust its value. */ + if (isym->st_shndx == sec_shndx + && isym->st_value > addr + && isym->st_value < toaddr) + isym->st_value -= count; + + /* If the symbol *spans* the bytes we just deleted (i.e. it's + *end* is in the moved bytes but it's *start* isn't), then we + must adjust its size. */ + if (isym->st_shndx == sec_shndx + && isym->st_value < addr + && isym->st_value + isym->st_size > addr + && isym->st_value + isym->st_size < toaddr) + isym->st_size -= count; + } + + /* Now adjust the global symbols defined in this section. */ + symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym) + - symtab_hdr->sh_info); + sym_hashes = elf_sym_hashes (abfd); + end_hashes = sym_hashes + symcount; + + for (; sym_hashes < end_hashes; sym_hashes++) + { + struct elf_link_hash_entry *sym_hash = *sym_hashes; + + if ((sym_hash->root.type == bfd_link_hash_defined + || sym_hash->root.type == bfd_link_hash_defweak) + && sym_hash->root.u.def.section == sec) + { + /* As above, adjust the value if needed. */ + if (sym_hash->root.u.def.value > addr + && sym_hash->root.u.def.value < toaddr) + sym_hash->root.u.def.value -= count; + + /* As above, adjust the size if needed. */ + if (sym_hash->root.u.def.value < addr + && sym_hash->root.u.def.value + sym_hash->size > addr + && sym_hash->root.u.def.value + sym_hash->size < toaddr) + sym_hash->size -= count; + } + } + + return TRUE; +} + +/* Used to sort relocs by address. If relocs have the same address, + we maintain their relative order, except that R_RX_RH_RELAX + alignment relocs must be the first reloc for any given address. */ + +static void +reloc_bubblesort (Elf_Internal_Rela * r, int count) +{ + int i; + bfd_boolean again; + bfd_boolean swappit; + + /* This is almost a classic bubblesort. It's the slowest sort, but + we're taking advantage of the fact that the relocations are + mostly in order already (the assembler emits them that way) and + we need relocs with the same address to remain in the same + relative order. */ + again = TRUE; + while (again) + { + again = FALSE; + for (i = 0; i < count - 1; i ++) + { + if (r[i].r_offset > r[i + 1].r_offset) + swappit = TRUE; + else if (r[i].r_offset < r[i + 1].r_offset) + swappit = FALSE; + else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RX_RH_RELAX + && (r[i + 1].r_addend & RX_RELAXA_ALIGN)) + swappit = TRUE; + else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RX_RH_RELAX + && (r[i + 1].r_addend & RX_RELAXA_ELIGN) + && !(ELF32_R_TYPE (r[i].r_info) == R_RX_RH_RELAX + && (r[i].r_addend & RX_RELAXA_ALIGN))) + swappit = TRUE; + else + swappit = FALSE; + + if (swappit) + { + Elf_Internal_Rela tmp; + + tmp = r[i]; + r[i] = r[i + 1]; + r[i + 1] = tmp; + /* If we do move a reloc back, re-scan to see if it + needs to be moved even further back. This avoids + most of the O(n^2) behavior for our cases. */ + if (i > 0) + i -= 2; + again = TRUE; + } + } + } +} + + +#define OFFSET_FOR_RELOC(rel, lrel, scale) \ + rx_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \ + lrel, abfd, sec, link_info, scale) + +static bfd_vma +rx_offset_for_reloc (bfd * abfd, + Elf_Internal_Rela * rel, + Elf_Internal_Shdr * symtab_hdr, + Elf_External_Sym_Shndx * shndx_buf, + Elf_Internal_Sym * intsyms, + Elf_Internal_Rela ** lrel, + bfd * input_bfd, + asection * input_section, + struct bfd_link_info * info, + int * scale) +{ + bfd_vma symval; + bfd_reloc_status_type r; + + *scale = 1; + + /* REL is the first of 1..N relocations. We compute the symbol + value for each relocation, then combine them if needed. LREL + gets a pointer to the last relocation used. */ + while (1) + { + int32_t tmp1, tmp2; + + /* Get the value of the symbol referred to by the reloc. */ + if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info) + { + /* A local symbol. */ + Elf_Internal_Sym *isym; + Elf_External_Sym_Shndx *shndx; + asection *ssec; + + isym = intsyms + ELF32_R_SYM (rel->r_info); + + if (isym->st_shndx == SHN_UNDEF) + ssec = bfd_und_section_ptr; + else if (isym->st_shndx == SHN_ABS) + ssec = bfd_abs_section_ptr; + else if (isym->st_shndx == SHN_COMMON) + ssec = bfd_com_section_ptr; + else + ssec = bfd_section_from_elf_index (abfd, + isym->st_shndx); + + shndx = shndx_buf + (shndx_buf ? ELF32_R_SYM (rel->r_info) : 0); + + /* Initial symbol value. */ + symval = isym->st_value; + + /* GAS may have made this symbol relative to a section, in + which case, we have to add the addend to find the + symbol. */ + if (ELF_ST_TYPE (isym->st_info) == STT_SECTION) + symval += rel->r_addend; + + if (ssec) + { + if ((ssec->flags & SEC_MERGE) + && ssec->sec_info_type == ELF_INFO_TYPE_MERGE) + symval = _bfd_merged_section_offset (abfd, & ssec, + elf_section_data (ssec)->sec_info, + symval); + } + + /* Now make the offset relative to where the linker is putting it. */ + if (ssec) + symval += + ssec->output_section->vma + ssec->output_offset; + + symval += rel->r_addend; + } + else + { + unsigned long indx; + struct elf_link_hash_entry * h; + + /* An external symbol. */ + indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info; + h = elf_sym_hashes (abfd)[indx]; + BFD_ASSERT (h != NULL); + + if (h->root.type != bfd_link_hash_defined + && h->root.type != bfd_link_hash_defweak) + { + /* This appears to be a reference to an undefined + symbol. Just ignore it--it will be caught by the + regular reloc processing. */ + if (lrel) + *lrel = rel; + return 0; + } + + symval = (h->root.u.def.value + + h->root.u.def.section->output_section->vma + + h->root.u.def.section->output_offset); + + symval += rel->r_addend; + } + + switch (ELF32_R_TYPE (rel->r_info)) + { + case R_RX_SYM: + RX_STACK_PUSH (symval); + break; + + case R_RX_OPneg: + RX_STACK_POP (tmp1); + tmp1 = - tmp1; + RX_STACK_PUSH (tmp1); + break; + + case R_RX_OPadd: + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 += tmp2; + RX_STACK_PUSH (tmp1); + break; + + case R_RX_OPsub: + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp2 -= tmp1; + RX_STACK_PUSH (tmp2); + break; + + case R_RX_OPmul: + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 *= tmp2; + RX_STACK_PUSH (tmp1); + break; + + case R_RX_OPdiv: + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 /= tmp2; + RX_STACK_PUSH (tmp1); + break; + + case R_RX_OPshla: + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 <<= tmp2; + RX_STACK_PUSH (tmp1); + break; + + case R_RX_OPshra: + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 >>= tmp2; + RX_STACK_PUSH (tmp1); + break; + + case R_RX_OPsctsize: + RX_STACK_PUSH (input_section->size); + break; + + case R_RX_OPscttop: + RX_STACK_PUSH (input_section->output_section->vma); + break; + + case R_RX_OPand: + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 &= tmp2; + RX_STACK_PUSH (tmp1); + break; + + case R_RX_OPor: + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 |= tmp2; + RX_STACK_PUSH (tmp1); + break; + + case R_RX_OPxor: + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 ^= tmp2; + RX_STACK_PUSH (tmp1); + break; + + case R_RX_OPnot: + RX_STACK_POP (tmp1); + tmp1 = ~ tmp1; + RX_STACK_PUSH (tmp1); + break; + + case R_RX_OPmod: + RX_STACK_POP (tmp1); + RX_STACK_POP (tmp2); + tmp1 %= tmp2; + RX_STACK_PUSH (tmp1); + break; + + case R_RX_OPromtop: + RX_STACK_PUSH (get_romstart (&r, info, input_bfd, input_section, rel->r_offset)); + break; + + case R_RX_OPramtop: + RX_STACK_PUSH (get_ramstart (&r, info, input_bfd, input_section, rel->r_offset)); + break; + + case R_RX_DIR16UL: + case R_RX_DIR8UL: + case R_RX_ABS16UL: + case R_RX_ABS8UL: + if (rx_stack_top) + RX_STACK_POP (symval); + if (lrel) + *lrel = rel; + *scale = 4; + return symval; + + case R_RX_DIR16UW: + case R_RX_DIR8UW: + case R_RX_ABS16UW: + case R_RX_ABS8UW: + if (rx_stack_top) + RX_STACK_POP (symval); + if (lrel) + *lrel = rel; + *scale = 2; + return symval; + + default: + if (rx_stack_top) + RX_STACK_POP (symval); + if (lrel) + *lrel = rel; + return symval; + } + + rel ++; + } +} + +static void +move_reloc (Elf_Internal_Rela * irel, Elf_Internal_Rela * srel, int delta) +{ + bfd_vma old_offset = srel->r_offset; + + irel ++; + while (irel <= srel) + { + if (irel->r_offset == old_offset) + irel->r_offset += delta; + irel ++; + } +} + +/* Relax one section. */ + +static bfd_boolean +elf32_rx_relax_section (bfd * abfd, + asection * sec, + struct bfd_link_info * link_info, + bfd_boolean * again, + bfd_boolean allow_pcrel3) +{ + Elf_Internal_Shdr * symtab_hdr; + Elf_Internal_Shdr * shndx_hdr; + Elf_Internal_Rela * internal_relocs; + Elf_Internal_Rela * free_relocs = NULL; + Elf_Internal_Rela * irel; + Elf_Internal_Rela * srel; + Elf_Internal_Rela * irelend; + Elf_Internal_Rela * next_alignment; + Elf_Internal_Rela * prev_alignment; + bfd_byte * contents = NULL; + bfd_byte * free_contents = NULL; + Elf_Internal_Sym * intsyms = NULL; + Elf_Internal_Sym * free_intsyms = NULL; + Elf_External_Sym_Shndx * shndx_buf = NULL; + bfd_vma pc; + bfd_vma sec_start; + bfd_vma sec_end; + bfd_vma symval = 0; + int pcrel = 0; + int code = 0; + int section_alignment_glue; + /* how much to scale the relocation by - 1, 2, or 4. */ + int scale; + + /* Assume nothing changes. */ + *again = FALSE; + + /* We don't have to do anything for a relocatable link, if + this section does not have relocs, or if this is not a + code section. */ + if (link_info->relocatable + || (sec->flags & SEC_RELOC) == 0 + || sec->reloc_count == 0 + || (sec->flags & SEC_CODE) == 0) + return TRUE; + + symtab_hdr = &elf_tdata (abfd)->symtab_hdr; + shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr; + + sec_start = sec->output_section->vma + sec->output_offset; + sec_end = sec->output_section->vma + sec->output_offset + sec->size; + + /* Get the section contents. */ + if (elf_section_data (sec)->this_hdr.contents != NULL) + contents = elf_section_data (sec)->this_hdr.contents; + /* Go get them off disk. */ + else + { + if (! bfd_malloc_and_get_section (abfd, sec, &contents)) + goto error_return; + elf_section_data (sec)->this_hdr.contents = contents; + } + + /* Read this BFD's symbols. */ + /* Get cached copy if it exists. */ + if (symtab_hdr->contents != NULL) + intsyms = (Elf_Internal_Sym *) symtab_hdr->contents; + else + { + intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL); + symtab_hdr->contents = (bfd_byte *) intsyms; + } + + if (shndx_hdr->sh_size != 0) + { + bfd_size_type amt; + + amt = symtab_hdr->sh_info; + amt *= sizeof (Elf_External_Sym_Shndx); + shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt); + if (shndx_buf == NULL) + goto error_return; + if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0 + || bfd_bread ((PTR) shndx_buf, amt, abfd) != amt) + goto error_return; + shndx_hdr->contents = (bfd_byte *) shndx_buf; + } + + /* Get a copy of the native relocations. */ + internal_relocs = (_bfd_elf_link_read_relocs + (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL, + link_info->keep_memory)); + if (internal_relocs == NULL) + goto error_return; + if (! link_info->keep_memory) + free_relocs = internal_relocs; + + /* The RL_ relocs must be just before the operand relocs they go + with, so we must sort them to guarantee this. We use bubblesort + instead of qsort so we can guarantee that relocs with the same + address remain in the same relative order. */ + reloc_bubblesort (internal_relocs, sec->reloc_count); + + /* Walk through them looking for relaxing opportunities. */ + irelend = internal_relocs + sec->reloc_count; + + /* This will either be NULL or a pointer to the next alignment + relocation. */ + next_alignment = internal_relocs; + /* This will be the previous alignment, although at first it points + to the first real relocation. */ + prev_alignment = internal_relocs; + + /* We calculate worst case shrinkage caused by alignment directives. + No fool-proof, but better than either ignoring the problem or + doing heavy duty analysis of all the alignment markers in all + input sections. */ + section_alignment_glue = 0; + for (irel = internal_relocs; irel < irelend; irel++) + if (ELF32_R_TYPE (irel->r_info) == R_RX_RH_RELAX + && irel->r_addend & RX_RELAXA_ALIGN) + { + int this_glue = 1 << (irel->r_addend & RX_RELAXA_ANUM); + + if (section_alignment_glue < this_glue) + section_alignment_glue = this_glue; + } + /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte + shrinkage. */ + section_alignment_glue *= 2; + + for (irel = internal_relocs; irel < irelend; irel++) + { + unsigned char *insn; + int nrelocs; + + /* The insns we care about are all marked with one of these. */ + if (ELF32_R_TYPE (irel->r_info) != R_RX_RH_RELAX) + continue; + + if (irel->r_addend & RX_RELAXA_ALIGN + || next_alignment == internal_relocs) + { + /* When we delete bytes, we need to maintain all the alignments + indicated. In addition, we need to be careful about relaxing + jumps across alignment boundaries - these displacements + *grow* when we delete bytes. For now, don't shrink + displacements across an alignment boundary, just in case. + Note that this only affects relocations to the same + section. */ + prev_alignment = next_alignment; + next_alignment += 2; + while (next_alignment < irelend + && (ELF32_R_TYPE (next_alignment->r_info) != R_RX_RH_RELAX + || !(next_alignment->r_addend & RX_RELAXA_ELIGN))) + next_alignment ++; + if (next_alignment >= irelend || next_alignment->r_offset == 0) + next_alignment = NULL; + } + + /* When we hit alignment markers, see if we've shrunk enough + before them to reduce the gap without violating the alignment + requirements. */ + if (irel->r_addend & RX_RELAXA_ALIGN) + { + /* At this point, the next relocation *should* be the ELIGN + end marker. */ + Elf_Internal_Rela *erel = irel + 1; + unsigned int alignment, nbytes; + + if (ELF32_R_TYPE (erel->r_info) != R_RX_RH_RELAX) + continue; + if (!(erel->r_addend & RX_RELAXA_ELIGN)) + continue; + + alignment = 1 << (irel->r_addend & RX_RELAXA_ANUM); + + if (erel->r_offset - irel->r_offset < alignment) + continue; + + nbytes = erel->r_offset - irel->r_offset; + nbytes /= alignment; + nbytes *= alignment; + + elf32_rx_relax_delete_bytes (abfd, sec, erel->r_offset-nbytes, nbytes, next_alignment, + erel->r_offset == sec->size); + *again = TRUE; + + continue; + } + + if (irel->r_addend & RX_RELAXA_ELIGN) + continue; + + insn = contents + irel->r_offset; + + nrelocs = irel->r_addend & RX_RELAXA_RNUM; + + /* At this point, we have an insn that is a candidate for linker + relaxation. There are NRELOCS relocs following that may be + relaxed, although each reloc may be made of more than one + reloc entry (such as gp-rel symbols). */ + + /* Get the value of the symbol referred to by the reloc. Just + in case this is the last reloc in the list, use the RL's + addend to choose between this reloc (no addend) or the next + (yes addend, which means at least one following reloc). */ + + /* srel points to the "current" reloction for this insn - + actually the last reloc for a given operand, which is the one + we need to update. We check the relaxations in the same + order that the relocations happen, so we'll just push it + along as we go. */ + srel = irel; + + pc = sec->output_section->vma + sec->output_offset + + srel->r_offset; + +#define GET_RELOC \ + symval = OFFSET_FOR_RELOC (srel, &srel, &scale); \ + pcrel = symval - pc + srel->r_addend; \ + nrelocs --; + +#define SNIPNR(offset, nbytes) \ + elf32_rx_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0); +#define SNIP(offset, nbytes, newtype) \ + SNIPNR (offset, nbytes); \ + srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype) + + /* The order of these bit tests must match the order that the + relocs appear in. Since we sorted those by offset, we can + predict them. */ + + /* Note that the numbers in, say, DSP6 are the bit offsets of + the code fields that describe the operand. Bits number 0 for + the MSB of insn[0]. */ + + /* DSP* codes: + 0 00 [reg] + 1 01 dsp:8[reg] + 2 10 dsp:16[reg] + 3 11 reg */ + if (irel->r_addend & RX_RELAXA_DSP6) + { + GET_RELOC; + + code = insn[0] & 3; + if (code == 2 && symval/scale <= 255) + { + unsigned int newrel = ELF32_R_TYPE (srel->r_info); + insn[0] &= 0xfc; + insn[0] |= 0x01; + newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info)); + if (newrel != ELF32_R_TYPE (srel->r_info)) + { + SNIP (3, 1, newrel); + *again = TRUE; + } + } + + else if (code == 1 && symval == 0) + { + insn[0] &= 0xfc; + SNIP (2, 1, R_RX_NONE); + *again = TRUE; + } + + /* Special case DSP:5 format: MOV.bwl dsp:5[Rsrc],Rdst. */ + else if (code == 1 && symval/scale <= 31 + /* Decodable bits. */ + && (insn[0] & 0xcc) == 0xcc + /* width */ + && (insn[0] & 0x30) != 3 + /* register MSBs */ + && (insn[1] & 0x88) == 0x00) + { + int newrel = 0; + + insn[0] = 0x88 | (insn[0] & 0x30); + /* The register fields are in the right place already. */ + + /* We can't relax this new opcode. */ + irel->r_addend = 0; + + switch ((insn[0] & 0x30) >> 4) + { + case 0: + newrel = R_RX_RH_ABS5p5B; + break; + case 1: + newrel = R_RX_RH_ABS5p5W; + break; + case 2: + newrel = R_RX_RH_ABS5p5L; + break; + } + + move_reloc (irel, srel, -2); + SNIP (2, 1, newrel); + } + + /* Special case DSP:5 format: MOVU.bw dsp:5[Rsrc],Rdst. */ + else if (code == 1 && symval/scale <= 31 + /* Decodable bits. */ + && (insn[0] & 0xf8) == 0x58 + /* Register MSBs. */ + && (insn[1] & 0x88) == 0x00) + { + int newrel = 0; + + insn[0] = 0xb0 | ((insn[0] & 0x04) << 1); + /* The register fields are in the right place already. */ + + /* We can't relax this new opcode. */ + irel->r_addend = 0; + + switch ((insn[0] & 0x08) >> 3) + { + case 0: + newrel = R_RX_RH_ABS5p5B; + break; + case 1: + newrel = R_RX_RH_ABS5p5W; + break; + } + + move_reloc (irel, srel, -2); + SNIP (2, 1, newrel); + } + } + + /* A DSP4 operand always follows a DSP6 operand, even if there's + no relocation for it. We have to read the code out of the + opcode to calculate the offset of the operand. */ + if (irel->r_addend & RX_RELAXA_DSP4) + { + int code6, offset = 0; + + GET_RELOC; + + code6 = insn[0] & 0x03; + switch (code6) + { + case 0: offset = 2; break; + case 1: offset = 3; break; + case 2: offset = 4; break; + case 3: offset = 2; break; + } + + code = (insn[0] & 0x0c) >> 2; + + if (code == 2 && symval / scale <= 255) + { + unsigned int newrel = ELF32_R_TYPE (srel->r_info); + + insn[0] &= 0xf3; + insn[0] |= 0x04; + newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info)); + if (newrel != ELF32_R_TYPE (srel->r_info)) + { + SNIP (offset+1, 1, newrel); + *again = TRUE; + } + } + + else if (code == 1 && symval == 0) + { + insn[0] &= 0xf3; + SNIP (offset, 1, R_RX_NONE); + *again = TRUE; + } + /* Special case DSP:5 format: MOV.bwl Rsrc,dsp:5[Rdst] */ + else if (code == 1 && symval/scale <= 31 + /* Decodable bits. */ + && (insn[0] & 0xc3) == 0xc3 + /* Width. */ + && (insn[0] & 0x30) != 3 + /* Register MSBs. */ + && (insn[1] & 0x88) == 0x00) + { + int newrel = 0; + + insn[0] = 0x80 | (insn[0] & 0x30); + /* The register fields are in the right place already. */ + + /* We can't relax this new opcode. */ + irel->r_addend = 0; + + switch ((insn[0] & 0x30) >> 4) + { + case 0: + newrel = R_RX_RH_ABS5p5B; + break; + case 1: + newrel = R_RX_RH_ABS5p5W; + break; + case 2: + newrel = R_RX_RH_ABS5p5L; + break; + } + + move_reloc (irel, srel, -2); + SNIP (2, 1, newrel); + } + } + + /* These always occur alone, but the offset depends on whether + it's a MEMEX opcode (0x06) or not. */ + if (irel->r_addend & RX_RELAXA_DSP14) + { + int offset; + GET_RELOC; + + if (insn[0] == 0x06) + offset = 3; + else + offset = 4; + + code = insn[1] & 3; + + if (code == 2 && symval / scale <= 255) + { + unsigned int newrel = ELF32_R_TYPE (srel->r_info); + + insn[1] &= 0xfc; + insn[1] |= 0x01; + newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info)); + if (newrel != ELF32_R_TYPE (srel->r_info)) + { + SNIP (offset, 1, newrel); + *again = TRUE; + } + } + else if (code == 1 && symval == 0) + { + insn[1] &= 0xfc; + SNIP (offset, 1, R_RX_NONE); + *again = TRUE; + } + } + + /* IMM* codes: + 0 00 imm:32 + 1 01 simm:8 + 2 10 simm:16 + 3 11 simm:24. */ + + /* These always occur alone. */ + if (irel->r_addend & RX_RELAXA_IMM6) + { + long ssymval; + + GET_RELOC; + + /* These relocations sign-extend, so we must do signed compares. */ + ssymval = (long) symval; + + code = insn[0] & 0x03; + + if (code == 0 && ssymval <= 8388607 && ssymval >= -8388608) + { + unsigned int newrel = ELF32_R_TYPE (srel->r_info); + + insn[0] &= 0xfc; + insn[0] |= 0x03; + newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info)); + if (newrel != ELF32_R_TYPE (srel->r_info)) + { + SNIP (2, 1, newrel); + *again = TRUE; + } + } + + else if (code == 3 && ssymval <= 32767 && ssymval >= -32768) + { + unsigned int newrel = ELF32_R_TYPE (srel->r_info); + + insn[0] &= 0xfc; + insn[0] |= 0x02; + newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info)); + if (newrel != ELF32_R_TYPE (srel->r_info)) + { + SNIP (2, 1, newrel); + *again = TRUE; + } + } + + /* Special case UIMM8 format: CMP #uimm8,Rdst. */ + else if (code == 2 && ssymval <= 255 && ssymval >= 16 + /* Decodable bits. */ + && (insn[0] & 0xfc) == 0x74 + /* Decodable bits. */ + && ((insn[1] & 0xf0) == 0x00)) + { + int newrel; + + insn[0] = 0x75; + insn[1] = 0x50 | (insn[1] & 0x0f); + + /* We can't relax this new opcode. */ + irel->r_addend = 0; + + if (STACK_REL_P (ELF32_R_TYPE (srel->r_info))) + newrel = R_RX_ABS8U; + else + newrel = R_RX_DIR8U; + + SNIP (2, 1, newrel); + *again = TRUE; + } + + else if (code == 2 && ssymval <= 127 && ssymval >= -128) + { + unsigned int newrel = ELF32_R_TYPE (srel->r_info); + + insn[0] &= 0xfc; + insn[0] |= 0x01; + newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info)); + if (newrel != ELF32_R_TYPE (srel->r_info)) + { + SNIP (2, 1, newrel); + *again = TRUE; + } + } + + /* Special case UIMM4 format: CMP, MUL, AND, OR. */ + else if (code == 1 && ssymval <= 15 && ssymval >= 0 + /* Decodable bits and immediate type. */ + && insn[0] == 0x75 + /* Decodable bits. */ + && (insn[1] & 0xc0) == 0x00) + { + static const int newop[4] = { 1, 3, 4, 5 }; + + insn[0] = 0x60 | newop[insn[1] >> 4]; + /* The register number doesn't move. */ + + /* We can't relax this new opcode. */ + irel->r_addend = 0; + + move_reloc (irel, srel, -1); + + SNIP (2, 1, R_RX_RH_UIMM4p8); + *again = TRUE; + } + + /* Special case UIMM4 format: ADD -> ADD/SUB. */ + else if (code == 1 && ssymval <= 15 && ssymval >= -15 + /* Decodable bits and immediate type. */ + && insn[0] == 0x71 + /* Same register for source and destination. */ + && ((insn[1] >> 4) == (insn[1] & 0x0f))) + { + int newrel; + + /* Note that we can't turn "add $0,Rs" into a NOP + because the flags need to be set right. */ + + if (ssymval < 0) + { + insn[0] = 0x60; /* Subtract. */ + newrel = R_RX_RH_UNEG4p8; + } + else + { + insn[0] = 0x62; /* Add. */ + newrel = R_RX_RH_UIMM4p8; + } + + /* The register number is in the right place. */ + + /* We can't relax this new opcode. */ + irel->r_addend = 0; + + move_reloc (irel, srel, -1); + + SNIP (2, 1, newrel); + *again = TRUE; + } + } + + /* These are either matched with a DSP6 (2-byte base) or an id24 + (3-byte base). */ + if (irel->r_addend & RX_RELAXA_IMM12) + { + int dspcode, offset = 0; + long ssymval; + + GET_RELOC; + + if ((insn[0] & 0xfc) == 0xfc) + dspcode = 1; /* Just something with one byte operand. */ + else + dspcode = insn[0] & 3; + switch (dspcode) + { + case 0: offset = 2; break; + case 1: offset = 3; break; + case 2: offset = 4; break; + case 3: offset = 2; break; + } + + /* These relocations sign-extend, so we must do signed compares. */ + ssymval = (long) symval; + + code = (insn[1] >> 2) & 3; + if (code == 0 && ssymval <= 8388607 && ssymval >= -8388608) + { + unsigned int newrel = ELF32_R_TYPE (srel->r_info); + + insn[1] &= 0xf3; + insn[1] |= 0x0c; + newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info)); + if (newrel != ELF32_R_TYPE (srel->r_info)) + { + SNIP (offset, 1, newrel); + *again = TRUE; + } + } + + else if (code == 3 && ssymval <= 32767 && ssymval >= -32768) + { + unsigned int newrel = ELF32_R_TYPE (srel->r_info); + + insn[1] &= 0xf3; + insn[1] |= 0x08; + newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info)); + if (newrel != ELF32_R_TYPE (srel->r_info)) + { + SNIP (offset, 1, newrel); + *again = TRUE; + } + } + + /* Special case UIMM8 format: MOV #uimm8,Rdst. */ + else if (code == 2 && ssymval <= 255 && ssymval >= 16 + /* Decodable bits. */ + && insn[0] == 0xfb + /* Decodable bits. */ + && ((insn[1] & 0x03) == 0x02)) + { + int newrel; + + insn[0] = 0x75; + insn[1] = 0x40 | (insn[1] >> 4); + + /* We can't relax this new opcode. */ + irel->r_addend = 0; + + if (STACK_REL_P (ELF32_R_TYPE (srel->r_info))) + newrel = R_RX_ABS8U; + else + newrel = R_RX_DIR8U; + + SNIP (2, 1, newrel); + *again = TRUE; + } + + else if (code == 2 && ssymval <= 127 && ssymval >= -128) + { + unsigned int newrel = ELF32_R_TYPE(srel->r_info); + + insn[1] &= 0xf3; + insn[1] |= 0x04; + newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info)); + if (newrel != ELF32_R_TYPE(srel->r_info)) + { + SNIP (offset, 1, newrel); + *again = TRUE; + } + } + + /* Special case UIMM4 format: MOV #uimm4,Rdst. */ + else if (code == 1 && ssymval <= 15 && ssymval >= 0 + /* Decodable bits. */ + && insn[0] == 0xfb + /* Decodable bits. */ + && ((insn[1] & 0x03) == 0x02)) + { + insn[0] = 0x66; + insn[1] = insn[1] >> 4; + + /* We can't relax this new opcode. */ + irel->r_addend = 0; + + move_reloc (irel, srel, -1); + + SNIP (2, 1, R_RX_RH_UIMM4p8); + *again = TRUE; + } + } + + if (irel->r_addend & RX_RELAXA_BRA) + { + unsigned int newrel = ELF32_R_TYPE (srel->r_info); + int max_pcrel3 = 4; + int alignment_glue = 0; + + GET_RELOC; + + /* Branches over alignment chunks are problematic, as + deleting bytes here makes the branch *further* away. We + can be agressive with branches within this alignment + block, but not branches outside it. */ + if ((prev_alignment == NULL + || symval < (bfd_vma)(sec_start + prev_alignment->r_offset)) + && (next_alignment == NULL + || symval > (bfd_vma)(sec_start + next_alignment->r_offset))) + alignment_glue = section_alignment_glue; + + if (ELF32_R_TYPE(srel[1].r_info) == R_RX_RH_RELAX + && srel[1].r_addend & RX_RELAXA_BRA + && srel[1].r_offset < irel->r_offset + pcrel) + max_pcrel3 ++; + + newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info)); + + /* The values we compare PCREL with are not what you'd + expect; they're off by a little to compensate for (1) + where the reloc is relative to the insn, and (2) how much + the insn is going to change when we relax it. */ + + /* These we have to decode. */ + switch (insn[0]) + { + case 0x04: /* BRA pcdsp:24 */ + if (-32768 + alignment_glue <= pcrel + && pcrel <= 32765 - alignment_glue) + { + insn[0] = 0x38; + SNIP (3, 1, newrel); + *again = TRUE; + } + break; + + case 0x38: /* BRA pcdsp:16 */ + if (-128 + alignment_glue <= pcrel + && pcrel <= 127 - alignment_glue) + { + insn[0] = 0x2e; + SNIP (2, 1, newrel); + *again = TRUE; + } + break; + + case 0x2e: /* BRA pcdsp:8 */ + /* Note that there's a risk here of shortening things so + much that we no longer fit this reloc; it *should* + only happen when you branch across a branch, and that + branch also devolves into BRA.S. "Real" code should + be OK. */ + if (max_pcrel3 + alignment_glue <= pcrel + && pcrel <= 10 - alignment_glue + && allow_pcrel3) + { + insn[0] = 0x08; + SNIP (1, 1, newrel); + move_reloc (irel, srel, -1); + *again = TRUE; + } + break; + + case 0x05: /* BSR pcdsp:24 */ + if (-32768 + alignment_glue <= pcrel + && pcrel <= 32765 - alignment_glue) + { + insn[0] = 0x39; + SNIP (1, 1, newrel); + *again = TRUE; + } + break; + + case 0x3a: /* BEQ.W pcdsp:16 */ + case 0x3b: /* BNE.W pcdsp:16 */ + if (-128 + alignment_glue <= pcrel + && pcrel <= 127 - alignment_glue) + { + insn[0] = 0x20 | (insn[0] & 1); + SNIP (1, 1, newrel); + *again = TRUE; + } + break; + + case 0x20: /* BEQ.B pcdsp:8 */ + case 0x21: /* BNE.B pcdsp:8 */ + if (max_pcrel3 + alignment_glue <= pcrel + && pcrel - alignment_glue <= 10 + && allow_pcrel3) + { + insn[0] = 0x10 | ((insn[0] & 1) << 3); + SNIP (1, 1, newrel); + move_reloc (irel, srel, -1); + *again = TRUE; + } + break; + + case 0x16: /* synthetic BNE dsp24 */ + case 0x1e: /* synthetic BEQ dsp24 */ + if (-32767 + alignment_glue <= pcrel + && pcrel <= 32766 - alignment_glue + && insn[1] == 0x04) + { + if (insn[0] == 0x16) + insn[0] = 0x3b; + else + insn[0] = 0x3a; + /* We snip out the bytes at the end else the reloc + will get moved too, and too much. */ + SNIP (3, 2, newrel); + move_reloc (irel, srel, -1); + *again = TRUE; + } + break; + } + + /* Special case - synthetic conditional branches, pcrel24. + Note that EQ and NE have been handled above. */ + if ((insn[0] & 0xf0) == 0x20 + && insn[1] == 0x06 + && insn[2] == 0x04 + && srel->r_offset != irel->r_offset + 1 + && -32767 + alignment_glue <= pcrel + && pcrel <= 32766 - alignment_glue) + { + insn[1] = 0x05; + insn[2] = 0x38; + SNIP (5, 1, newrel); + *again = TRUE; + } + + /* Special case - synthetic conditional branches, pcrel16 */ + if ((insn[0] & 0xf0) == 0x20 + && insn[1] == 0x05 + && insn[2] == 0x38 + && srel->r_offset != irel->r_offset + 1 + && -127 + alignment_glue <= pcrel + && pcrel <= 126 - alignment_glue) + { + int cond = (insn[0] & 0x0f) ^ 0x01; + + insn[0] = 0x20 | cond; + /* By moving the reloc first, we avoid having + delete_bytes move it also. */ + move_reloc (irel, srel, -2); + SNIP (2, 3, newrel); + *again = TRUE; + } + } + + BFD_ASSERT (nrelocs == 0); + + /* Special case - check MOV.bwl #IMM, dsp[reg] and see if we can + use MOV.bwl #uimm:8, dsp:5[r7] format. This is tricky + because it may have one or two relocations. */ + if ((insn[0] & 0xfc) == 0xf8 + && (insn[1] & 0x80) == 0x00 + && (insn[0] & 0x03) != 0x03) + { + int dcode, icode, reg, ioff, dscale, ilen; + bfd_vma disp_val = 0; + long imm_val = 0; + Elf_Internal_Rela * disp_rel = 0; + Elf_Internal_Rela * imm_rel = 0; + + /* Reset this. */ + srel = irel; + + dcode = insn[0] & 0x03; + icode = (insn[1] >> 2) & 0x03; + reg = (insn[1] >> 4) & 0x0f; + + ioff = dcode == 1 ? 3 : dcode == 2 ? 4 : 2; + + /* Figure out what the dispacement is. */ + if (dcode == 1 || dcode == 2) + { + /* There's a displacement. See if there's a reloc for it. */ + if (srel[1].r_offset == irel->r_offset + 2) + { + GET_RELOC; + disp_val = symval; + disp_rel = srel; + } + else + { + if (dcode == 1) + disp_val = insn[2]; + else + { +#if RX_OPCODE_BIG_ENDIAN + disp_val = insn[2] * 256 + insn[3]; +#else + disp_val = insn[2] + insn[3] * 256; +#endif + } + switch (insn[1] & 3) + { + case 1: + disp_val *= 2; + scale = 2; + break; + case 2: + disp_val *= 4; + scale = 4; + break; + } + } + } + + dscale = scale; + + /* Figure out what the immediate is. */ + if (srel[1].r_offset == irel->r_offset + ioff) + { + GET_RELOC; + imm_val = (long) symval; + imm_rel = srel; + } + else + { + unsigned char * ip = insn + ioff; + + switch (icode) + { + case 1: + /* For byte writes, we don't sign extend. Makes the math easier later. */ + if (scale == 1) + imm_val = ip[0]; + else + imm_val = (char) ip[0]; + break; + case 2: +#if RX_OPCODE_BIG_ENDIAN + imm_val = ((char) ip[0] << 8) | ip[1]; +#else + imm_val = ((char) ip[1] << 8) | ip[0]; +#endif + break; + case 3: +#if RX_OPCODE_BIG_ENDIAN + imm_val = ((char) ip[0] << 16) | (ip[1] << 8) | ip[2]; +#else + imm_val = ((char) ip[2] << 16) | (ip[1] << 8) | ip[0]; +#endif + break; + case 0: +#if RX_OPCODE_BIG_ENDIAN + imm_val = (ip[0] << 24) | (ip[1] << 16) | (ip[2] << 8) | ip[3]; +#else + imm_val = (ip[3] << 24) | (ip[2] << 16) | (ip[1] << 8) | ip[0]; +#endif + break; + } + } + + ilen = 2; + + switch (dcode) + { + case 1: + ilen += 1; + break; + case 2: + ilen += 2; + break; + } + + switch (icode) + { + case 1: + ilen += 1; + break; + case 2: + ilen += 2; + break; + case 3: + ilen += 3; + break; + case 4: + ilen += 4; + break; + } + + /* The shortcut happens when the immediate is 0..255, + register r0 to r7, and displacement (scaled) 0..31. */ + + if (0 <= imm_val && imm_val <= 255 + && 0 <= reg && reg <= 7 + && disp_val / dscale <= 31) + { + insn[0] = 0x3c | (insn[1] & 0x03); + insn[1] = (((disp_val / dscale) << 3) & 0x80) | (reg << 4) | ((disp_val/dscale) & 0x0f); + insn[2] = imm_val; + + if (disp_rel) + { + int newrel = R_RX_NONE; + + switch (dscale) + { + case 1: + newrel = R_RX_RH_ABS5p8B; + break; + case 2: + newrel = R_RX_RH_ABS5p8W; + break; + case 4: + newrel = R_RX_RH_ABS5p8L; + break; + } + disp_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (disp_rel->r_info), newrel); + move_reloc (irel, disp_rel, -1); + } + if (imm_rel) + { + imm_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (imm_rel->r_info), R_RX_DIR8U); + move_reloc (disp_rel ? disp_rel : irel, + imm_rel, + irel->r_offset - imm_rel->r_offset + 2); + } + + SNIPNR (3, ilen - 3); + *again = TRUE; + + /* We can't relax this new opcode. */ + irel->r_addend = 0; + } + } + } + + /* We can't reliably relax branches to DIR3U_PCREL unless we know + whatever they're branching over won't shrink any more. If we're + basically done here, do one more pass just for branches - but + don't request a pass after that one! */ + if (!*again && !allow_pcrel3) + { + bfd_boolean ignored; + + elf32_rx_relax_section (abfd, sec, link_info, &ignored, TRUE); + } + + return TRUE; + + error_return: + if (free_relocs != NULL) + free (free_relocs); + + if (free_contents != NULL) + free (free_contents); + + if (shndx_buf != NULL) + { + shndx_hdr->contents = NULL; + free (shndx_buf); + } + + if (free_intsyms != NULL) + free (free_intsyms); + + return FALSE; +} + +static bfd_boolean +elf32_rx_relax_section_wrapper (bfd * abfd, + asection * sec, + struct bfd_link_info * link_info, + bfd_boolean * again) +{ + return elf32_rx_relax_section (abfd, sec, link_info, again, FALSE); +} + +/* Function to set the ELF flag bits. */ + +static bfd_boolean +rx_elf_set_private_flags (bfd * abfd, flagword flags) +{ + elf_elfheader (abfd)->e_flags = flags; + elf_flags_init (abfd) = TRUE; + return TRUE; +} + +static bfd_boolean no_warn_mismatch = FALSE; + +void bfd_elf32_rx_set_target_flags (bfd_boolean); + +void +bfd_elf32_rx_set_target_flags (bfd_boolean user_no_warn_mismatch) +{ + no_warn_mismatch = user_no_warn_mismatch; +} + +/* Merge backend specific data from an object file to the output + object file when linking. */ + +static bfd_boolean +rx_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd) +{ + flagword old_flags; + flagword new_flags; + bfd_boolean error = FALSE; + + new_flags = elf_elfheader (ibfd)->e_flags; + old_flags = elf_elfheader (obfd)->e_flags; + + if (!elf_flags_init (obfd)) + { + /* First call, no flags set. */ + elf_flags_init (obfd) = TRUE; + elf_elfheader (obfd)->e_flags = new_flags; + } + else if (old_flags != new_flags) + { + flagword known_flags = E_FLAG_RX_64BIT_DOUBLES | E_FLAG_RX_DSP; + + if ((old_flags ^ new_flags) & known_flags) + { + /* Only complain if flag bits we care about do not match. + Other bits may be set, since older binaries did use some + deprecated flags. */ + if (no_warn_mismatch) + { + elf_elfheader (obfd)->e_flags = (new_flags | old_flags) & known_flags; + } + else + { + (*_bfd_error_handler) + ("ELF header flags mismatch: old_flags = 0x%.8lx, new_flags = 0x%.8lx, filename = %s", + old_flags, new_flags, bfd_get_filename (ibfd)); + error = TRUE; + } + } + else + elf_elfheader (obfd)->e_flags = new_flags & known_flags; + } + + if (error) + bfd_set_error (bfd_error_bad_value); + + return !error; +} + +static bfd_boolean +rx_elf_print_private_bfd_data (bfd * abfd, void * ptr) +{ + FILE * file = (FILE *) ptr; + flagword flags; + + BFD_ASSERT (abfd != NULL && ptr != NULL); + + /* Print normal ELF private data. */ + _bfd_elf_print_private_bfd_data (abfd, ptr); + + flags = elf_elfheader (abfd)->e_flags; + fprintf (file, _("private flags = 0x%lx:"), (long) flags); + + if (flags & E_FLAG_RX_64BIT_DOUBLES) + fprintf (file, _(" [64-bit doubles]")); + if (flags & E_FLAG_RX_DSP) + fprintf (file, _(" [dsp]")); + + fputc ('\n', file); + return TRUE; +} + +/* Return the MACH for an e_flags value. */ + +static int +elf32_rx_machine (bfd * abfd) +{ + if ((elf_elfheader (abfd)->e_flags & EF_RX_CPU_MASK) == EF_RX_CPU_RX) + return bfd_mach_rx; + + return 0; +} + +static bfd_boolean +rx_elf_object_p (bfd * abfd) +{ + bfd_default_set_arch_mach (abfd, bfd_arch_rx, + elf32_rx_machine (abfd)); + return TRUE; +} + + +#ifdef DEBUG +void +dump_symtab (bfd * abfd, void * internal_syms, void * external_syms) +{ + size_t locsymcount; + Elf_Internal_Sym * isymbuf; + Elf_Internal_Sym * isymend; + Elf_Internal_Sym * isym; + Elf_Internal_Shdr * symtab_hdr; + bfd_boolean free_internal = FALSE, free_external = FALSE; + char * st_info_str; + char * st_info_stb_str; + char * st_other_str; + char * st_shndx_str; + + if (! internal_syms) + { + internal_syms = bfd_malloc (1000); + free_internal = 1; + } + if (! external_syms) + { + external_syms = bfd_malloc (1000); + free_external = 1; + } + + symtab_hdr = &elf_tdata (abfd)->symtab_hdr; + locsymcount = symtab_hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym; + if (free_internal) + isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr, + symtab_hdr->sh_info, 0, + internal_syms, external_syms, NULL); + else + isymbuf = internal_syms; + isymend = isymbuf + locsymcount; + + for (isym = isymbuf ; isym < isymend ; isym++) + { + switch (ELF_ST_TYPE (isym->st_info)) + { + case STT_FUNC: st_info_str = "STT_FUNC"; + case STT_SECTION: st_info_str = "STT_SECTION"; + case STT_FILE: st_info_str = "STT_FILE"; + case STT_OBJECT: st_info_str = "STT_OBJECT"; + case STT_TLS: st_info_str = "STT_TLS"; + default: st_info_str = ""; + } + switch (ELF_ST_BIND (isym->st_info)) + { + case STB_LOCAL: st_info_stb_str = "STB_LOCAL"; + case STB_GLOBAL: st_info_stb_str = "STB_GLOBAL"; + default: st_info_stb_str = ""; + } + switch (ELF_ST_VISIBILITY (isym->st_other)) + { + case STV_DEFAULT: st_other_str = "STV_DEFAULT"; + case STV_INTERNAL: st_other_str = "STV_INTERNAL"; + case STV_PROTECTED: st_other_str = "STV_PROTECTED"; + default: st_other_str = ""; + } + switch (isym->st_shndx) + { + case SHN_ABS: st_shndx_str = "SHN_ABS"; + case SHN_COMMON: st_shndx_str = "SHN_COMMON"; + case SHN_UNDEF: st_shndx_str = "SHN_UNDEF"; + default: st_shndx_str = ""; + } + + printf ("isym = %p st_value = %lx st_size = %lx st_name = (%lu) %s " + "st_info = (%d) %s %s st_other = (%d) %s st_shndx = (%d) %s\n", + isym, + (unsigned long) isym->st_value, + (unsigned long) isym->st_size, + isym->st_name, + bfd_elf_string_from_elf_section (abfd, symtab_hdr->sh_link, + isym->st_name), + isym->st_info, st_info_str, st_info_stb_str, + isym->st_other, st_other_str, + isym->st_shndx, st_shndx_str); + } + if (free_internal) + free (internal_syms); + if (free_external) + free (external_syms); +} + +char * +rx_get_reloc (long reloc) +{ + if (0 <= reloc && reloc < R_RX_max) + return rx_elf_howto_table[reloc].name; + return ""; +} +#endif /* DEBUG */ + + +/* We must take care to keep the on-disk copy of any code sections + that are fully linked swapped if the target is big endian, to match + the Renesas tools. */ + +/* The rule is: big endian object that are final-link executables, + have code sections stored with 32-bit words swapped relative to + what you'd get by default. */ + +static bfd_boolean +rx_get_section_contents (bfd * abfd, + sec_ptr section, + void * location, + file_ptr offset, + bfd_size_type count) +{ + int exec = (abfd->flags & EXEC_P) ? 1 : 0; + int s_code = (section->flags & SEC_CODE) ? 1 : 0; + bfd_boolean rv; + +#ifdef DJDEBUG + fprintf (stderr, "dj: get %ld %ld from %s %s e%d sc%d %08lx:%08lx\n", + (long) offset, (long) count, section->name, + bfd_big_endian(abfd) ? "be" : "le", + exec, s_code, (long unsigned) section->filepos, + (long unsigned) offset); +#endif + + if (exec && s_code && bfd_big_endian (abfd)) + { + char * cloc = (char *) location; + bfd_size_type cnt, end_cnt; + + rv = TRUE; + + /* Fetch and swap unaligned bytes at the beginning. */ + if (offset % 4) + { + char buf[4]; + + rv = _bfd_generic_get_section_contents (abfd, section, buf, + (offset & -4), 4); + if (!rv) + return FALSE; + + bfd_putb32 (bfd_getl32 (buf), buf); + + cnt = 4 - (offset % 4); + if (cnt > count) + cnt = count; + + memcpy (location, buf + (offset % 4), cnt); + + count -= cnt; + offset += cnt; + cloc += count; + } + + end_cnt = count % 4; + + /* Fetch and swap the middle bytes. */ + if (count >= 4) + { + rv = _bfd_generic_get_section_contents (abfd, section, cloc, offset, + count - end_cnt); + if (!rv) + return FALSE; + + for (cnt = count; cnt >= 4; cnt -= 4, cloc += 4) + bfd_putb32 (bfd_getl32 (cloc), cloc); + } + + /* Fetch and swap the end bytes. */ + if (end_cnt > 0) + { + char buf[4]; + + /* Fetch the end bytes. */ + rv = _bfd_generic_get_section_contents (abfd, section, buf, + offset + count - end_cnt, 4); + if (!rv) + return FALSE; + + bfd_putb32 (bfd_getl32 (buf), buf); + memcpy (cloc, buf, end_cnt); + } + } + else + rv = _bfd_generic_get_section_contents (abfd, section, location, offset, count); + + return rv; +} + +#ifdef DJDEBUG +static bfd_boolean +rx2_set_section_contents (bfd * abfd, + sec_ptr section, + const void * location, + file_ptr offset, + bfd_size_type count) +{ + bfd_size_type i; + + fprintf (stderr, " set sec %s %08x loc %p offset %#x count %#x\n", + section->name, (unsigned) section->vma, location, (int) offset, (int) count); + for (i = 0; i < count; i++) + { + if (i % 16 == 0 && i > 0) + fprintf (stderr, "\n"); + + if (i % 16 && i % 4 == 0) + fprintf (stderr, " "); + + if (i % 16 == 0) + fprintf (stderr, " %08x:", (int) (section->vma + offset + i)); + + fprintf (stderr, " %02x", ((unsigned char *) location)[i]); + } + fprintf (stderr, "\n"); + + return _bfd_elf_set_section_contents (abfd, section, location, offset, count); +} +#define _bfd_elf_set_section_contents rx2_set_section_contents +#endif + +static bfd_boolean +rx_set_section_contents (bfd * abfd, + sec_ptr section, + const void * location, + file_ptr offset, + bfd_size_type count) +{ + bfd_boolean exec = (abfd->flags & EXEC_P) ? TRUE : FALSE; + bfd_boolean s_code = (section->flags & SEC_CODE) ? TRUE : FALSE; + bfd_boolean rv; + char * swapped_data = NULL; + bfd_size_type i; + bfd_vma caddr = section->vma + offset; + file_ptr faddr = 0; + bfd_size_type scount; + +#ifdef DJDEBUG + bfd_size_type i; + + fprintf (stderr, "\ndj: set %ld %ld to %s %s e%d sc%d\n", + (long) offset, (long) count, section->name, + bfd_big_endian (abfd) ? "be" : "le", + exec, s_code); + + for (i = 0; i < count; i++) + { + int a = section->vma + offset + i; + + if (a % 16 == 0 && a > 0) + fprintf (stderr, "\n"); + + if (a % 16 && a % 4 == 0) + fprintf (stderr, " "); + + if (a % 16 == 0 || i == 0) + fprintf (stderr, " %08x:", (int) (section->vma + offset + i)); + + fprintf (stderr, " %02x", ((unsigned char *) location)[i]); + } + + fprintf (stderr, "\n"); +#endif + + if (! exec || ! s_code || ! bfd_big_endian (abfd)) + return _bfd_elf_set_section_contents (abfd, section, location, offset, count); + + while (count > 0 && caddr > 0 && caddr % 4) + { + switch (caddr % 4) + { + case 0: faddr = offset + 3; break; + case 1: faddr = offset + 1; break; + case 2: faddr = offset - 1; break; + case 3: faddr = offset - 3; break; + } + + rv = _bfd_elf_set_section_contents (abfd, section, location, faddr, 1); + if (! rv) + return rv; + + location ++; + offset ++; + count --; + caddr ++; + } + + scount = (int)(count / 4) * 4; + if (scount > 0) + { + char * cloc = (char *) location; + + swapped_data = (char *) bfd_alloc (abfd, count); + + for (i = 0; i < count; i += 4) + { + bfd_vma v = bfd_getl32 (cloc + i); + bfd_putb32 (v, swapped_data + i); + } + + rv = _bfd_elf_set_section_contents (abfd, section, swapped_data, offset, scount); + + if (!rv) + return rv; + } + + count -= scount; + location += scount; + offset += scount; + + if (count > 0) + { + caddr = section->vma + offset; + while (count > 0) + { + switch (caddr % 4) + { + case 0: faddr = offset + 3; break; + case 1: faddr = offset + 1; break; + case 2: faddr = offset - 1; break; + case 3: faddr = offset - 3; break; + } + rv = _bfd_elf_set_section_contents (abfd, section, location, faddr, 1); + if (! rv) + return rv; + + location ++; + offset ++; + count --; + caddr ++; + } + } + + return TRUE; +} + +static bfd_boolean +rx_final_link (bfd * abfd, struct bfd_link_info * info) +{ + asection * o; + + for (o = abfd->sections; o != NULL; o = o->next) + { +#ifdef DJDEBUG + fprintf (stderr, "sec %s fl %x vma %lx lma %lx size %lx raw %lx\n", + o->name, o->flags, o->vma, o->lma, o->size, o->rawsize); +#endif + if (o->flags & SEC_CODE + && bfd_big_endian (abfd) + && (o->size % 4 || o->rawsize % 4)) + { +#ifdef DJDEBUG + fprintf (stderr, "adjusting...\n"); +#endif + o->size += 4 - (o->size % 4); + o->rawsize += 4 - (o->rawsize % 4); + } + } + + return bfd_elf_final_link (abfd, info); +} + +static bfd_boolean +elf32_rx_modify_program_headers (bfd * abfd ATTRIBUTE_UNUSED, + struct bfd_link_info * info ATTRIBUTE_UNUSED) +{ + const struct elf_backend_data * bed; + struct elf_obj_tdata * tdata; + Elf_Internal_Phdr * phdr; + unsigned int count; + unsigned int i; + + bed = get_elf_backend_data (abfd); + tdata = elf_tdata (abfd); + phdr = tdata->phdr; + count = tdata->program_header_size / bed->s->sizeof_phdr; + + for (i = count; i-- != 0; ) + if (phdr[i].p_type == PT_LOAD) + { + /* The Renesas tools expect p_paddr to be zero. However, + there is no other way to store the writable data in ROM for + startup initialization. So, we let the linker *think* + we're using paddr and vaddr the "usual" way, but at the + last minute we move the paddr into the vaddr (which is what + the simulator uses) and zero out paddr. Note that this + does not affect the section headers, just the program + headers. We hope. */ + phdr[i].p_vaddr = phdr[i].p_paddr; + /* If we zero out p_paddr, then the LMA in the section table + becomes wrong. */ + /*phdr[i].p_paddr = 0;*/ + } + + return TRUE; +} + +#define ELF_ARCH bfd_arch_rx +#define ELF_MACHINE_CODE EM_RX +#define ELF_MAXPAGESIZE 0x1000 + +#define TARGET_BIG_SYM bfd_elf32_rx_be_vec +#define TARGET_BIG_NAME "elf32-rx-be" + +#define TARGET_LITTLE_SYM bfd_elf32_rx_le_vec +#define TARGET_LITTLE_NAME "elf32-rx-le" + +#define elf_info_to_howto_rel NULL +#define elf_info_to_howto rx_info_to_howto_rela +#define elf_backend_object_p rx_elf_object_p +#define elf_backend_relocate_section rx_elf_relocate_section +#define elf_symbol_leading_char ('_') +#define elf_backend_can_gc_sections 1 +#define elf_backend_modify_program_headers elf32_rx_modify_program_headers + +#define bfd_elf32_bfd_reloc_type_lookup rx_reloc_type_lookup +#define bfd_elf32_bfd_reloc_name_lookup rx_reloc_name_lookup +#define bfd_elf32_bfd_set_private_flags rx_elf_set_private_flags +#define bfd_elf32_bfd_merge_private_bfd_data rx_elf_merge_private_bfd_data +#define bfd_elf32_bfd_print_private_bfd_data rx_elf_print_private_bfd_data +#define bfd_elf32_get_section_contents rx_get_section_contents +#define bfd_elf32_set_section_contents rx_set_section_contents +#define bfd_elf32_bfd_final_link rx_final_link +#define bfd_elf32_bfd_relax_section elf32_rx_relax_section_wrapper + +#include "elf32-target.h" diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 2450b2d..7fe6578 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -1646,6 +1646,30 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", "BFD_RELOC_AVR_LDI", "BFD_RELOC_AVR_6", "BFD_RELOC_AVR_6_ADIW", + "BFD_RELOC_RX_NEG8", + "BFD_RELOC_RX_NEG16", + "BFD_RELOC_RX_NEG24", + "BFD_RELOC_RX_NEG32", + "BFD_RELOC_RX_16_OP", + "BFD_RELOC_RX_24_OP", + "BFD_RELOC_RX_32_OP", + "BFD_RELOC_RX_8U", + "BFD_RELOC_RX_16U", + "BFD_RELOC_RX_24U", + "BFD_RELOC_RX_DIR3U_PCREL", + "BFD_RELOC_RX_DIFF", + "BFD_RELOC_RX_GPRELB", + "BFD_RELOC_RX_GPRELW", + "BFD_RELOC_RX_GPRELL", + "BFD_RELOC_RX_SYM", + "BFD_RELOC_RX_OP_SUBTRACT", + "BFD_RELOC_RX_ABS8", + "BFD_RELOC_RX_ABS16", + "BFD_RELOC_RX_ABS32", + "BFD_RELOC_RX_ABS16U", + "BFD_RELOC_RX_ABS16UW", + "BFD_RELOC_RX_ABS16UL", + "BFD_RELOC_RX_RELAX", "BFD_RELOC_390_12", "BFD_RELOC_390_GOT12", "BFD_RELOC_390_PLT32", diff --git a/bfd/reloc.c b/bfd/reloc.c index 3be29fe..0ea7a85 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -4052,6 +4052,57 @@ ENUMDOC instructions ENUM + BFD_RELOC_RX_NEG8 +ENUMX + BFD_RELOC_RX_NEG16 +ENUMX + BFD_RELOC_RX_NEG24 +ENUMX + BFD_RELOC_RX_NEG32 +ENUMX + BFD_RELOC_RX_16_OP +ENUMX + BFD_RELOC_RX_24_OP +ENUMX + BFD_RELOC_RX_32_OP +ENUMX + BFD_RELOC_RX_8U +ENUMX + BFD_RELOC_RX_16U +ENUMX + BFD_RELOC_RX_24U +ENUMX + BFD_RELOC_RX_DIR3U_PCREL +ENUMX + BFD_RELOC_RX_DIFF +ENUMX + BFD_RELOC_RX_GPRELB +ENUMX + BFD_RELOC_RX_GPRELW +ENUMX + BFD_RELOC_RX_GPRELL +ENUMX + BFD_RELOC_RX_SYM +ENUMX + BFD_RELOC_RX_OP_SUBTRACT +ENUMX + BFD_RELOC_RX_ABS8 +ENUMX + BFD_RELOC_RX_ABS16 +ENUMX + BFD_RELOC_RX_ABS32 +ENUMX + BFD_RELOC_RX_ABS16U +ENUMX + BFD_RELOC_RX_ABS16UW +ENUMX + BFD_RELOC_RX_ABS16UL +ENUMX + BFD_RELOC_RX_RELAX +ENUMDOC + Renesas RX Relocations. + +ENUM BFD_RELOC_390_12 ENUMDOC Direct 12 bit. diff --git a/bfd/targets.c b/bfd/targets.c index a33790b..347c6cd 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -641,6 +641,8 @@ extern const bfd_target bfd_elf32_pjl_vec; extern const bfd_target bfd_elf32_powerpc_vec; extern const bfd_target bfd_elf32_powerpcle_vec; extern const bfd_target bfd_elf32_powerpc_vxworks_vec; +extern const bfd_target bfd_elf32_rx_le_vec; +extern const bfd_target bfd_elf32_rx_be_vec; extern const bfd_target bfd_elf32_s390_vec; extern const bfd_target bfd_elf32_bigscore_vec; extern const bfd_target bfd_elf32_littlescore_vec; @@ -978,6 +980,8 @@ static const bfd_target * const _bfd_target_vector[] = &bfd_elf32_powerpc_vec, &bfd_elf32_powerpc_vxworks_vec, &bfd_elf32_powerpcle_vec, + &bfd_elf32_rx_be_vec, + &bfd_elf32_rx_le_vec, &bfd_elf32_s390_vec, #ifdef BFD64 &bfd_elf32_bigscore_vec, diff --git a/binutils/ChangeLog b/binutils/ChangeLog index a6275e1..6a4958d 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2009-09-29 DJ Delorie + + * readelf.c: Add support for RX target. + * MAINTAINERS: Add DJ and NickC as maintainers for RX. + 2009-09-28 Alan Modra * configure.in: Don't invoke configure.tgt on $enable_targets. diff --git a/binutils/MAINTAINERS b/binutils/MAINTAINERS index 6d31632..97fb566 100644 --- a/binutils/MAINTAINERS +++ b/binutils/MAINTAINERS @@ -104,6 +104,8 @@ responsibility among the other maintainers. PPC Geoff Keating PPC Alan Modra PPC vector ext Aldy Hernandez + RX DJ Delorie + RX Nick Clifton s390, s390x Martin Schwidefsky SCORE Mei Ligang SH Alexandre Oliva diff --git a/binutils/readelf.c b/binutils/readelf.c index a57b5ad..15f4ac0 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -130,6 +130,7 @@ #include "elf/pj.h" #include "elf/ppc.h" #include "elf/ppc64.h" +#include "elf/rx.h" #include "elf/s390.h" #include "elf/score.h" #include "elf/sh.h" @@ -604,6 +605,7 @@ guess_is_rela (unsigned int e_machine) case EM_NIOS32: case EM_PPC64: case EM_PPC: + case EM_RX: case EM_S390: case EM_S390_OLD: case EM_SH: @@ -1215,6 +1217,10 @@ dump_relocations (FILE * file, case EM_MICROBLAZE_OLD: rtype = elf_microblaze_reloc_type (type); break; + + case EM_RX: + rtype = elf_rx_reloc_type (type); + break; } if (rtype == NULL) @@ -1887,6 +1893,7 @@ get_machine_name (unsigned e_machine) case EM_CR16_OLD: return "National Semiconductor's CR16"; case EM_MICROBLAZE: return "Xilinx MicroBlaze"; case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze"; + case EM_RX: return "Renesas RX"; default: snprintf (buff, sizeof (buff), _(": 0x%x"), e_machine); return buff; @@ -2431,6 +2438,12 @@ get_machine_flags (unsigned e_flags, unsigned e_machine) if ((e_flags & EF_VAX_GFLOAT)) strcat (buf, ", G-Float"); break; + + case EM_RX: + if (e_flags & E_FLAG_RX_64BIT_DOUBLES) + strcat (buf, ", 64-bit doubles"); + if (e_flags & E_FLAG_RX_DSP) + strcat (buf, ", dsp"); } } @@ -8054,6 +8067,8 @@ is_32bit_abs_reloc (unsigned int reloc_type) return reloc_type == 1; /* R_PPC64_ADDR32. */ case EM_PPC: return reloc_type == 1; /* R_PPC_ADDR32. */ + case EM_RX: + return reloc_type == 1; /* R_RX_DIR32. */ case EM_S370: return reloc_type == 1; /* R_I370_ADDR31. */ case EM_S390_OLD: diff --git a/gas/ChangeLog b/gas/ChangeLog index 4183f56..bf5e63a 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,23 @@ +2009-09-29 DJ Delorie + + * Makefile.am: Add RX target. + * configure.in: Likewise. + * configure.tgt: Likewise. + * read.c (do_repeat_with_expander): New function. + * read.h: Provide a prototype for do_repeat_with_expander. + * doc/Makefile.am: Add RX target documentation. + * doc/all.texi: Likewise. + * doc/as.texinfo: Likewise. + * Makefile.in: Regenerate. + * NEWS: Mention support for RX architecture. + * configure: Regenerate. + * doc/Makefile.in: Regenerate. + * config/rx-defs.h: New file. + * config/rx-parse.y: New file. + * config/tc-rx.h: New file. + * config/tc-rx.c: New file. + * doc/c-rx.texi: New file. + 2009-09-25 Martin Thuresson Update soruces to make alpha, arc and arm targets compile cleanly diff --git a/gas/Makefile.am b/gas/Makefile.am index d3e8836..87fbe3c 100644 --- a/gas/Makefile.am +++ b/gas/Makefile.am @@ -81,6 +81,7 @@ CPU_TYPES = \ pdp11 \ pj \ ppc \ + rx \ s390 \ score \ sh \ @@ -284,6 +285,7 @@ TARGET_CPU_CFILES = \ config/tc-pdp11.c \ config/tc-pj.c \ config/tc-ppc.c \ + config/tc-rx.c \ config/tc-s390.c \ config/tc-score.c \ config/tc-sh.c \ @@ -346,6 +348,7 @@ TARGET_CPU_HFILES = \ config/tc-pdp11.h \ config/tc-pj.h \ config/tc-ppc.h \ + config/tc-rx.h \ config/tc-s390.h \ config/tc-score.h \ config/tc-sh.h \ @@ -499,7 +502,8 @@ noinst_SCRIPTS = $(GDBINIT) EXTRA_SCRIPTS = .gdbinit EXTRA_DIST = m68k-parse.c itbl-parse.c itbl-parse.h itbl-lex.c \ - bfin-parse.c bfin-parse.h bfin-lex.c + bfin-parse.c bfin-parse.h bfin-lex.c \ + rx-parse.c rx-parse.h diststuff: $(EXTRA_DIST) info @@ -628,6 +632,15 @@ endif $(COMPILE) -c `test -f bfin-lex.c || echo $(srcdir)/`bfin-lex.c $(NO_WERROR) endif +rx-parse.c: $(srcdir)/config/rx-parse.y + $(SHELL) $(YLWRAP) $(srcdir)/config/rx-parse.y y.tab.c rx-parse.c y.tab.h rx-parse.h -- $(YACCCOMPILE) -d ; +rx-parse.h: rx-parse.c +rx-parse.o: rx-parse.c rx-parse.h $(srcdir)/config/rx-defs.h \ + $(INCDIR)/elf/common.h $(INCDIR)/elf/rx.h $(BFDDIR)/libbfd.h + +rx-defs.h: ; @true +$(srcdir)/config/rx-defs.h: ; @true + # The instruction table specification lexical analyzer and parser. # Disable -Werror, if it has been enabled, since old versions of bison/ diff --git a/gas/Makefile.in b/gas/Makefile.in index e313686..5aa485e 100644 --- a/gas/Makefile.in +++ b/gas/Makefile.in @@ -347,6 +347,7 @@ CPU_TYPES = \ pdp11 \ pj \ ppc \ + rx \ s390 \ score \ sh \ @@ -548,6 +549,7 @@ TARGET_CPU_CFILES = \ config/tc-pdp11.c \ config/tc-pj.c \ config/tc-ppc.c \ + config/tc-rx.c \ config/tc-s390.c \ config/tc-score.c \ config/tc-sh.c \ @@ -610,6 +612,7 @@ TARGET_CPU_HFILES = \ config/tc-pdp11.h \ config/tc-pj.h \ config/tc-ppc.h \ + config/tc-rx.h \ config/tc-s390.h \ config/tc-score.h \ config/tc-sh.h \ @@ -755,7 +758,8 @@ POTFILES = $(MULTI_CFILES) $(CONFIG_ATOF_CFILES) \ noinst_SCRIPTS = $(GDBINIT) EXTRA_SCRIPTS = .gdbinit EXTRA_DIST = m68k-parse.c itbl-parse.c itbl-parse.h itbl-lex.c \ - bfin-parse.c bfin-parse.h bfin-lex.c + bfin-parse.c bfin-parse.h bfin-lex.c \ + rx-parse.c rx-parse.h DISTCLEANFILES = targ-cpu.h obj-format.h targ-env.h itbl-cpu.h cgen-desc.h @@ -989,6 +993,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc-pdp11.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc-pj.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc-ppc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc-rx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc-s390.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc-score.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc-sh.Po@am__quote@ @@ -1646,6 +1651,20 @@ tc-ppc.obj: config/tc-ppc.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tc-ppc.obj `if test -f 'config/tc-ppc.c'; then $(CYGPATH_W) 'config/tc-ppc.c'; else $(CYGPATH_W) '$(srcdir)/config/tc-ppc.c'; fi` +tc-rx.o: config/tc-rx.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tc-rx.o -MD -MP -MF $(DEPDIR)/tc-rx.Tpo -c -o tc-rx.o `test -f 'config/tc-rx.c' || echo '$(srcdir)/'`config/tc-rx.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/tc-rx.Tpo $(DEPDIR)/tc-rx.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='config/tc-rx.c' object='tc-rx.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tc-rx.o `test -f 'config/tc-rx.c' || echo '$(srcdir)/'`config/tc-rx.c + +tc-rx.obj: config/tc-rx.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tc-rx.obj -MD -MP -MF $(DEPDIR)/tc-rx.Tpo -c -o tc-rx.obj `if test -f 'config/tc-rx.c'; then $(CYGPATH_W) 'config/tc-rx.c'; else $(CYGPATH_W) '$(srcdir)/config/tc-rx.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/tc-rx.Tpo $(DEPDIR)/tc-rx.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='config/tc-rx.c' object='tc-rx.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tc-rx.obj `if test -f 'config/tc-rx.c'; then $(CYGPATH_W) 'config/tc-rx.c'; else $(CYGPATH_W) '$(srcdir)/config/tc-rx.c'; fi` + tc-s390.o: config/tc-s390.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tc-s390.o -MD -MP -MF $(DEPDIR)/tc-s390.Tpo -c -o tc-s390.o `test -f 'config/tc-s390.c' || echo '$(srcdir)/'`config/tc-s390.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/tc-s390.Tpo $(DEPDIR)/tc-s390.Po @@ -2534,6 +2553,15 @@ bfin-lex.o: bfin-lex.c bfin-parse.h $(srcdir)/config/bfin-defs.h @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `test -f bfin-lex.c || echo $(srcdir)/`bfin-lex.c $(NO_WERROR) +rx-parse.c: $(srcdir)/config/rx-parse.y + $(SHELL) $(YLWRAP) $(srcdir)/config/rx-parse.y y.tab.c rx-parse.c y.tab.h rx-parse.h -- $(YACCCOMPILE) -d ; +rx-parse.h: rx-parse.c +rx-parse.o: rx-parse.c rx-parse.h $(srcdir)/config/rx-defs.h \ + $(INCDIR)/elf/common.h $(INCDIR)/elf/rx.h $(BFDDIR)/libbfd.h + +rx-defs.h: ; @true +$(srcdir)/config/rx-defs.h: ; @true + # The instruction table specification lexical analyzer and parser. # Disable -Werror, if it has been enabled, since old versions of bison/ diff --git a/gas/NEWS b/gas/NEWS index 3fa3809..adb31f5 100644 --- a/gas/NEWS +++ b/gas/NEWS @@ -1,5 +1,7 @@ -*- text -*- +* Add support for the Renesas RX processor. + Changes in 2.20: * GNU/Linux targets now supports "gnu_unique_object" as a value in the .type diff --git a/gas/config/rx-defs.h b/gas/config/rx-defs.h new file mode 100644 index 0000000..c4648d2 --- /dev/null +++ b/gas/config/rx-defs.h @@ -0,0 +1,57 @@ +/* rx-defs.h Renesas RX internal definitions + Copyright 2008, 2009 + Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + + GAS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + GAS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GAS; see the file COPYING. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +#ifndef RX_DEFS_H +#define RX_DEFS_H + +/* Third operand to rx_op. */ +#define RXREL_SIGNED 0 +#define RXREL_UNSIGNED 1 +#define RXREL_NEGATIVE 2 +#define RXREL_PCREL 3 +#define RXREL_NEGATIVE_BORROW 4 + +#define RX_RELAX_NONE 0 +#define RX_RELAX_BRANCH 1 +#define RX_RELAX_IMM 2 +#define RX_RELAX_DISP 3 + +extern int rx_error (char *); +extern void rx_lex_init (char *, char *); +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_field (int, int, int); +extern void rx_op (expressionS, int, int); +extern void rx_disp3 (expressionS, int); +extern void rx_field5s (expressionS); +extern void rx_field5s2 (expressionS); +extern void rx_relax (int, int); +extern void rx_linkrelax_dsp (int); +extern void rx_linkrelax_imm (int); +extern void rx_linkrelax_branch (void); +extern int rx_parse (void); +extern int rx_wrap (void); + +extern char * rx_lex_start; +extern char * rx_lex_end; +#endif diff --git a/gas/config/rx-parse.y b/gas/config/rx-parse.y new file mode 100644 index 0000000..0bcafc8 --- /dev/null +++ b/gas/config/rx-parse.y @@ -0,0 +1,1555 @@ +/* rx-parse.y Renesas RX parser + Copyright 2008, 2009 + Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + + GAS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + GAS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GAS; see the file COPYING. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ +%{ + +#include "as.h" +#include "safe-ctype.h" +#include "rx-defs.h" + +static int rx_lex (void); + +#define COND_EQ 0 +#define COND_NE 1 + +#define MEMEX 0x06 + +#define BSIZE 0 +#define WSIZE 1 +#define LSIZE 2 + +/* .sb .sw .l .uw */ +static int sizemap[] = { BSIZE, WSIZE, LSIZE, WSIZE }; + +/* Ok, here are the rules for using these macros... + + B*() is used to specify the base opcode bytes. Fields to be filled + in later, leave zero. Call this first. + + F() and FE() are used to fill in fields within the base opcode bytes. You MUST + call B*() before any F() or FE(). + + [UN]*O*(), PC*() appends operands to the end of the opcode. You + must call P() and B*() before any of these, so that the fixups + have the right byte location. + O = signed, UO = unsigned, NO = negated, PC = pcrel + + IMM() adds an immediate and fills in the field for it. + NIMM() same, but negates the immediate. + NBIMM() same, but negates the immediate, for sbb. + DSP() adds a displacement, and fills in the field for it. + + Note that order is significant for the O, IMM, and DSP macros, as + they append their data to the operand buffer in the order that you + call them. + + Use "disp" for displacements whenever possible; this handles the + "0" case properly. */ + +#define B1(b1) rx_base1 (b1) +#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) + +/* 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) +#define FE(exp,pos,sz) rx_field (exp_val (exp), pos, sz); + +#define O1(v) rx_op (v, 1, RXREL_SIGNED) +#define O2(v) rx_op (v, 2, RXREL_SIGNED) +#define O3(v) rx_op (v, 3, RXREL_SIGNED) +#define O4(v) rx_op (v, 4, RXREL_SIGNED) + +#define UO1(v) rx_op (v, 1, RXREL_UNSIGNED) +#define UO2(v) rx_op (v, 2, RXREL_UNSIGNED) +#define UO3(v) rx_op (v, 3, RXREL_UNSIGNED) +#define UO4(v) rx_op (v, 4, RXREL_UNSIGNED) + +#define NO1(v) rx_op (v, 1, RXREL_NEGATIVE) +#define NO2(v) rx_op (v, 2, RXREL_NEGATIVE) +#define NO3(v) rx_op (v, 3, RXREL_NEGATIVE) +#define NO4(v) rx_op (v, 4, RXREL_NEGATIVE) + +#define PC1(v) rx_op (v, 1, RXREL_PCREL) +#define PC2(v) rx_op (v, 2, RXREL_PCREL) +#define PC3(v) rx_op (v, 3, RXREL_PCREL) + +#define IMM(v,pos) F (immediate (v, RXREL_SIGNED, pos), pos, 2); \ + if (v.X_op != O_constant && v.X_op != O_big) rx_linkrelax_imm (pos) +#define NIMM(v,pos) F (immediate (v, RXREL_NEGATIVE, pos), pos, 2) +#define NBIMM(v,pos) F (immediate (v, RXREL_NEGATIVE_BORROW, pos), pos, 2) +#define DSP(v,pos,msz) if (!v.X_md) rx_relax (RX_RELAX_DISP, pos); \ + else rx_linkrelax_dsp (pos); \ + F (displacement (v, msz), pos, 2) + +#define id24(a,b2,b3) B3 (0xfb+a, b2, b3) + +static int rx_intop (expressionS, int); +static int rx_uintop (expressionS, int); +static int rx_disp3op (expressionS); +static int rx_disp5op (expressionS *, int); +static int rx_disp5op0 (expressionS *, int); +static int exp_val (expressionS exp); +static expressionS zero_expr (void); +static int immediate (expressionS, int, int); +static int displacement (expressionS, int); +static void rtsd_immediate (expressionS); + +static int need_flag = 0; +static int rx_in_brackets = 0; +static int rx_last_token = 0; +static char * rx_init_start; +static char * rx_last_exp_start = 0; +static int sub_op; +static int sub_op2; + +#define YYDEBUG 1 +#define YYERROR_VERBOSE 1 + +%} + +%name-prefix="rx_" + +%union { + int regno; + expressionS exp; +} + +%type REG FLAG CREG BCND BMCND SCCND +%type flag bwl bw memex +%type EXPR disp + +%token REG FLAG CREG + +%token EXPR UNKNOWN_OPCODE IS_OPCODE + +%token DOT_S DOT_B DOT_W DOT_L DOT_A DOT_UB DOT_UW + +%token ABS ADC ADD AND_ +%token BCLR BCND BMCND BNOT BRA BRK BSET BSR BTST +%token CLRPSW CMP +%token DBT DIV DIVU +%token EDIV EDIVU EMUL EMULU +%token FADD FCMP FDIV FMUL FREIT FSUB FTOI +%token INT ITOF +%token JMP JSR +%token MACHI MACLO MAX MIN MOV MOVU MUL MULHI MULLO MULU MVFACHI MVFACMI MVFACLO +%token MVFC MVTACHI MVTACLO MVTC MVTIPL +%token NEG NOP NOT +%token OR +%token POP POPC POPM PUSH PUSHA PUSHC PUSHM +%token RACW REIT REVL REVW RMPA ROLC RORC ROTL ROTR ROUND RTE RTFI RTS RTSD +%token SAT SATR SBB SCCND SCMPU SETPSW SHAR SHLL SHLR SMOVB SMOVF +%token SMOVU SSTR STNZ STOP STZ SUB SUNTIL SWHILE +%token TST +%token WAIT +%token XCHG XOR + +%% +/* ====================================================================== */ + +statement : + + UNKNOWN_OPCODE + { as_bad (_("Unknown opcode: %s"), rx_init_start); } + +/* ---------------------------------------------------------------------- */ + + | BRK + { B1 (0x00); } + + | DBT + { B1 (0x01); } + + | RTS + { B1 (0x02); } + + | NOP + { B1 (0x03); } + +/* ---------------------------------------------------------------------- */ + + | BRA EXPR + { if (rx_disp3op ($2)) + { B1 (0x08); rx_disp3 ($2, 5); } + else if (rx_intop ($2, 8)) + { B1 (0x2e); PC1 ($2); } + else if (rx_intop ($2, 16)) + { B1 (0x38); PC2 ($2); } + else if (rx_intop ($2, 24)) + { B1 (0x04); PC3 ($2); } + else + { rx_relax (RX_RELAX_BRANCH, 0); + rx_linkrelax_branch (); + /* We'll convert this to a longer one later if needed. */ + B1 (0x08); rx_disp3 ($2, 5); } } + + | BRA DOT_A EXPR + { B1 (0x04); PC3 ($3); } + + | BRA DOT_S EXPR + { B1 (0x08); rx_disp3 ($3, 5); } + +/* ---------------------------------------------------------------------- */ + + | BSR EXPR + { if (rx_intop ($2, 16)) + { B1 (0x39); PC2 ($2); } + else if (rx_intop ($2, 24)) + { B1 (0x05); PC3 ($2); } + else + { rx_relax (RX_RELAX_BRANCH, 0); + rx_linkrelax_branch (); + B1 (0x39); PC2 ($2); } } + | BSR DOT_A EXPR + { B1 (0x05), PC3 ($3); } + +/* ---------------------------------------------------------------------- */ + + | BCND DOT_S EXPR + { if ($1 == COND_EQ || $1 == COND_NE) + { B1 ($1 == COND_EQ ? 0x10 : 0x18); rx_disp3 ($3, 5); } + else + as_bad (_("Only BEQ and BNE may have .S")); } + +/* ---------------------------------------------------------------------- */ + + | BCND DOT_B EXPR + { B1 (0x20); F ($1, 4, 4); PC1 ($3); } + + | BRA DOT_B EXPR + { B1 (0x2e), PC1 ($3); } + +/* ---------------------------------------------------------------------- */ + + | BRA DOT_W EXPR + { B1 (0x38), PC2 ($3); } + | BSR DOT_W EXPR + { B1 (0x39), PC2 ($3); } + | BCND DOT_W EXPR + { if ($1 == COND_EQ || $1 == COND_NE) + { B1 ($1 == COND_EQ ? 0x3a : 0x3b); PC2 ($3); } + else + as_bad (_("Only BEQ and BNE may have .W")); } + | BCND EXPR + { if ($1 == COND_EQ || $1 == COND_NE) + { + rx_relax (RX_RELAX_BRANCH, 0); + rx_linkrelax_branch (); + B1 ($1 == COND_EQ ? 0x10 : 0x18); rx_disp3 ($2, 5); + } + else + { + rx_relax (RX_RELAX_BRANCH, 0); + /* This is because we might turn it into a + jump-over-jump long branch. */ + rx_linkrelax_branch (); + B1 (0x20); F ($1, 4, 4); PC1 ($2); + } } + +/* ---------------------------------------------------------------------- */ + + | MOV DOT_B '#' EXPR ',' disp '[' REG ']' + /* rx_disp5op changes the value if it succeeds, so keep it last. */ + { if ($8 <= 7 && rx_uintop ($4, 8) && rx_disp5op0 (&$6, BSIZE)) + { B2 (0x3c, 0); rx_field5s2 ($6); F ($8, 9, 3); O1 ($4); } + else + { B2 (0xf8, 0x04); F ($8, 8, 4); DSP ($6, 6, BSIZE); O1 ($4); + if ($4.X_op != O_constant && $4.X_op != O_big) rx_linkrelax_imm (12); } } + + | MOV DOT_W '#' EXPR ',' disp '[' REG ']' + { if ($8 <= 7 && rx_uintop ($4, 8) && rx_disp5op0 (&$6, WSIZE)) + { B2 (0x3d, 0); rx_field5s2 ($6); F ($8, 9, 3); O1 ($4); } + else + { B2 (0xf8, 0x01); F ($8, 8, 4); DSP ($6, 6, WSIZE); IMM ($4, 12); } } + + | MOV DOT_L '#' EXPR ',' disp '[' REG ']' + { if ($8 <= 7 && rx_uintop ($4, 8) && rx_disp5op0 (&$6, LSIZE)) + { B2 (0x3e, 0); rx_field5s2 ($6); F ($8, 9, 3); O1 ($4); } + else + { B2 (0xf8, 0x02); F ($8, 8, 4); DSP ($6, 6, LSIZE); IMM ($4, 12); } } + +/* ---------------------------------------------------------------------- */ + + | RTSD '#' EXPR ',' REG '-' REG + { B2 (0x3f, 0); F ($5, 8, 4); F ($7, 12, 4); rtsd_immediate ($3); + if ($5 == 0) + rx_error (_("RTSD cannot pop R0")); + if ($5 > $7) + rx_error (_("RTSD first reg must be <= second reg")); } + +/* ---------------------------------------------------------------------- */ + + | CMP REG ',' REG + { B2 (0x47, 0); F ($2, 8, 4); F ($4, 12, 4); } + +/* ---------------------------------------------------------------------- */ + + | CMP disp '[' REG ']' DOT_UB ',' REG + { B2 (0x44, 0); F ($4, 8, 4); F ($8, 12, 4); DSP ($2, 6, BSIZE); } + + | CMP disp '[' REG ']' memex ',' REG + { B3 (MEMEX, 0x04, 0); F ($6, 8, 2); F ($4, 16, 4); F ($8, 20, 4); DSP ($2, 14, sizemap[$6]); } + +/* ---------------------------------------------------------------------- */ + + | MOVU bw REG ',' REG + { B2 (0x5b, 0x00); F ($2, 5, 1); F ($3, 8, 4); F ($5, 12, 4); } + +/* ---------------------------------------------------------------------- */ + + | MOVU bw '[' REG ']' ',' REG + { B2 (0x58, 0x00); F ($2, 5, 1); F ($4, 8, 4); F ($7, 12, 4); } + + | MOVU bw EXPR '[' REG ']' ',' REG + { if ($5 <= 7 && $8 <= 7 && rx_disp5op (&$3, $2)) + { B2 (0xb0, 0); F ($2, 4, 1); F ($5, 9, 3); F ($8, 13, 3); rx_field5s ($3); } + else + { B2 (0x58, 0x00); F ($2, 5, 1); F ($5, 8, 4); F ($8, 12, 4); DSP ($3, 6, $2); } } + +/* ---------------------------------------------------------------------- */ + + | SUB '#' EXPR ',' REG + { if (rx_uintop ($3, 4)) + { B2 (0x60, 0); FE ($3, 8, 4); F ($5, 12, 4); } + else + /* This is really an add, but we negate the immediate. */ + { B2 (0x38, 0); F ($5, 8, 4); F ($5, 12, 4); NIMM ($3, 6); } } /* ? */ + + | CMP '#' EXPR ',' REG + { if (rx_uintop ($3, 4)) + { B2 (0x61, 0); FE ($3, 8, 4); F ($5, 12, 4); } + else if (rx_uintop ($3, 8)) + { B2 (0x75, 0x50); F ($5, 12, 4); UO1 ($3); } + else + { B2 (0x74, 0x00); F ($5, 12, 4); IMM ($3, 6); } } + + | ADD '#' EXPR ',' REG + { if (rx_uintop ($3, 4)) + { B2 (0x62, 0); FE ($3, 8, 4); F ($5, 12, 4); } + else + { B2 (0x70, 0); F ($5, 8, 4); F ($5, 12, 4); IMM ($3, 6); } } + + | MUL '#' EXPR ',' REG + { if (rx_uintop ($3, 4)) + { B2 (0x63, 0); FE ($3, 8, 4); F ($5, 12, 4); } + else + { B2 (0x74, 0x10); F ($5, 12, 4); IMM ($3, 6); } } + + | AND_ '#' EXPR ',' REG + { if (rx_uintop ($3, 4)) + { B2 (0x64, 0); FE ($3, 8, 4); F ($5, 12, 4); } + else + { B2 (0x74, 0x20); F ($5, 12, 4); IMM ($3, 6); } } + + | OR '#' EXPR ',' REG + { if (rx_uintop ($3, 4)) + { B2 (0x65, 0); FE ($3, 8, 4); F ($5, 12, 4); } + else + { B2 (0x74, 0x30); F ($5, 12, 4); IMM ($3, 6); } } + + | MOV DOT_L '#' EXPR ',' REG + { if (rx_uintop ($4, 4)) + { B2 (0x66, 0); FE ($4, 8, 4); F ($6, 12, 4); } + else if (rx_uintop ($4, 8)) + { B2 (0x75, 0x40); F ($6, 12, 4); UO1 ($4); } + else + { B2 (0xfb, 0x02); F ($6, 8, 4); IMM ($4, 12); } } + + | MOV '#' EXPR ',' REG + { if (rx_uintop ($3, 4)) + { B2 (0x66, 0); FE ($3, 8, 4); F ($5, 12, 4); } + else if (rx_uintop ($3, 8)) + { B2 (0x75, 0x40); F ($5, 12, 4); UO1 ($3); } + else + { B2 (0xfb, 0x02); F ($5, 8, 4); IMM ($3, 12); } } + +/* ---------------------------------------------------------------------- */ + + | RTSD '#' EXPR + { B1 (0x67); rtsd_immediate ($3); } + +/* ---------------------------------------------------------------------- */ + + | SHLR { sub_op = 0; } op_shift + | SHAR { sub_op = 1; } op_shift + | SHLL { sub_op = 2; } op_shift + +/* ---------------------------------------------------------------------- */ + + | PUSHM REG '-' REG + { + if ($2 == $4) + { B2 (0x7e, 0x80); F (LSIZE, 10, 2); F ($2, 12, 4); } + else + { B2 (0x6e, 0); F ($2, 8, 4); F ($4, 12, 4); } + if ($2 == 0) + rx_error (_("PUSHM cannot push R0")); + if ($2 > $4) + rx_error (_("PUSHM first reg must be <= second reg")); } + +/* ---------------------------------------------------------------------- */ + + | POPM REG '-' REG + { + if ($2 == $4) + { B2 (0x7e, 0xb0); F ($2, 12, 4); } + else + { B2 (0x6f, 0); F ($2, 8, 4); F ($4, 12, 4); } + if ($2 == 0) + rx_error (_("POPM cannot pop R0")); + if ($2 > $4) + rx_error (_("POPM first reg must be <= second reg")); } + +/* ---------------------------------------------------------------------- */ + + | ADD '#' EXPR ',' REG ',' REG + { B2 (0x70, 0x00); F ($5, 8, 4); F ($7, 12, 4); IMM ($3, 6); } + +/* ---------------------------------------------------------------------- */ + + | INT '#' EXPR + { B2(0x75, 0x60), UO1 ($3); } + +/* ---------------------------------------------------------------------- */ + + | BSET '#' EXPR ',' REG + { B2 (0x78, 0); FE ($3, 7, 5); F ($5, 12, 4); } + | BCLR '#' EXPR ',' REG + { B2 (0x7a, 0); FE ($3, 7, 5); F ($5, 12, 4); } + +/* ---------------------------------------------------------------------- */ + + | BTST '#' EXPR ',' REG + { B2 (0x7c, 0x00); FE ($3, 7, 5); F ($5, 12, 4); } + +/* ---------------------------------------------------------------------- */ + + | SAT REG + { B2 (0x7e, 0x30); F ($2, 12, 4); } + | RORC REG + { B2 (0x7e, 0x40); F ($2, 12, 4); } + | ROLC REG + { B2 (0x7e, 0x50); F ($2, 12, 4); } + +/* ---------------------------------------------------------------------- */ + + | PUSH bwl REG + { B2 (0x7e, 0x80); F ($2, 10, 2); F ($3, 12, 4); } + +/* ---------------------------------------------------------------------- */ + + | POP REG + { B2 (0x7e, 0xb0); F ($2, 12, 4); } + +/* ---------------------------------------------------------------------- */ + + | PUSHC CREG + { if ($2 < 16) + { B2 (0x7e, 0xc0); F ($2, 12, 4); } + else + as_bad (_("PUSHC can only push the first 16 control registers")); } + +/* ---------------------------------------------------------------------- */ + + | POPC CREG + { if ($2 < 16) + { B2 (0x7e, 0xe0); F ($2, 12, 4); } + else + as_bad (_("POPC can only pop the first 16 control registers")); } + +/* ---------------------------------------------------------------------- */ + + | SETPSW flag + { B2 (0x7f, 0xa0); F ($2, 12, 4); } + | CLRPSW flag + { B2 (0x7f, 0xb0); F ($2, 12, 4); } + +/* ---------------------------------------------------------------------- */ + + | JMP REG + { B2 (0x7f, 0x00); F ($2, 12, 4); } + | JSR REG + { B2 (0x7f, 0x10); F ($2, 12, 4); } + | BRA opt_l REG + { B2 (0x7f, 0x40); F ($3, 12, 4); } + | BSR opt_l REG + { B2 (0x7f, 0x50); F ($3, 12, 4); } + +/* ---------------------------------------------------------------------- */ + + | SCMPU + { B2 (0x7f, 0x83); } + | SMOVU + { B2 (0x7f, 0x87); } + | SMOVB + { B2 (0x7f, 0x8b); } + | SMOVF + { B2 (0x7f, 0x8f); } + +/* ---------------------------------------------------------------------- */ + + | SUNTIL bwl + { B2 (0x7f, 0x80); F ($2, 14, 2); } + | SWHILE bwl + { B2 (0x7f, 0x84); F ($2, 14, 2); } + | SSTR bwl + { B2 (0x7f, 0x88); F ($2, 14, 2); } + +/* ---------------------------------------------------------------------- */ + + | RMPA bwl + { B2 (0x7f, 0x8c); F ($2, 14, 2); } + +/* ---------------------------------------------------------------------- */ + + | RTFI + { B2 (0x7f, 0x94); } + | RTE + { B2 (0x7f, 0x95); } + | WAIT + { B2 (0x7f, 0x96); } + | SATR + { B2 (0x7f, 0x93); } + +/* ---------------------------------------------------------------------- */ + + | MVTIPL '#' EXPR + { B2 (0x7f, 0x98); FE ($3, 13, 3); } + +/* ---------------------------------------------------------------------- */ + + /* rx_disp5op changes the value if it succeeds, so keep it last. */ + | MOV bwl REG ',' EXPR '[' REG ']' + { if ($3 <= 7 && $7 <= 7 && rx_disp5op (&$5, $2)) + { B2 (0x80, 0); F ($2, 2, 2); F ($7, 9, 3); F ($3, 13, 3); rx_field5s ($5); } + else + { B2 (0xc3, 0x00); F ($2, 2, 2); F ($7, 8, 4); F ($3, 12, 4); DSP ($5, 4, $2); }} + +/* ---------------------------------------------------------------------- */ + + | MOV bwl EXPR '[' REG ']' ',' REG + { if ($5 <= 7 && $8 <= 7 && rx_disp5op (&$3, $2)) + { B2 (0x88, 0); F ($2, 2, 2); F ($5, 9, 3); F ($8, 13, 3); rx_field5s ($3); } + else + { B2 (0xcc, 0x00); F ($2, 2, 2); F ($5, 8, 4); F ($8, 12, 4); DSP ($3, 6, $2); } } + +/* ---------------------------------------------------------------------- */ + + /* MOV a,b - if a is a reg and b is mem, src and dest are + swapped. */ + + /* We don't use "disp" here because it causes a shift/reduce + conflict with the other displacement-less patterns. */ + + | MOV bwl REG ',' '[' REG ']' + { B2 (0xc3, 0x00); F ($2, 2, 2); F ($6, 8, 4); F ($3, 12, 4); } + +/* ---------------------------------------------------------------------- */ + + | MOV bwl '[' REG ']' ',' disp '[' REG ']' + { B2 (0xc0, 0); F ($2, 2, 2); F ($4, 8, 4); F ($9, 12, 4); DSP ($7, 4, $2); } + +/* ---------------------------------------------------------------------- */ + + | MOV bwl EXPR '[' REG ']' ',' disp '[' REG ']' + { B2 (0xc0, 0x00); F ($2, 2, 2); F ($5, 8, 4); F ($10, 12, 4); DSP ($3, 6, $2); DSP ($8, 4, $2); } + +/* ---------------------------------------------------------------------- */ + + | MOV bwl REG ',' REG + { B2 (0xcf, 0x00); F ($2, 2, 2); F ($3, 8, 4); F ($5, 12, 4); } + +/* ---------------------------------------------------------------------- */ + + | MOV bwl '[' REG ']' ',' REG + { B2 (0xcc, 0x00); F ($2, 2, 2); F ($4, 8, 4); F ($7, 12, 4); } + +/* ---------------------------------------------------------------------- */ + + | BSET '#' EXPR ',' disp '[' REG ']' DOT_B + { B2 (0xf0, 0x00); F ($7, 8, 4); FE ($3, 13, 3); DSP ($5, 6, BSIZE); } + | BCLR '#' EXPR ',' disp '[' REG ']' DOT_B + { B2 (0xf0, 0x08); F ($7, 8, 4); FE ($3, 13, 3); DSP ($5, 6, BSIZE); } + | BTST '#' EXPR ',' disp '[' REG ']' DOT_B + { B2 (0xf4, 0x00); F ($7, 8, 4); FE ($3, 13, 3); DSP ($5, 6, BSIZE); } + +/* ---------------------------------------------------------------------- */ + + | PUSH bwl disp '[' REG ']' + { B2 (0xf4, 0x08); F ($2, 14, 2); F ($5, 8, 4); DSP ($3, 6, $2); } + +/* ---------------------------------------------------------------------- */ + + | SBB { sub_op = 0; } op_dp20_rm + | NEG { sub_op = 1; sub_op2 = 1; } op_dp20_rms + | ADC { sub_op = 2; } op_dp20_rim + | ABS { sub_op = 3; sub_op2 = 2; } op_dp20_rms + | MAX { sub_op = 4; } op_dp20_rim + | MIN { sub_op = 5; } op_dp20_rim + | EMUL { sub_op = 6; } op_dp20_i + | EMULU { sub_op = 7; } op_dp20_i + | DIV { sub_op = 8; } op_dp20_rim + | DIVU { sub_op = 9; } op_dp20_rim + | TST { sub_op = 12; } op_dp20_rim + | XOR { sub_op = 13; } op_dp20_rim + | NOT { sub_op = 14; sub_op2 = 0; } op_dp20_rms + | STZ { sub_op = 14; } op_dp20_i + | STNZ { sub_op = 15; } op_dp20_i + +/* ---------------------------------------------------------------------- */ + + | EMUL { sub_op = 6; } op_xchg + | EMULU { sub_op = 7; } op_xchg + | XCHG { sub_op = 16; } op_xchg + | ITOF { sub_op = 17; } op_xchg + +/* ---------------------------------------------------------------------- */ + + | BSET REG ',' REG + { id24 (1, 0x63, 0x00); F ($4, 16, 4); F ($2, 20, 4); } + | BCLR REG ',' REG + { id24 (1, 0x67, 0x00); F ($4, 16, 4); F ($2, 20, 4); } + | BTST REG ',' REG + { id24 (1, 0x6b, 0x00); F ($4, 16, 4); F ($2, 20, 4); } + | BNOT REG ',' REG + { id24 (1, 0x6f, 0x00); F ($4, 16, 4); F ($2, 20, 4); } + + | BSET REG ',' disp '[' REG ']' DOT_B + { id24 (1, 0x60, 0x00); F ($6, 16, 4); F ($2, 20, 4); DSP ($4, 14, BSIZE); } + | BCLR REG ',' disp '[' REG ']' DOT_B + { id24 (1, 0x64, 0x00); F ($6, 16, 4); F ($2, 20, 4); DSP ($4, 14, BSIZE); } + | BTST REG ',' disp '[' REG ']' DOT_B + { id24 (1, 0x68, 0x00); F ($6, 16, 4); F ($2, 20, 4); DSP ($4, 14, BSIZE); } + | BNOT REG ',' disp '[' REG ']' DOT_B + { id24 (1, 0x6c, 0x00); F ($6, 16, 4); F ($2, 20, 4); DSP ($4, 14, BSIZE); } + +/* ---------------------------------------------------------------------- */ + + | FSUB { sub_op = 0; } float2_op + | FCMP { sub_op = 1; } float2_op + | FADD { sub_op = 2; } float2_op + | FMUL { sub_op = 3; } float2_op + | FDIV { sub_op = 4; } float2_op + | FTOI { sub_op = 5; } float2_op_ni + | ROUND { sub_op = 6; } float2_op_ni + +/* ---------------------------------------------------------------------- */ + + | SCCND DOT_L REG + { id24 (1, 0xdb, 0x00); F ($1, 20, 4); F ($3, 16, 4); } + | SCCND bwl disp '[' REG ']' + { id24 (1, 0xd0, 0x00); F ($1, 20, 4); F ($2, 12, 2); F ($5, 16, 4); DSP ($3, 14, $2); } + +/* ---------------------------------------------------------------------- */ + + | BMCND '#' EXPR ',' disp '[' REG ']' DOT_B + { id24 (1, 0xe0, 0x00); F ($1, 20, 4); FE ($3, 11, 3); + F ($7, 16, 4); DSP ($5, 14, BSIZE); } + +/* ---------------------------------------------------------------------- */ + + | BNOT '#' EXPR ',' disp '[' REG ']' DOT_B + { id24 (1, 0xe0, 0x0f); FE ($3, 11, 3); F ($7, 16, 4); + DSP ($5, 14, BSIZE); } + +/* ---------------------------------------------------------------------- */ + + | MULHI REG ',' REG + { id24 (2, 0x00, 0x00); F ($2, 16, 4); F ($4, 20, 4); } + | MULLO REG ',' REG + { id24 (2, 0x01, 0x00); F ($2, 16, 4); F ($4, 20, 4); } + | MACHI REG ',' REG + { id24 (2, 0x04, 0x00); F ($2, 16, 4); F ($4, 20, 4); } + | MACLO REG ',' REG + { id24 (2, 0x05, 0x00); F ($2, 16, 4); F ($4, 20, 4); } + +/* ---------------------------------------------------------------------- */ + + /* We don't have syntax for these yet. */ + | MVTACHI REG + { id24 (2, 0x17, 0x00); F ($2, 20, 4); } + | MVTACLO REG + { id24 (2, 0x17, 0x10); F ($2, 20, 4); } + | MVFACHI REG + { id24 (2, 0x1f, 0x00); F ($2, 20, 4); } + | MVFACMI REG + { id24 (2, 0x1f, 0x20); F ($2, 20, 4); } + | MVFACLO REG + { id24 (2, 0x1f, 0x10); F ($2, 20, 4); } + + | RACW '#' EXPR + { id24 (2, 0x18, 0x00); + if (rx_uintop ($3, 4) && $3.X_add_number == 1) + ; + else if (rx_uintop ($3, 4) && $3.X_add_number == 2) + F (1, 19, 1); + else + as_bad (_("RACW expects #1 or #2"));} + +/* ---------------------------------------------------------------------- */ + + | MOV bwl REG ',' '[' REG '+' ']' + { id24 (2, 0x20, 0); F ($2, 14, 2); F ($6, 16, 4); F ($3, 20, 4); } + | MOV bwl REG ',' '[' '-' REG ']' + { id24 (2, 0x24, 0); F ($2, 14, 2); F ($7, 16, 4); F ($3, 20, 4); } + +/* ---------------------------------------------------------------------- */ + + | MOV bwl '[' REG '+' ']' ',' REG + { id24 (2, 0x28, 0); F ($2, 14, 2); F ($4, 16, 4); F ($8, 20, 4); } + | MOV bwl '[' '-' REG ']' ',' REG + { id24 (2, 0x2c, 0); F ($2, 14, 2); F ($5, 16, 4); F ($8, 20, 4); } + +/* ---------------------------------------------------------------------- */ + + | MOVU bw '[' REG '+' ']' ',' REG + { id24 (2, 0x38, 0); F ($2, 15, 1); F ($4, 16, 4); F ($8, 20, 4); } + | MOVU bw '[' '-' REG ']' ',' REG + { id24 (2, 0x3c, 0); F ($2, 15, 1); F ($5, 16, 4); F ($8, 20, 4); } + +/* ---------------------------------------------------------------------- */ + + | ROTL { sub_op = 6; } op_shift_rot + | ROTR { sub_op = 4; } op_shift_rot + | REVW { sub_op = 5; } op_shift_rot + | REVL { sub_op = 7; } op_shift_rot + +/* ---------------------------------------------------------------------- */ + + | MVTC REG ',' CREG + { id24 (2, 0x68, 0x00); F ($4 % 16, 20, 4); F ($4 / 16, 15, 1); + F ($2, 16, 4); } + +/* ---------------------------------------------------------------------- */ + + | MVFC CREG ',' REG + { id24 (2, 0x6a, 0); F ($2, 15, 5); F ($4, 20, 4); } + +/* ---------------------------------------------------------------------- */ + + | ROTL '#' EXPR ',' REG + { id24 (2, 0x6e, 0); FE ($3, 15, 5); F ($5, 20, 4); } + | ROTR '#' EXPR ',' REG + { id24 (2, 0x6c, 0); FE ($3, 15, 5); F ($5, 20, 4); } + +/* ---------------------------------------------------------------------- */ + + | MVTC '#' EXPR ',' CREG + { id24 (2, 0x73, 0x00); F ($5, 19, 5); IMM ($3, 12); } + +/* ---------------------------------------------------------------------- */ + + | BMCND '#' EXPR ',' REG + { id24 (2, 0xe0, 0x00); F ($1, 16, 4); FE ($3, 11, 5); + F ($5, 20, 4); } + +/* ---------------------------------------------------------------------- */ + + | BNOT '#' EXPR ',' REG + { id24 (2, 0xe0, 0xf0); FE ($3, 11, 5); F ($5, 20, 4); } + +/* ---------------------------------------------------------------------- */ + + | MOV bwl REG ',' '[' REG ',' REG ']' + { id24 (3, 0x00, 0); F ($2, 10, 2); F ($6, 12, 4); F ($8, 16, 4); F ($3, 20, 4); } + + | MOV bwl '[' REG ',' REG ']' ',' REG + { id24 (3, 0x40, 0); F ($2, 10, 2); F ($4, 12, 4); F ($6, 16, 4); F ($9, 20, 4); } + + | MOVU bw '[' REG ',' REG ']' ',' REG + { id24 (3, 0xc0, 0); F ($2, 10, 2); F ($4, 12, 4); F ($6, 16, 4); F ($9, 20, 4); } + +/* ---------------------------------------------------------------------- */ + + | SUB { sub_op = 0; } op_subadd + | ADD { sub_op = 2; } op_subadd + | MUL { sub_op = 3; } op_subadd + | AND_ { sub_op = 4; } op_subadd + | OR { sub_op = 5; } op_subadd + +/* ---------------------------------------------------------------------- */ +/* There is no SBB #imm so we fake it with ADC. */ + + | SBB '#' EXPR ',' REG + { id24 (2, 0x70, 0x20); F ($5, 20, 4); NBIMM ($3, 12); } + +/* ---------------------------------------------------------------------- */ + + ; + +/* ====================================================================== */ + +op_subadd + : REG ',' REG + { B2 (0x43 + (sub_op<<2), 0); F ($1, 8, 4); F ($3, 12, 4); } + | disp '[' REG ']' DOT_UB ',' REG + { B2 (0x40 + (sub_op<<2), 0); F ($3, 8, 4); F ($7, 12, 4); DSP ($1, 6, BSIZE); } + | disp '[' REG ']' memex ',' REG + { B3 (MEMEX, sub_op<<2, 0); F ($5, 8, 2); F ($3, 16, 4); F ($7, 20, 4); DSP ($1, 14, sizemap[$5]); } + | REG ',' REG ',' REG + { id24 (4, sub_op<<4, 0), F ($5, 12, 4), F ($1, 16, 4), F ($3, 20, 4); } + ; + +/* sbb, neg, adc, abs, max, min, div, divu, tst, not, xor, stz, stnz, emul, emulu */ + +op_dp20_rm + : REG ',' REG + { id24 (1, 0x03 + (sub_op<<2), 0x00); F ($1, 16, 4); F ($3, 20, 4); } + | disp '[' REG ']' DOT_UB ',' REG + { id24 (1, 0x00 + (sub_op<<2), 0x00); F ($3, 16, 4); F ($7, 20, 4); DSP ($1, 14, BSIZE); } + | 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]); } + ; + +op_dp20_i + : '#' EXPR ',' REG + { id24 (2, 0x70, sub_op<<4); F ($4, 20, 4); IMM ($2, 12); } + ; + +op_dp20_rim + : op_dp20_rm + | op_dp20_i + ; + +op_dp20_rms + : op_dp20_rm + | REG + { B2 (0x7e, sub_op2 << 4); F ($1, 12, 4); } + ; + +/* xchg, itof, emul, emulu */ +op_xchg + : REG ',' REG + { id24 (1, 0x03 + (sub_op<<2), 0); F ($1, 16, 4); F ($3, 20, 4); } + | disp '[' REG ']' DOT_UB ',' REG + { id24 (1, 0x00 + (sub_op<<2), 0); F ($3, 16, 4); F ($7, 20, 4); DSP ($1, 14, BSIZE); } + | disp '[' REG ']' memex ',' REG + { B4 (MEMEX, 0x20, 0x00 + sub_op, 0); F ($5, 8, 2); F ($3, 24, 4); F ($7, 28, 4); + DSP ($1, 14, sizemap[$5]); } + ; + +/* 000:SHLR, 001:SHAR, 010:SHLL, 011:-, 100:ROTR, 101:REVW, 110:ROTL, 111:REVL */ +op_shift_rot + : REG ',' REG + { id24 (2, 0x60 + sub_op, 0); F ($1, 16, 4); F ($3, 20, 4); } + ; +op_shift + : '#' EXPR ',' REG + { B2 (0x68 + (sub_op<<1), 0); FE ($2, 7, 5); F ($4, 12, 4); } + | '#' EXPR ',' REG ',' REG + { id24 (2, 0x80 + (sub_op << 5), 0); FE ($2, 11, 5); F ($4, 16, 4); F ($6, 20, 4); } + | op_shift_rot + ; + + + +float2_op + : '#' EXPR ',' REG + { id24 (2, 0x72, sub_op << 4); F ($4, 20, 4); O4 ($2); } + | float2_op_ni + ; +float2_op_ni + : REG ',' REG + { id24 (1, 0x83 + (sub_op << 2), 0); F ($1, 16, 4); F ($3, 20, 4); } + | disp '[' REG ']' opt_l ',' REG + { id24 (1, 0x80 + (sub_op << 2), 0); F ($3, 16, 4); F ($7, 20, 4); DSP ($1, 14, LSIZE); } + ; + +/* ====================================================================== */ + +disp : { $$ = zero_expr (); } + | EXPR { $$ = $1; } + ; + +flag : { need_flag = 1; } FLAG { need_flag = 0; $$ = $2; } + ; + +/* DOT_UB is not listed here, it's handled with a separate pattern. */ +/* Use sizemap[$n] to get LSIZE etc. */ +memex : DOT_B { $$ = 0; } + | DOT_W { $$ = 1; } + | { $$ = 2; } + | DOT_L { $$ = 2; } + | DOT_UW { $$ = 3; } + ; + +bwl : { $$ = LSIZE; } + | DOT_B { $$ = BSIZE; } + | DOT_W { $$ = WSIZE; } + | DOT_L { $$ = LSIZE; } + ; + +bw : { $$ = 1; } + | DOT_B { $$ = 0; } + | DOT_W { $$ = 1; } + ; + +opt_l : {} + | DOT_L {} + ; + +%% +/* ====================================================================== */ + +static struct +{ + const char * string; + int token; + int val; +} +token_table[] = +{ + { "r0", REG, 0 }, + { "r1", REG, 1 }, + { "r2", REG, 2 }, + { "r3", REG, 3 }, + { "r4", REG, 4 }, + { "r5", REG, 5 }, + { "r6", REG, 6 }, + { "r7", REG, 7 }, + { "r8", REG, 8 }, + { "r9", REG, 9 }, + { "r10", REG, 10 }, + { "r11", REG, 11 }, + { "r12", REG, 12 }, + { "r13", REG, 13 }, + { "r14", REG, 14 }, + { "r15", REG, 15 }, + + { "psw", CREG, 0 }, + { "pc", CREG, 1 }, + { "usp", CREG, 2 }, + { "fpsw", CREG, 3 }, + { "cpen", CREG, 4 }, + /* reserved */ + /* reserved */ + { "wr", CREG, 7 }, + + { "bpsw", CREG, 8 }, + { "bpc", CREG, 9 }, + { "isp", CREG, 10 }, + { "fintv", CREG, 11 }, + { "intb", CREG, 12 }, + + { "pbp", CREG, 16 }, + { "pben", CREG, 17 }, + + { "bbpsw", CREG, 24 }, + { "bbpc", CREG, 25 }, + + { ".s", DOT_S, 0 }, + { ".b", DOT_B, 0 }, + { ".w", DOT_W, 0 }, + { ".l", DOT_L, 0 }, + { ".a", DOT_A , 0}, + { ".ub", DOT_UB, 0 }, + { ".uw", DOT_UW , 0}, + + { "c", FLAG, 0 }, + { "z", FLAG, 1 }, + { "s", FLAG, 2 }, + { "o", FLAG, 3 }, + { "i", FLAG, 8 }, + { "u", FLAG, 9 }, + +#define OPC(x) { #x, x, IS_OPCODE } + OPC(ABS), + OPC(ADC), + OPC(ADD), + { "and", AND_, IS_OPCODE }, + OPC(BCLR), + OPC(BCND), + OPC(BMCND), + OPC(BNOT), + OPC(BRA), + OPC(BRK), + OPC(BSET), + OPC(BSR), + OPC(BTST), + OPC(CLRPSW), + OPC(CMP), + OPC(DBT), + OPC(DIV), + OPC(DIVU), + OPC(EDIV), + OPC(EDIVU), + OPC(EMUL), + OPC(EMULU), + OPC(FADD), + OPC(FCMP), + OPC(FDIV), + OPC(FMUL), + OPC(FREIT), + OPC(FSUB), + OPC(FTOI), + OPC(INT), + OPC(ITOF), + OPC(JMP), + OPC(JSR), + OPC(MVFACHI), + OPC(MVFACMI), + OPC(MVFACLO), + OPC(MVFC), + OPC(MVTACHI), + OPC(MVTACLO), + OPC(MVTC), + OPC(MVTIPL), + OPC(MACHI), + OPC(MACLO), + OPC(MAX), + OPC(MIN), + OPC(MOV), + OPC(MOVU), + OPC(MUL), + OPC(MULHI), + OPC(MULLO), + OPC(MULU), + OPC(NEG), + OPC(NOP), + OPC(NOT), + OPC(OR), + OPC(POP), + OPC(POPC), + OPC(POPM), + OPC(PUSH), + OPC(PUSHA), + OPC(PUSHC), + OPC(PUSHM), + OPC(RACW), + OPC(REIT), + OPC(REVL), + OPC(REVW), + OPC(RMPA), + OPC(ROLC), + OPC(RORC), + OPC(ROTL), + OPC(ROTR), + OPC(ROUND), + OPC(RTE), + OPC(RTFI), + OPC(RTS), + OPC(RTSD), + OPC(SAT), + OPC(SATR), + OPC(SBB), + OPC(SCCND), + OPC(SCMPU), + OPC(SETPSW), + OPC(SHAR), + OPC(SHLL), + OPC(SHLR), + OPC(SMOVB), + OPC(SMOVF), + OPC(SMOVU), + OPC(SSTR), + OPC(STNZ), + OPC(STOP), + OPC(STZ), + OPC(SUB), + OPC(SUNTIL), + OPC(SWHILE), + OPC(TST), + OPC(WAIT), + OPC(XCHG), + OPC(XOR), +}; + +#define NUM_TOKENS (sizeof (token_table) / sizeof (token_table[0])) + +static struct +{ + char * string; + int token; +} +condition_opcode_table[] = +{ + { "b", BCND }, + { "bm", BMCND }, + { "sc", SCCND }, +}; + +#define NUM_CONDITION_OPCODES (sizeof (condition_opcode_table) / sizeof (condition_opcode_table[0])) + +static struct +{ + char * string; + int val; +} +condition_table[] = +{ + { "z", 0 }, + { "eq", 0 }, + { "geu", 2 }, + { "c", 2 }, + { "gtu", 4 }, + { "pz", 6 }, + { "ge", 8 }, + { "gt", 10 }, + { "o", 12}, + /* always = 14 */ + { "nz", 1 }, + { "ne", 1 }, + { "ltu", 3 }, + { "nc", 3 }, + { "leu", 5 }, + { "n", 7 }, + { "lt", 9 }, + { "le", 11 }, + { "no", 13 } + /* never = 15 */ +}; + +#define NUM_CONDITIONS (sizeof (condition_table) / sizeof (condition_table[0])) + +void +rx_lex_init (char * beginning, char * ending) +{ + rx_init_start = beginning; + rx_lex_start = beginning; + rx_lex_end = ending; + rx_in_brackets = 0; + rx_last_token = 0; + + setbuf (stdout, 0); +} + +static int +check_condition (char * base) +{ + char * cp; + unsigned int i; + + if ((unsigned) (rx_lex_end - rx_lex_start) < strlen (base) + 1) + return 0; + if (memcmp (rx_lex_start, base, strlen (base))) + return 0; + cp = rx_lex_start + strlen (base); + for (i = 0; i < NUM_CONDITIONS; i ++) + { + if (strcasecmp (cp, condition_table[i].string) == 0) + { + rx_lval.regno = condition_table[i].val; + return 1; + } + } + return 0; +} + +static int +rx_lex (void) +{ + unsigned int ci; + char * save_input_pointer; + + while (ISSPACE (*rx_lex_start) + && rx_lex_start != rx_lex_end) + rx_lex_start ++; + + rx_last_exp_start = rx_lex_start; + + if (rx_lex_start == rx_lex_end) + return 0; + + if (ISALPHA (*rx_lex_start) + || (*rx_lex_start == '.' && ISALPHA (rx_lex_start[1]))) + { + unsigned int i; + char * e; + char save; + + for (e = rx_lex_start + 1; + e < rx_lex_end && ISALNUM (*e); + e ++) + ; + save = *e; + *e = 0; + + if (rx_last_token == 0) + for (ci = 0; ci < NUM_CONDITION_OPCODES; ci ++) + if (check_condition (condition_opcode_table[ci].string)) + { + *e = save; + rx_lex_start = e; + rx_last_token = condition_opcode_table[ci].token; + return condition_opcode_table[ci].token; + } + + for (i = 0; i < NUM_TOKENS; i++) + if (strcasecmp (rx_lex_start, token_table[i].string) == 0 + && !(token_table[i].val == IS_OPCODE && rx_last_token != 0) + && !(token_table[i].token == FLAG && !need_flag)) + { + rx_lval.regno = token_table[i].val; + *e = save; + rx_lex_start = e; + rx_last_token = token_table[i].token; + return token_table[i].token; + } + *e = save; + } + + if (rx_last_token == 0) + { + rx_last_token = UNKNOWN_OPCODE; + return UNKNOWN_OPCODE; + } + + if (rx_last_token == UNKNOWN_OPCODE) + return 0; + + if (*rx_lex_start == '[') + rx_in_brackets = 1; + if (*rx_lex_start == ']') + rx_in_brackets = 0; + + if (rx_in_brackets + || rx_last_token == REG + || strchr ("[],#", *rx_lex_start)) + { + rx_last_token = *rx_lex_start; + return *rx_lex_start ++; + } + + save_input_pointer = input_line_pointer; + input_line_pointer = rx_lex_start; + rx_lval.exp.X_md = 0; + expression (&rx_lval.exp); + + /* We parse but ignore any : modifier on expressions. */ + if (*input_line_pointer == ':') + { + char *cp; + + for (cp = input_line_pointer + 1; *cp && cp < rx_lex_end; cp++) + if (!ISDIGIT (*cp)) + break; + if (cp > input_line_pointer+1) + input_line_pointer = cp; + } + + rx_lex_start = input_line_pointer; + input_line_pointer = save_input_pointer; + rx_last_token = EXPR; + return EXPR; +} + +int +rx_error (char * str) +{ + int len; + + len = rx_last_exp_start - rx_init_start; + + as_bad ("%s", rx_init_start); + as_bad ("%*s^ %s", len, "", str); + return 0; +} + +static int +rx_intop (expressionS exp, int nbits) +{ + long v; + + if (exp.X_op == O_big && nbits == 32) + return 1; + if (exp.X_op != O_constant) + return 0; + v = exp.X_add_number; + + switch (nbits) + { + case 4: + return -0x8 <= v && v <= 0x7; + case 5: + return -0x10 <= v && v <= 0x17; + case 8: + return -0x80 <= v && v <= 0x7f; + case 16: + return -0x8000 <= v && v <= 0x7fff; + case 24: + return -0x800000 <= v && v <= 0x7fffff; + case 32: + return 1; + default: + printf ("rx_intop passed %d\n", nbits); + abort (); + } + return 1; +} + +static int +rx_uintop (expressionS exp, int nbits) +{ + unsigned long v; + + if (exp.X_op != O_constant) + return 0; + v = exp.X_add_number; + + switch (nbits) + { + case 4: + return v <= 0xf; + case 8: + return v <= 0xff; + case 16: + return v <= 0xffff; + case 24: + return v <= 0xffffff; + default: + printf ("rx_uintop passed %d\n", nbits); + abort (); + } + return 1; +} + +static int +rx_disp3op (expressionS exp) +{ + unsigned long v; + + if (exp.X_op != O_constant) + return 0; + v = exp.X_add_number; + if (v < 3 || v > 10) + return 0; + return 1; +} + +static int +rx_disp5op (expressionS * exp, int msize) +{ + long v; + + if (exp->X_op != O_constant) + return 0; + v = exp->X_add_number; + + switch (msize) + { + case BSIZE: + if (0 < v && v <= 31) + return 1; + break; + case WSIZE: + if (v & 1) + return 0; + if (0 < v && v <= 63) + { + exp->X_add_number >>= 1; + return 1; + } + break; + case LSIZE: + if (v & 3) + return 0; + if (0 < v && v <= 127) + { + exp->X_add_number >>= 2; + return 1; + } + break; + } + return 0; +} + +/* Just like the above, but allows a zero displacement. */ + +static int +rx_disp5op0 (expressionS * exp, int msize) +{ + if (exp->X_op != O_constant) + return 0; + if (exp->X_add_number == 0) + return 1; + return rx_disp5op (exp, msize); +} + +static int +exp_val (expressionS exp) +{ + if (exp.X_op != O_constant) + { + rx_error (_("constant expected")); + return 0; + } + return exp.X_add_number; +} + +static expressionS +zero_expr (void) +{ + /* Static, so program load sets it to all zeros, which is what we want. */ + static expressionS zero; + zero.X_op = O_constant; + return zero; +} + +static int +immediate (expressionS exp, int type, int pos) +{ + /* We will emit constants ourself here, so negate them. */ + if (type == RXREL_NEGATIVE && exp.X_op == O_constant) + exp.X_add_number = - exp.X_add_number; + if (type == RXREL_NEGATIVE_BORROW) + { + if (exp.X_op == O_constant) + exp.X_add_number = - exp.X_add_number - 1; + else + rx_error (_("sbb cannot use symbolic immediates")); + } + + if (rx_intop (exp, 8)) + { + rx_op (exp, 1, type); + return 1; + } + else if (rx_intop (exp, 16)) + { + rx_op (exp, 2, type); + return 2; + } + else if (rx_intop (exp, 24)) + { + rx_op (exp, 3, type); + return 3; + } + else if (rx_intop (exp, 32)) + { + rx_op (exp, 4, type); + return 0; + } + else if (type == RXREL_SIGNED) + { + /* This is a symbolic immediate, we will relax it later. */ + rx_relax (RX_RELAX_IMM, pos); + rx_op (exp, linkrelax ? 4 : 1, type); + return 1; + } + else + { + /* Let the linker deal with it. */ + rx_op (exp, 4, type); + return 0; + } +} + +static int +displacement (expressionS exp, int msize) +{ + int val; + int vshift = 0; + + if (exp.X_op == O_symbol + && exp.X_md) + { + switch (exp.X_md) + { + case BFD_RELOC_GPREL16: + switch (msize) + { + case BSIZE: + exp.X_md = BFD_RELOC_RX_GPRELB; + break; + case WSIZE: + exp.X_md = BFD_RELOC_RX_GPRELW; + break; + case LSIZE: + exp.X_md = BFD_RELOC_RX_GPRELL; + break; + } + O2 (exp); + return 2; + } + } + + if (exp.X_op != O_constant) + { + rx_error (_("displacements must be constants")); + return -1; + } + val = exp.X_add_number; + + if (val == 0) + return 0; + + switch (msize) + { + case BSIZE: + break; + case WSIZE: + if (val & 1) + rx_error (_("word displacement not word-aligned")); + vshift = 1; + break; + case LSIZE: + if (val & 3) + rx_error (_("long displacement not long-aligned")); + vshift = 2; + break; + default: + as_bad (_("displacement with unknown size (internal bug?)\n")); + break; + } + + val >>= vshift; + exp.X_add_number = val; + + if (0 <= val && val <= 255 ) + { + O1 (exp); + return 1; + } + + if (0 <= val && val <= 65535) + { + O2 (exp); + return 2; + } + if (val < 0) + rx_error (_("negative displacements not allowed")); + else + rx_error (_("displacement too large")); + return -1; +} + +static void +rtsd_immediate (expressionS exp) +{ + int val; + + if (exp.X_op != O_constant) + { + rx_error (_("rtsd size must be constant")); + return; + } + val = exp.X_add_number; + if (val & 3) + rx_error (_("rtsd size must be multiple of 4")); + + if (val < 0 || val > 1020) + rx_error (_("rtsd size must be 0..1020")); + + val >>= 2; + exp.X_add_number = val; + O1 (exp); +} diff --git a/gas/config/tc-rx.c b/gas/config/tc-rx.c new file mode 100644 index 0000000..f635321 --- /dev/null +++ b/gas/config/tc-rx.c @@ -0,0 +1,2394 @@ +/* tc-rx.c -- Assembler for the Renesas RX + Copyright 2008, 2009 + Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + + GAS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + GAS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GAS; see the file COPYING. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +#include "as.h" +#include "struc-symbol.h" +#include "obstack.h" +#include "safe-ctype.h" +#include "dwarf2dbg.h" +#include "libbfd.h" +#include "elf/common.h" +#include "elf/rx.h" +#include "rx-defs.h" +#include "filenames.h" +#include "listing.h" +#include "sb.h" +#include "macro.h" + +#define RX_OPCODE_BIG_ENDIAN 0 + +const char comment_chars[] = ";"; +/* Note that input_file.c hand checks for '#' at the beginning of the + first line of the input file. This is because the compiler outputs + #NO_APP at the beginning of its output. */ +const char line_comment_chars[] = "#"; +const char line_separator_chars[] = "!"; + +const char EXP_CHARS[] = "eE"; +const char FLT_CHARS[] = "dD"; + +/* ELF flags to set in the output file header. */ +static int elf_flags = 0; + +bfd_boolean rx_use_conventional_section_names = FALSE; +static bfd_boolean rx_use_small_data_limit = FALSE; + +enum options +{ + OPTION_BIG = OPTION_MD_BASE, + OPTION_LITTLE, + OPTION_32BIT_DOUBLES, + OPTION_64BIT_DOUBLES, + OPTION_CONVENTIONAL_SECTION_NAMES, + OPTION_RENESAS_SECTION_NAMES, + OPTION_SMALL_DATA_LIMIT, + OPTION_RELAX +}; + +#define RX_SHORTOPTS "" +const char * md_shortopts = RX_SHORTOPTS; + +/* Assembler options. */ +struct option md_longopts[] = +{ + {"mbig-endian-data", no_argument, NULL, OPTION_BIG}, + {"mlittle-endian-data", no_argument, NULL, OPTION_LITTLE}, + /* The next two switches are here because the + generic parts of the linker testsuite uses them. */ + {"EB", no_argument, NULL, OPTION_BIG}, + {"EL", no_argument, NULL, OPTION_LITTLE}, + {"m32bit-doubles", no_argument, NULL, OPTION_32BIT_DOUBLES}, + {"m64bit-doubles", no_argument, NULL, OPTION_64BIT_DOUBLES}, + /* This option is here mainly for the binutils testsuites, + as many of their tests assume conventional section naming. */ + {"muse-conventional-section-names", no_argument, NULL, OPTION_CONVENTIONAL_SECTION_NAMES}, + {"muse-renesas-section-names", no_argument, NULL, OPTION_RENESAS_SECTION_NAMES}, + {"msmall-data-limit", no_argument, NULL, OPTION_SMALL_DATA_LIMIT}, + {"relax", no_argument, NULL, OPTION_RELAX}, + {NULL, no_argument, NULL, 0} +}; +size_t md_longopts_size = sizeof (md_longopts); + +int +md_parse_option (int c ATTRIBUTE_UNUSED, char * arg ATTRIBUTE_UNUSED) +{ + switch (c) + { + case OPTION_BIG: + target_big_endian = 1; + return 1; + + case OPTION_LITTLE: + target_big_endian = 0; + return 1; + + case OPTION_32BIT_DOUBLES: + elf_flags &= ~ E_FLAG_RX_64BIT_DOUBLES; + return 1; + + case OPTION_64BIT_DOUBLES: + elf_flags |= E_FLAG_RX_64BIT_DOUBLES; + return 1; + + case OPTION_CONVENTIONAL_SECTION_NAMES: + rx_use_conventional_section_names = TRUE; + return 1; + + case OPTION_RENESAS_SECTION_NAMES: + rx_use_conventional_section_names = FALSE; + return 1; + + case OPTION_SMALL_DATA_LIMIT: + rx_use_small_data_limit = TRUE; + return 1; + + case OPTION_RELAX: + linkrelax = 1; + return 1; + } + return 0; +} + +void +md_show_usage (FILE * stream) +{ + fprintf (stream, _(" RX specific command line options:\n")); + fprintf (stream, _(" --mbig-endian-data\n")); + fprintf (stream, _(" --mlittle-endian-data [default]\n")); + fprintf (stream, _(" --m32bit-doubles [default]\n")); + fprintf (stream, _(" --m64bit-doubles\n")); + fprintf (stream, _(" --muse-conventional-section-names\n")); + fprintf (stream, _(" --muse-renesas-section-names [default]\n")); + fprintf (stream, _(" --msmall-data-limit\n")); +} + +static void +s_bss (int ignore ATTRIBUTE_UNUSED) +{ + int temp; + + temp = get_absolute_expression (); + subseg_set (bss_section, (subsegT) temp); + demand_empty_rest_of_line (); +} + +static void +rx_float_cons (int ignore ATTRIBUTE_UNUSED) +{ + if (elf_flags & E_FLAG_RX_64BIT_DOUBLES) + return float_cons ('d'); + return float_cons ('f'); +} + +static char * +rx_strcasestr (const char *string, const char *sub) +{ + int subl; + int strl; + + if (!sub || !sub[0]) + return (char *)string; + + subl = strlen (sub); + strl = strlen (string); + + while (strl >= subl) + { + /* strncasecmp is in libiberty. */ + if (strncasecmp (string, sub, subl) == 0) + return (char *)string; + + string ++; + strl --; + } + return NULL; +} + +static void +rx_include (int ignore) +{ + FILE * try; + char * path; + char * filename; + char * current_filename; + char * eof; + char * p; + char * d; + char * f; + char end_char; + size_t len; + + /* The RX version of the .INCLUDE pseudo-op does not + have to have the filename inside double quotes. */ + SKIP_WHITESPACE (); + if (*input_line_pointer == '"') + { + /* Treat as the normal GAS .include pseudo-op. */ + s_include (ignore); + return; + } + + /* Get the filename. Spaces are allowed, NUL characters are not. */ + filename = input_line_pointer; + eof = find_end_of_line (filename, FALSE); + input_line_pointer = eof; + + while (eof >= filename && (* eof == ' ' || * eof == '\n')) + -- eof; + end_char = *(++ eof); + * eof = 0; + if (eof == filename) + { + as_bad (_("no filename following .INCLUDE pseudo-op")); + * eof = end_char; + return; + } + + as_where (& current_filename, NULL); + f = (char *) xmalloc (strlen (current_filename) + strlen (filename) + 1); + + /* Check the filename. If [@]..FILE[@] is found then replace + this with the current assembler source filename, stripped + of any directory prefixes or extensions. */ + if ((p = rx_strcasestr (filename, "..file")) != NULL) + { + char * c; + + len = 6; /* strlen ("..file"); */ + + if (p > filename && p[-1] == '@') + -- p, ++len; + + if (p[len] == '@') + len ++; + + for (d = c = current_filename; *c; c++) + if (IS_DIR_SEPARATOR (* c)) + d = c + 1; + for (c = d; *c; c++) + if (*c == '.') + break; + + sprintf (f, "%.*s%.*s%.*s", (int) (p - filename), filename, + (int) (c - d), d, + (int) (strlen (filename) - ((p + len) - filename)), + p + len); + } + else + strcpy (f, filename); + + /* RX .INCLUDE semantics say that 'filename' is located by: + + 1. If filename is absolute, just try that. Otherwise... + + 2. If the current source file includes a directory component + then prepend that to the filename and try. Otherwise... + + 3. Try any directories specified by the -I command line + option(s). + + 4 .Try a directory specifed by the INC100 environment variable. */ + + if (IS_ABSOLUTE_PATH (f)) + try = fopen (path = f, FOPEN_RT); + else + { + char * env = getenv ("INC100"); + + try = NULL; + + len = strlen (current_filename); + if ((size_t) include_dir_maxlen > len) + len = include_dir_maxlen; + if (env && strlen (env) > len) + len = strlen (env); + + path = (char *) xmalloc (strlen (f) + len + 5); + + if (current_filename != NULL) + { + for (d = NULL, p = current_filename; *p; p++) + if (IS_DIR_SEPARATOR (* p)) + d = p; + + if (d != NULL) + { + sprintf (path, "%.*s/%s", (int) (d - current_filename), current_filename, + f); + try = fopen (path, FOPEN_RT); + } + } + + if (try == NULL) + { + int i; + + for (i = 0; i < include_dir_count; i++) + { + sprintf (path, "%s/%s", include_dirs[i], f); + if ((try = fopen (path, FOPEN_RT)) != NULL) + break; + } + } + + if (try == NULL && env != NULL) + { + sprintf (path, "%s/%s", env, f); + try = fopen (path, FOPEN_RT); + } + + free (f); + } + + if (try == NULL) + { + as_bad (_("unable to locate include file: %s"), filename); + free (path); + } + else + { + fclose (try); + register_dependency (path); + input_scrub_insert_file (path); + } + + * eof = end_char; +} + +static void +parse_rx_section (char * name) +{ + asection * sec; + int type; + int attr = SHF_ALLOC | SHF_EXECINSTR; + int align = 2; + char end_char; + + do + { + char * p; + + SKIP_WHITESPACE (); + for (p = input_line_pointer; *p && strchr ("\n\t, =", *p) == NULL; p++) + ; + end_char = *p; + *p = 0; + + if (strcasecmp (input_line_pointer, "ALIGN") == 0) + { + *p = end_char; + + if (end_char == ' ') + while (ISSPACE (*p)) + p++; + + if (*p == '=') + { + ++ p; + while (ISSPACE (*p)) + p++; + switch (*p) + { + case '2': align = 2; break; + case '4': align = 4; break; + case '8': align = 8; break; + default: + as_bad (_("unrecognised alignment value in .SECTION directive: %s"), p); + ignore_rest_of_line (); + return; + } + ++ p; + } + + end_char = *p; + } + else if (strcasecmp (input_line_pointer, "CODE") == 0) + attr = SHF_ALLOC | SHF_EXECINSTR; + else if (strcasecmp (input_line_pointer, "DATA") == 0) + attr = SHF_ALLOC | SHF_WRITE; + else if (strcasecmp (input_line_pointer, "ROMDATA") == 0) + attr = SHF_ALLOC; + else + { + as_bad (_("unknown parameter following .SECTION directive: %s"), + input_line_pointer); + + *p = end_char; + input_line_pointer = p + 1; + ignore_rest_of_line (); + return; + } + + *p = end_char; + input_line_pointer = p + 1; + } + while (end_char != '\n' && end_char != 0); + + if ((sec = bfd_get_section_by_name (stdoutput, name)) == NULL) + { + if (strcmp (name, "B") && strcmp (name, "B_1") && strcmp (name, "B_2")) + type = SHT_NULL; + else + type = SHT_NOBITS; + + obj_elf_change_section (name, type, attr, 0, NULL, FALSE, FALSE); + } + else /* Try not to redefine a section, especially B_1. */ + { + int flags = sec->flags; + + type = elf_section_type (sec); + + attr = ((flags & SEC_READONLY) ? 0 : SHF_WRITE) + | ((flags & SEC_ALLOC) ? SHF_ALLOC : 0) + | ((flags & SEC_CODE) ? SHF_EXECINSTR : 0) + | ((flags & SEC_MERGE) ? SHF_MERGE : 0) + | ((flags & SEC_STRINGS) ? SHF_STRINGS : 0) + | ((flags & SEC_THREAD_LOCAL) ? SHF_TLS : 0); + + obj_elf_change_section (name, type, attr, 0, NULL, FALSE, FALSE); + } + + bfd_set_section_alignment (stdoutput, now_seg, align); +} + +static void +rx_section (int ignore) +{ + char * p; + + /* The as100 assembler supports a different syntax for the .section + pseudo-op. So check for it and handle it here if necessary. */ + SKIP_WHITESPACE (); + + /* Peek past the section name to see if arguments follow. */ + for (p = input_line_pointer; *p; p++) + if (*p == ',' || *p == '\n') + break; + + if (*p == ',') + { + int len = p - input_line_pointer; + + while (ISSPACE (*++p)) + ; + + if (*p != '"' && *p != '#') + { + char * name = (char *) xmalloc (len + 1); + + strncpy (name, input_line_pointer, len); + name[len] = 0; + + input_line_pointer = p; + parse_rx_section (name); + return; + } + } + + obj_elf_section (ignore); +} + +static void +rx_list (int ignore ATTRIBUTE_UNUSED) +{ + SKIP_WHITESPACE (); + + if (strncasecmp (input_line_pointer, "OFF", 3)) + listing_list (0); + else if (strncasecmp (input_line_pointer, "ON", 2)) + listing_list (1); + else + as_warn (_("expecting either ON or OFF after .list")); +} + +/* Like the .rept pseudo op, but supports the + use of ..MACREP inside the repeated region. */ + +static void +rx_rept (int ignore ATTRIBUTE_UNUSED) +{ + int count = get_absolute_expression (); + + do_repeat_with_expander (count, "MREPEAT", "ENDR", "..MACREP"); +} + +/* Like cons() accept that strings are allowed. */ + +static void +rx_cons (int size) +{ + SKIP_WHITESPACE (); + + if (* input_line_pointer == '"') + stringer (8+0); + else + cons (size); +} + +static void +rx_nop (int ignore ATTRIBUTE_UNUSED) +{ + ignore_rest_of_line (); +} + +static void +rx_unimp (int idx) +{ + as_warn (_("The \".%s\" pseudo-op is not implemented\n"), + md_pseudo_table[idx].poc_name); + ignore_rest_of_line (); +} + +/* The target specific pseudo-ops which we support. */ +const pseudo_typeS md_pseudo_table[] = +{ + /* These are unimplemented. They're listed first so that we can use + the poc_value as the index into this array, to get the name of + the pseudo. So, keep these (1) first, and (2) in order, with (3) + the poc_value's in sequence. */ + { "btglb", rx_unimp, 0 }, + { "call", rx_unimp, 1 }, + { "einsf", rx_unimp, 2 }, + { "fb", rx_unimp, 3 }, + { "fbsym", rx_unimp, 4 }, + { "id", rx_unimp, 5 }, + { "initsct", rx_unimp, 6 }, + { "insf", rx_unimp, 7 }, + { "instr", rx_unimp, 8 }, + { "lbba", rx_unimp, 9 }, + { "len", rx_unimp, 10 }, + { "optj", rx_unimp, 11 }, + { "rvector", rx_unimp, 12 }, + { "sb", rx_unimp, 13 }, + { "sbbit", rx_unimp, 14 }, + { "sbsym", rx_unimp, 15 }, + { "sbsym16", rx_unimp, 16 }, + + /* These are the do-nothing pseudos. */ + { "stk", rx_nop, 0 }, + /* The manual documents ".stk" but the compiler emits ".stack". */ + { "stack", rx_nop, 0 }, + + /* Theae are Renesas as100 assembler pseudo-ops that we do support. */ + { "addr", rx_cons, 3 }, + { "align", s_align_bytes, 2 }, + { "byte", rx_cons, 1 }, + { "fixed", float_cons, 'f' }, + { "form", listing_psize, 0 }, + { "glb", s_globl, 0 }, + { "include", rx_include, 0 }, + { "list", rx_list, 0 }, + { "lword", rx_cons, 4 }, + { "mrepeat", rx_rept, 0 }, + { "section", rx_section, 0 }, + + /* FIXME: The following pseudo-ops place their values (and associated + label if present) in the data section, regardless of whatever + section we are currently in. At the moment this code does not + implement that part of the semantics. */ + { "blka", s_space, 3 }, + { "blkb", s_space, 1 }, + { "blkd", s_space, 8 }, + { "blkf", s_space, 4 }, + { "blkl", s_space, 4 }, + { "blkw", s_space, 2 }, + + /* Our "standard" pseudos. */ + { "double", rx_float_cons, 0 }, + { "bss", s_bss, 0 }, + { "3byte", cons, 3 }, + { "int", cons, 4 }, + { "word", cons, 4 }, + + /* End of list marker. */ + { NULL, NULL, 0 } +}; + +static asymbol * gp_symbol; + +void +md_begin (void) +{ + if (rx_use_small_data_limit) + /* Make the __gp symbol now rather + than after the symbol table is frozen. We only do this + when supporting small data limits because otherwise we + pollute the symbol table. */ + gp_symbol = symbol_get_bfdsym (symbol_find_or_make ("__gp")); +} + +char * rx_lex_start; +char * rx_lex_end; + +typedef struct rx_bytesT +{ + char base[4]; + int n_base; + char ops[8]; + int n_ops; + struct + { + expressionS exp; + char offset; + char nbits; + char type; /* RXREL_*. */ + int reloc; + fixS * fixP; + } fixups[2]; + int n_fixups; + struct + { + char type; + char field_pos; + char val_ofs; + } relax[2]; + int n_relax; + int link_relax; + fixS *link_relax_fixP; +} rx_bytesT; + +static rx_bytesT rx_bytes; + +void +rx_relax (int type, int pos) +{ + rx_bytes.relax[rx_bytes.n_relax].type = type; + rx_bytes.relax[rx_bytes.n_relax].field_pos = pos; + rx_bytes.relax[rx_bytes.n_relax].val_ofs = rx_bytes.n_base + rx_bytes.n_ops; + rx_bytes.n_relax ++; +} + +void +rx_linkrelax_dsp (int pos) +{ + switch (pos) + { + case 4: + rx_bytes.link_relax |= RX_RELAXA_DSP4; + break; + case 6: + rx_bytes.link_relax |= RX_RELAXA_DSP6; + break; + case 14: + rx_bytes.link_relax |= RX_RELAXA_DSP14; + break; + } +} + +void +rx_linkrelax_imm (int pos) +{ + switch (pos) + { + case 6: + rx_bytes.link_relax |= RX_RELAXA_IMM6; + break; + case 12: + rx_bytes.link_relax |= RX_RELAXA_IMM12; + break; + } +} + +void +rx_linkrelax_branch (void) +{ + rx_bytes.link_relax |= RX_RELAXA_BRA; +} + +static void +rx_fixup (expressionS exp, int offsetbits, int nbits, int type) +{ + rx_bytes.fixups[rx_bytes.n_fixups].exp = exp; + rx_bytes.fixups[rx_bytes.n_fixups].offset = offsetbits; + rx_bytes.fixups[rx_bytes.n_fixups].nbits = nbits; + rx_bytes.fixups[rx_bytes.n_fixups].type = type; + rx_bytes.fixups[rx_bytes.n_fixups].reloc = exp.X_md; + rx_bytes.n_fixups ++; +} + +#define rx_field_fixup(exp, offset, nbits, type) \ + rx_fixup (exp, offset, nbits, type) + +#define rx_op_fixup(exp, offset, nbits, type) \ + rx_fixup (exp, offset + 8 * rx_bytes.n_base, nbits, type) + +void +rx_base1 (int b1) +{ + rx_bytes.base[0] = b1; + rx_bytes.n_base = 1; +} + +void +rx_base2 (int b1, int b2) +{ + rx_bytes.base[0] = b1; + rx_bytes.base[1] = b2; + rx_bytes.n_base = 2; +} + +void +rx_base3 (int b1, int b2, int b3) +{ + rx_bytes.base[0] = b1; + rx_bytes.base[1] = b2; + rx_bytes.base[2] = b3; + rx_bytes.n_base = 3; +} + +void +rx_base4 (int b1, int b2, int b3, int b4) +{ + rx_bytes.base[0] = b1; + rx_bytes.base[1] = b2; + rx_bytes.base[2] = b3; + rx_bytes.base[3] = b4; + rx_bytes.n_base = 4; +} + +/* 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 + insertion of 12 at position 4 of 0x00 yields: 0x0b. A three-bit + insertion of b'MXL at position 7 is like this: + + - - - - - - - - - - - - - - - - + M X L */ + +void +rx_field (int val, int pos, int sz) +{ + int valm; + int bytep, bitp; + + if (sz > 0) + { + if (val < 0 || val >= (1 << sz)) + as_bad (_("Value %d doesn't fit in unsigned %d-bit field"), val, sz); + } + else + { + 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); + } + + /* This code points at 'M' in the above example. */ + bytep = pos / 8; + bitp = pos % 8; + + while (bitp + sz > 8) + { + int ssz = 8 - bitp; + int svalm; + + svalm = val >> (sz - ssz); + svalm = svalm & ((1 << ssz) - 1); + svalm = svalm << (8 - bitp - ssz); + gas_assert (bytep < rx_bytes.n_base); + rx_bytes.base[bytep] |= svalm; + + bitp = 0; + sz -= ssz; + bytep ++; + } + valm = val & ((1 << sz) - 1); + valm = valm << (8 - bitp - sz); + gas_assert (bytep < rx_bytes.n_base); + rx_bytes.base[bytep] |= valm; +} + +/* Special case of the above, for 3-bit displacements of 2..9. */ + +void +rx_disp3 (expressionS exp, int pos) +{ + rx_field_fixup (exp, pos, 3, RXREL_PCREL); +} + +/* Special case of the above, for split 5-bit displacements. Assumes + the displacement has been checked with rx_disp5op. */ +/* ---- -432 1--- 0--- */ + +void +rx_field5s (expressionS exp) +{ + int val; + + val = exp.X_add_number; + rx_bytes.base[0] |= val >> 2; + rx_bytes.base[1] |= (val << 6) & 0x80; + rx_bytes.base[1] |= (val << 3) & 0x08; +} + +/* ---- ---- 4--- 3210 */ + +void +rx_field5s2 (expressionS exp) +{ + int val; + + val = exp.X_add_number; + rx_bytes.base[1] |= (val << 3) & 0x80; + rx_bytes.base[1] |= (val ) & 0x0f; +} + +#define OP(x) rx_bytes.ops[rx_bytes.n_ops++] = (x) + +#define F_PRECISION 2 + +void +rx_op (expressionS exp, int nbytes, int type) +{ + int v = 0; + + if ((exp.X_op == O_constant || exp.X_op == O_big) + && type != RXREL_PCREL) + { + if (exp.X_op == O_big && exp.X_add_number <= 0) + { + LITTLENUM_TYPE w[2]; + char * ip = rx_bytes.ops + rx_bytes.n_ops; + + gen_to_words (w, F_PRECISION, 8); +#if RX_OPCODE_BIG_ENDIAN + ip[0] = w[0] >> 8; + ip[1] = w[0]; + ip[2] = w[1] >> 8; + ip[3] = w[1]; +#else + ip[3] = w[0] >> 8; + ip[2] = w[0]; + ip[1] = w[1] >> 8; + ip[0] = w[1]; +#endif + rx_bytes.n_ops += 4; + } + else + { + v = exp.X_add_number; + while (nbytes) + { +#if RX_OPCODE_BIG_ENDIAN + OP ((v >> (8 * (nbytes - 1))) & 0xff); +#else + OP (v & 0xff); + v >>= 8; +#endif + nbytes --; + } + } + } + else + { + rx_op_fixup (exp, rx_bytes.n_ops * 8, nbytes * 8, type); + memset (rx_bytes.ops + rx_bytes.n_ops, 0, nbytes); + rx_bytes.n_ops += nbytes; + } +} + +int +rx_wrap (void) +{ + return 0; +} + +#define APPEND(B, N_B) \ + if (rx_bytes.N_B) \ + { \ + memcpy (bytes + idx, rx_bytes.B, rx_bytes.N_B); \ + idx += rx_bytes.N_B; \ + } + +void +rx_frag_init (fragS * fragP) +{ + if (rx_bytes.n_relax || rx_bytes.link_relax) + { + fragP->tc_frag_data = malloc (sizeof (rx_bytesT)); + memcpy (fragP->tc_frag_data, & rx_bytes, sizeof (rx_bytesT)); + } + else + fragP->tc_frag_data = 0; +} + +/* Handle the as100's version of the .equ pseudo-op. It has the syntax: + .equ */ + +static void +rx_equ (char * name, char * expr) +{ + char saved_name_end_char; + char * name_end; + char * saved_ilp; + + while (ISSPACE (* name)) + name ++; + + for (name_end = name + 1; *name_end; name_end ++) + if (! ISALNUM (* name_end)) + break; + + saved_name_end_char = * name_end; + * name_end = 0; + + saved_ilp = input_line_pointer; + input_line_pointer = expr; + + equals (name, 1); + + input_line_pointer = saved_ilp; + * name_end = saved_name_end_char; +} + +/* Look for Renesas as100 pseudo-ops that occur after a symbol name + rather than at the start of a line. (eg .EQU or .DEFINE). If one + is found, process it and return TRUE otherwise return FALSE. */ + +static bfd_boolean +scan_for_infix_rx_pseudo_ops (char * str) +{ + char * p; + char * pseudo_op; + char * dot = strchr (str, '.'); + + if (dot == NULL || dot == str) + return FALSE; + + /* A real pseudo-op must be preceeded by whitespace. */ + if (dot[-1] != ' ' && dot[-1] != '\t') + return FALSE; + + pseudo_op = dot + 1; + + if (!ISALNUM (* pseudo_op)) + return FALSE; + + for (p = pseudo_op + 1; ISALNUM (* p); p++) + ; + + if (strncasecmp ("EQU", pseudo_op, p - pseudo_op) == 0) + rx_equ (str, p); + else if (strncasecmp ("DEFINE", pseudo_op, p - pseudo_op) == 0) + as_warn (_("The .DEFINE pseudo-op is not implemented")); + else if (strncasecmp ("MACRO", pseudo_op, p - pseudo_op) == 0) + as_warn (_("The .MACRO pseudo-op is not implemented")); + else if (strncasecmp ("BTEQU", pseudo_op, p - pseudo_op) == 0) + as_warn (_("The .BTEQU pseudo-op is not implemented.")); + else + return FALSE; + + return TRUE; +} + +void +md_assemble (char * str) +{ + char * bytes; + int idx = 0; + int i, rel; + fragS * frag_then = frag_now; + expressionS *exp; + + memset (& rx_bytes, 0, sizeof (rx_bytes)); + + rx_lex_init (str, str + strlen (str)); + if (scan_for_infix_rx_pseudo_ops (str)) + return; + rx_parse (); + + /* This simplifies the relaxation code. */ + if (rx_bytes.n_relax || rx_bytes.link_relax) + { + /* We do it this way because we want the frag to have the + rx_bytes in it, which we initialize above. */ + bytes = frag_more (12); + frag_then = frag_now; + frag_variant (rs_machine_dependent, + 0 /* max_chars */, + 0 /* var */, + 0 /* subtype */, + 0 /* symbol */, + 0 /* offset */, + 0 /* opcode */); + frag_then->fr_opcode = bytes; + frag_then->fr_fix += rx_bytes.n_base + rx_bytes.n_ops; + frag_then->fr_subtype = rx_bytes.n_base + rx_bytes.n_ops; + } + else + { + bytes = frag_more (rx_bytes.n_base + rx_bytes.n_ops); + frag_then = frag_now; + } + + APPEND (base, n_base); + APPEND (ops, n_ops); + + if (rx_bytes.link_relax && rx_bytes.n_fixups) + { + fixS * f; + + f = fix_new (frag_then, + (char *) bytes - frag_then->fr_literal, + 0, + abs_section_sym, + rx_bytes.link_relax | rx_bytes.n_fixups, + 0, + BFD_RELOC_RX_RELAX); + frag_then->tc_frag_data->link_relax_fixP = f; + } + + for (i = 0; i < rx_bytes.n_fixups; i ++) + { + /* index: [nbytes][type] */ + static int reloc_map[5][4] = + { + { 0, 0, 0, BFD_RELOC_RX_DIR3U_PCREL }, + { BFD_RELOC_8, BFD_RELOC_RX_8U, BFD_RELOC_RX_NEG8, BFD_RELOC_8_PCREL }, + { BFD_RELOC_RX_16_OP, BFD_RELOC_RX_16U, BFD_RELOC_RX_NEG16, BFD_RELOC_16_PCREL }, + { BFD_RELOC_RX_24_OP, BFD_RELOC_RX_24U, BFD_RELOC_RX_NEG24, BFD_RELOC_24_PCREL }, + { BFD_RELOC_RX_32_OP, BFD_RELOC_32, BFD_RELOC_RX_NEG32, BFD_RELOC_32_PCREL }, + }; + fixS * f; + + idx = rx_bytes.fixups[i].offset / 8; + rel = reloc_map [rx_bytes.fixups[i].nbits / 8][(int) rx_bytes.fixups[i].type]; + + if (rx_bytes.fixups[i].reloc) + rel = rx_bytes.fixups[i].reloc; + + if (frag_then->tc_frag_data) + exp = & frag_then->tc_frag_data->fixups[i].exp; + else + exp = & rx_bytes.fixups[i].exp; + + f = fix_new_exp (frag_then, + (char *) bytes + idx - frag_then->fr_literal, + rx_bytes.fixups[i].nbits / 8, + exp, + rx_bytes.fixups[i].type == RXREL_PCREL ? 1 : 0, + rel); + if (frag_then->tc_frag_data) + frag_then->tc_frag_data->fixups[i].fixP = f; + } + + dwarf2_emit_insn (idx); +} + +void +rx_md_end (void) +{ +} + +/* Write a value out to the object file, using the appropriate endianness. */ + +void +md_number_to_chars (char * buf, valueT val, int n) +{ + if (target_big_endian) + number_to_chars_bigendian (buf, val, n); + else + number_to_chars_littleendian (buf, val, n); +} + +static struct +{ + char * fname; + int reloc; +} +reloc_functions[] = +{ + { "gp", BFD_RELOC_GPREL16 }, + { 0, 0 } +}; + +void +md_operand (expressionS * exp ATTRIBUTE_UNUSED) +{ + int reloc = 0; + int i; + + for (i = 0; reloc_functions[i].fname; i++) + { + int flen = strlen (reloc_functions[i].fname); + + if (input_line_pointer[0] == '%' + && strncasecmp (input_line_pointer + 1, reloc_functions[i].fname, flen) == 0 + && input_line_pointer[flen + 1] == '(') + { + reloc = reloc_functions[i].reloc; + input_line_pointer += flen + 2; + break; + } + } + if (reloc == 0) + return; + + expression (exp); + if (* input_line_pointer == ')') + input_line_pointer ++; + + exp->X_md = reloc; +} + +valueT +md_section_align (segT segment, valueT size) +{ + int align = bfd_get_section_alignment (stdoutput, segment); + return ((size + (1 << align) - 1) & (-1 << align)); +} + +/* When relaxing, we need to output a reloc for any .align directive + so that we can retain this alignment as we adjust opcode sizes. */ +void +rx_handle_align (fragS * frag) +{ + if (linkrelax + && (frag->fr_type == rs_align + || frag->fr_type == rs_align_code) + && frag->fr_address + frag->fr_fix > 0 + && frag->fr_offset > 0 + && now_seg != bss_section) + { + fix_new (frag, frag->fr_fix, 0, + &abs_symbol, RX_RELAXA_ALIGN + frag->fr_offset, + 0, BFD_RELOC_RX_RELAX); + /* For the purposes of relaxation, this relocation is attached + to the byte *after* the alignment - i.e. the byte that must + remain aligned. */ + fix_new (frag->fr_next, 0, 0, + &abs_symbol, RX_RELAXA_ELIGN + frag->fr_offset, + 0, BFD_RELOC_RX_RELAX); + } +} + +char * +md_atof (int type, char * litP, int * sizeP) +{ + return ieee_md_atof (type, litP, sizeP, target_big_endian); +} + +symbolS * +md_undefined_symbol (char * name ATTRIBUTE_UNUSED) +{ + return NULL; +} + +/*----------------------------------------------------------------------*/ +/* To recap: we estimate everything based on md_estimate_size, then + adjust based on rx_relax_frag. When it all settles, we call + md_convert frag to update the bytes. The relaxation types and + relocations are in fragP->tc_frag_data, which is a copy of that + rx_bytes. + + Our scheme is as follows: fr_fix has the size of the smallest + opcode (like BRA.S). We store the number of total bytes we need in + fr_subtype. When we're done relaxing, we use fr_subtype and the + existing opcode bytes to figure out what actual opcode we need to + put in there. If the fixup isn't resolvable now, we use the + maximal size. */ + +#define TRACE_RELAX 0 +#define tprintf if (TRACE_RELAX) printf + +typedef enum +{ + OT_other, + OT_bra, + OT_beq, + OT_bne, + OT_bsr, + OT_bcc +} op_type_T; + +/* We're looking for these types of relaxations: + + BRA.S 00001dsp + BRA.B 00101110 dspppppp + BRA.W 00111000 dspppppp pppppppp + BRA.A 00000100 dspppppp pppppppp pppppppp + + BEQ.S 00010dsp + BEQ.B 00100000 dspppppp + BEQ.W 00111010 dspppppp pppppppp + + BNE.S 00011dsp + BNE.B 00100001 dspppppp + BNE.W 00111011 dspppppp pppppppp + + BSR.W 00111001 dspppppp pppppppp + BSR.A 00000101 dspppppp pppppppp pppppppp + + Bcc.B 0010cond dspppppp + + Additionally, we can synthesize longer conditional branches using + pairs of opcodes, one with an inverted conditional (flip LSB): + + Bcc.W 0010ncnd 00000110 00111000 dspppppp pppppppp + Bcc.A 0010ncnd 00000111 00000100 dspppppp pppppppp pppppppp + BEQ.A 00011100 00000100 dspppppp pppppppp pppppppp + BNE.A 00010100 00000100 dspppppp pppppppp pppppppp */ + +/* Given the opcode bytes at OP, figure out which opcode it is and + return the type of opcode. We use this to re-encode the opcode as + a different size later. */ + +static op_type_T +rx_opcode_type (char * op) +{ + unsigned char b = (unsigned char) op[0]; + + switch (b & 0xf8) + { + case 0x08: return OT_bra; + case 0x10: return OT_beq; + case 0x18: return OT_bne; + } + + switch (b) + { + case 0x2e: return OT_bra; + case 0x38: return OT_bra; + case 0x04: return OT_bra; + + case 0x20: return OT_beq; + case 0x3a: return OT_beq; + + case 0x21: return OT_bne; + case 0x3b: return OT_bne; + + case 0x39: return OT_bsr; + case 0x05: return OT_bsr; + } + + if ((b & 0xf0) == 0x20) + return OT_bcc; + + return OT_other; +} + +/* Returns zero if *addrP has the target address. Else returns nonzero + if we cannot compute the target address yet. */ + +static int +rx_frag_fix_value (fragS * fragP, + segT segment, + int which, + addressT * addrP, + int need_diff, + addressT * sym_addr) +{ + addressT addr = 0; + rx_bytesT * b = fragP->tc_frag_data; + expressionS * exp = & b->fixups[which].exp; + + if (need_diff && exp->X_op != O_subtract) + return 1; + + if (exp->X_add_symbol) + { + if (S_FORCE_RELOC (exp->X_add_symbol, 1)) + return 1; + if (S_GET_SEGMENT (exp->X_add_symbol) != segment) + return 1; + addr += S_GET_VALUE (exp->X_add_symbol); + } + + if (exp->X_op_symbol) + { + if (exp->X_op != O_subtract) + return 1; + if (S_FORCE_RELOC (exp->X_op_symbol, 1)) + return 1; + if (S_GET_SEGMENT (exp->X_op_symbol) != segment) + return 1; + addr -= S_GET_VALUE (exp->X_op_symbol); + } + if (sym_addr) + * sym_addr = addr; + addr += exp->X_add_number; + * addrP = addr; + return 0; +} + +/* Estimate how big the opcode is after this relax pass. The return + value is the difference between fr_fix and the actual size. We + compute the total size in rx_relax_frag and store it in fr_subtype, + sowe only need to subtract fx_fix and return it. */ + +int +md_estimate_size_before_relax (fragS * fragP ATTRIBUTE_UNUSED, segT segment ATTRIBUTE_UNUSED) +{ + int opfixsize; + int delta; + + tprintf ("\033[32m est frag: addr %08lx fix %ld var %ld ofs %ld lit %p opc %p type %d sub %d\033[0m\n", + fragP->fr_address + (fragP->fr_opcode - fragP->fr_literal), + fragP->fr_fix, fragP->fr_var, fragP->fr_offset, + fragP->fr_literal, fragP->fr_opcode, fragP->fr_type, fragP->fr_subtype); + + /* This is the size of the opcode that's accounted for in fr_fix. */ + opfixsize = fragP->fr_fix - (fragP->fr_opcode - fragP->fr_literal); + /* This is the size of the opcode that isn't. */ + delta = (fragP->fr_subtype - opfixsize); + + tprintf (" -> opfixsize %d delta %d\n", opfixsize, delta); + return delta; +} + +/* Given the new addresses for this relax pass, figure out how big + each opcode must be. We store the total number of bytes needed in + fr_subtype. The return value is the difference between the size + after the last pass and the size after this pass, so we use the old + fr_subtype to calculate the difference. */ + +int +rx_relax_frag (segT segment ATTRIBUTE_UNUSED, fragS * fragP, long stretch) +{ + addressT addr0, sym_addr; + addressT mypc; + int disp; + int oldsize = fragP->fr_subtype; + int newsize = oldsize; + op_type_T optype; + /* Index of relaxation we care about. */ + int ri; + + tprintf ("\033[36mrelax frag: addr %08lx fix %ld var %ld ofs %ld lit %p opc %p type %d sub %d str %ld\033[0m\n", + fragP->fr_address + (fragP->fr_opcode - fragP->fr_literal), + fragP->fr_fix, fragP->fr_var, fragP->fr_offset, + fragP->fr_literal, fragP->fr_opcode, fragP->fr_type, fragP->fr_subtype, stretch); + + optype = rx_opcode_type (fragP->fr_opcode); + + /* In the one case where we have both a disp and imm relaxation, we want + the imm relaxation here. */ + ri = 0; + if (fragP->tc_frag_data->n_relax > 1 + && fragP->tc_frag_data->relax[0].type == RX_RELAX_DISP) + ri = 1; + + /* Try to get the target address. */ + if (rx_frag_fix_value (fragP, segment, ri, & addr0, + fragP->tc_frag_data->relax[ri].type != RX_RELAX_BRANCH, + & sym_addr)) + { + /* If we don't, we must use the maximum size for the linker. + Note that we don't use synthetically expanded conditionals + for this. */ + switch (fragP->tc_frag_data->relax[ri].type) + { + case RX_RELAX_BRANCH: + switch (optype) + { + case OT_bra: + case OT_bsr: + newsize = 4; + break; + case OT_beq: + case OT_bne: + newsize = 3; + break; + case OT_bcc: + newsize = 2; + break; + case OT_other: + newsize = oldsize; + break; + } + break; + + case RX_RELAX_IMM: + newsize = fragP->tc_frag_data->relax[ri].val_ofs + 4; + break; + } + fragP->fr_subtype = newsize; + tprintf (" -> new %d old %d delta %d (external)\n", newsize, oldsize, newsize-oldsize); + return newsize - oldsize; + } + + mypc = fragP->fr_address + (fragP->fr_opcode - fragP->fr_literal); + if (sym_addr > mypc) + addr0 += stretch; + + switch (fragP->tc_frag_data->relax[ri].type) + { + case RX_RELAX_BRANCH: + tprintf ("branch, addr %08lx pc %08lx disp %ld\n", addr0, mypc, addr0-mypc); + disp = (int) addr0 - (int) mypc; + + switch (optype) + { + case OT_bcc: + if (disp >= -128 && (disp - (oldsize-2)) <= 127) + /* bcc.b */ + newsize = 2; + else if (disp >= -32768 && (disp - (oldsize-5)) <= 32767) + /* bncc.b/bra.w */ + newsize = 5; + else + /* bncc.b/bra.a */ + newsize = 6; + break; + + case OT_beq: + case OT_bne: + if ((disp - (oldsize-1)) >= 3 && (disp - (oldsize-1)) <= 10 && !linkrelax) + /* beq.s */ + newsize = 1; + else if (disp >= -128 && (disp - (oldsize-2)) <= 127) + /* beq.b */ + newsize = 2; + else if (disp >= -32768 && (disp - (oldsize-3)) <= 32767) + /* beq.w */ + newsize = 3; + else + /* bne.s/bra.a */ + newsize = 5; + break; + + case OT_bra: + case OT_bsr: + if ((disp - (oldsize-1)) >= 3 && (disp - (oldsize-1)) <= 10 && !linkrelax) + /* bra.s */ + newsize = 1; + else if (disp >= -128 && (disp - (oldsize-2)) <= 127) + /* bra.b */ + newsize = 2; + else if (disp >= -32768 && (disp - (oldsize-3)) <= 32767) + /* bra.w */ + newsize = 3; + else + /* bra.a */ + newsize = 4; + break; + + case OT_other: + break; + } + tprintf (" - newsize %d\n", newsize); + break; + + case RX_RELAX_IMM: + tprintf ("other, addr %08lx pc %08lx LI %d OF %d\n", addr0, mypc, + fragP->tc_frag_data->relax[ri].field_pos, + fragP->tc_frag_data->relax[ri].val_ofs); + + newsize = fragP->tc_frag_data->relax[ri].val_ofs; + + if ((long) addr0 >= -128 && (long) addr0 <= 127) + newsize += 1; + else if ((long) addr0 >= -32768 && (long) addr0 <= 32767) + newsize += 2; + else if ((long) addr0 >= -8388608 && (long) addr0 <= 8388607) + newsize += 3; + else + newsize += 4; + break; + + default: + break; + } + + if (fragP->tc_frag_data->relax[ri].type == RX_RELAX_BRANCH) + switch (optype) + { + case OT_bra: + case OT_bcc: + case OT_beq: + case OT_bne: + break; + case OT_bsr: + if (newsize < 3) + newsize = 3; + break; + case OT_other: + break; + } + + fragP->fr_subtype = newsize; + tprintf (" -> new %d old %d delta %d\n", newsize, oldsize, newsize-oldsize); + return newsize - oldsize; +} + +/* This lets us test for the opcode type and the desired size in a + switch statement. */ +#define OPCODE(type,size) ((type) * 16 + (size)) + +/* Given the opcode stored in fr_opcode and the number of bytes we + think we need, encode a new opcode. We stored a pointer to the + fixup for this opcode in the tc_frag_data structure. If we can do + the fixup here, we change the relocation type to "none" (we test + for that in tc_gen_reloc) else we change it to the right type for + the new (biggest) opcode. */ + +void +md_convert_frag (bfd * abfd ATTRIBUTE_UNUSED, + segT segment ATTRIBUTE_UNUSED, + fragS * fragP ATTRIBUTE_UNUSED) +{ + rx_bytesT * rxb = fragP->tc_frag_data; + addressT addr0, mypc; + int disp; + int reloc_type, reloc_adjust; + char * op = fragP->fr_opcode; + int keep_reloc = 0; + int ri; + int fi = (rxb->n_fixups > 1) ? 1 : 0; + fixS * fix = rxb->fixups[fi].fixP; + + tprintf ("\033[31mconvrt frag: addr %08lx fix %ld var %ld ofs %ld lit %p opc %p type %d sub %d\033[0m\n", + fragP->fr_address + (fragP->fr_opcode - fragP->fr_literal), + fragP->fr_fix, fragP->fr_var, fragP->fr_offset, + fragP->fr_literal, fragP->fr_opcode, fragP->fr_type, fragP->fr_subtype); + +#if TRACE_RELAX + { + int i; + + printf ("lit %08x opc %08x", (int) fragP->fr_literal, (int) fragP->fr_opcode); + for (i = 0; i < 10; i++) + printf (" %02x", (unsigned char) (fragP->fr_opcode[i])); + printf ("\n"); + } +#endif + + /* In the one case where we have both a disp and imm relaxation, we want + the imm relaxation here. */ + ri = 0; + if (fragP->tc_frag_data->n_relax > 1 + && fragP->tc_frag_data->relax[0].type == RX_RELAX_DISP) + ri = 1; + + /* Try to get the target address. If we fail here, we just use the + largest format. */ + if (rx_frag_fix_value (fragP, segment, 0, & addr0, + fragP->tc_frag_data->relax[ri].type != RX_RELAX_BRANCH, 0)) + keep_reloc = 1; + + if (linkrelax) + keep_reloc = 1; + + /* We used a new frag for this opcode, so the opcode address should + be the frag address. */ + mypc = fragP->fr_address + (fragP->fr_opcode - fragP->fr_literal); + disp = (int) addr0 - (int) mypc; + + reloc_type = BFD_RELOC_NONE; + reloc_adjust = 0; + + tprintf ("convert, op is %d, disp %d (%lx-%lx)\n", rx_opcode_type (fragP->fr_opcode), disp, addr0, mypc); + switch (fragP->tc_frag_data->relax[ri].type) + { + case RX_RELAX_BRANCH: + switch (OPCODE (rx_opcode_type (fragP->fr_opcode), fragP->fr_subtype)) + { + case OPCODE (OT_bra, 1): /* BRA.S - no change. */ + op[0] = 0x08 + (disp & 7); + break; + case OPCODE (OT_bra, 2): /* BRA.B - 8 bit. */ + op[0] = 0x2e; + op[1] = disp; + reloc_type = keep_reloc ? BFD_RELOC_8_PCREL : BFD_RELOC_NONE; + reloc_adjust = 1; + break; + case OPCODE (OT_bra, 3): /* BRA.W - 16 bit. */ + op[0] = 0x38; +#if RX_OPCODE_BIG_ENDIAN + op[1] = (disp >> 8) & 0xff; + op[2] = disp; +#else + op[2] = (disp >> 8) & 0xff; + op[1] = disp; +#endif + reloc_adjust = 1; + reloc_type = keep_reloc ? BFD_RELOC_16_PCREL : BFD_RELOC_NONE; + break; + case OPCODE (OT_bra, 4): /* BRA.A - 24 bit. */ + op[0] = 0x04; +#if RX_OPCODE_BIG_ENDIAN + op[1] = (disp >> 16) & 0xff; + op[2] = (disp >> 8) & 0xff; + op[3] = disp; +#else + op[3] = (disp >> 16) & 0xff; + op[2] = (disp >> 8) & 0xff; + op[1] = disp; +#endif + reloc_type = keep_reloc ? BFD_RELOC_24_PCREL : BFD_RELOC_NONE; + reloc_adjust = 1; + break; + + case OPCODE (OT_beq, 1): /* BEQ.S - no change. */ + op[0] = 0x10 + (disp & 7); + break; + case OPCODE (OT_beq, 2): /* BEQ.B - 8 bit. */ + op[0] = 0x20; + op[1] = disp; + reloc_adjust = 1; + reloc_type = keep_reloc ? BFD_RELOC_8_PCREL : BFD_RELOC_NONE; + break; + case OPCODE (OT_beq, 3): /* BEQ.W - 16 bit. */ + op[0] = 0x3a; +#if RX_OPCODE_BIG_ENDIAN + op[1] = (disp >> 8) & 0xff; + op[2] = disp; +#else + op[2] = (disp >> 8) & 0xff; + op[1] = disp; +#endif + reloc_type = keep_reloc ? BFD_RELOC_16_PCREL : BFD_RELOC_NONE; + reloc_adjust = 1; + break; + case OPCODE (OT_beq, 5): /* BEQ.A - synthetic. */ + op[0] = 0x1e; /* bne.s .+4. */ + op[1] = 0x04; /* bra.a dsp:24. */ + disp -= 1; +#if RX_OPCODE_BIG_ENDIAN + op[2] = (disp >> 16) & 0xff; + op[3] = (disp >> 8) & 0xff; + op[4] = disp; +#else + op[4] = (disp >> 16) & 0xff; + op[3] = (disp >> 8) & 0xff; + op[2] = disp; +#endif + reloc_type = keep_reloc ? BFD_RELOC_24_PCREL : BFD_RELOC_NONE; + reloc_adjust = 2; + break; + + case OPCODE (OT_bne, 1): /* BNE.S - no change. */ + op[0] = 0x18 + (disp & 7); + break; + case OPCODE (OT_bne, 2): /* BNE.B - 8 bit. */ + op[0] = 0x21; + op[1] = disp; + reloc_adjust = 1; + reloc_type = keep_reloc ? BFD_RELOC_8_PCREL : BFD_RELOC_NONE; + break; + case OPCODE (OT_bne, 3): /* BNE.W - 16 bit. */ + op[0] = 0x3b; +#if RX_OPCODE_BIG_ENDIAN + op[1] = (disp >> 8) & 0xff; + op[2] = disp; +#else + op[2] = (disp >> 8) & 0xff; + op[1] = disp; +#endif + reloc_type = keep_reloc ? BFD_RELOC_16_PCREL : BFD_RELOC_NONE; + reloc_adjust = 1; + break; + case OPCODE (OT_bne, 5): /* BNE.A - synthetic. */ + op[0] = 0x15; /* beq.s .+4. */ + op[1] = 0x04; /* bra.a dsp:24. */ + disp -= 1; +#if RX_OPCODE_BIG_ENDIAN + op[2] = (disp >> 16) & 0xff; + op[3] = (disp >> 8) & 0xff; + op[4] = disp; +#else + op[4] = (disp >> 16) & 0xff; + op[3] = (disp >> 8) & 0xff; + op[2] = disp; +#endif + reloc_type = keep_reloc ? BFD_RELOC_24_PCREL : BFD_RELOC_NONE; + reloc_adjust = 2; + break; + + case OPCODE (OT_bsr, 3): /* BSR.W - 16 bit. */ + op[0] = 0x39; +#if RX_OPCODE_BIG_ENDIAN + op[1] = (disp >> 8) & 0xff; + op[2] = disp; +#else + op[2] = (disp >> 8) & 0xff; + op[1] = disp; +#endif + reloc_type = keep_reloc ? BFD_RELOC_16_PCREL : BFD_RELOC_NONE; + reloc_adjust = 0; + break; + case OPCODE (OT_bsr, 4): /* BSR.A - 24 bit. */ + op[0] = 0x05; +#if RX_OPCODE_BIG_ENDIAN + op[1] = (disp >> 16) & 0xff; + op[2] = (disp >> 8) & 0xff; + op[3] = disp; +#else + op[3] = (disp >> 16) & 0xff; + op[2] = (disp >> 8) & 0xff; + op[1] = disp; +#endif + reloc_type = keep_reloc ? BFD_RELOC_24_PCREL : BFD_RELOC_NONE; + reloc_adjust = 0; + break; + + case OPCODE (OT_bcc, 2): /* Bcond.B - 8 bit. */ + op[1] = disp; + reloc_type = keep_reloc ? BFD_RELOC_8_PCREL : BFD_RELOC_NONE; + break; + case OPCODE (OT_bcc, 5): /* Bcond.W - synthetic. */ + op[0] ^= 1; /* Invert condition. */ + op[1] = 5; /* Displacement. */ + op[2] = 0x38; + disp -= 2; +#if RX_OPCODE_BIG_ENDIAN + op[3] = (disp >> 8) & 0xff; + op[4] = disp; +#else + op[4] = (disp >> 8) & 0xff; + op[3] = disp; +#endif + reloc_type = keep_reloc ? BFD_RELOC_16_PCREL : BFD_RELOC_NONE; + reloc_adjust = 2; + break; + case OPCODE (OT_bcc, 6): /* Bcond.S - synthetic. */ + op[0] ^= 1; /* Invert condition. */ + op[1] = 6; /* Displacement. */ + op[2] = 0x04; + disp -= 2; +#if RX_OPCODE_BIG_ENDIAN + op[3] = (disp >> 16) & 0xff; + op[4] = (disp >> 8) & 0xff; + op[5] = disp; +#else + op[5] = (disp >> 16) & 0xff; + op[4] = (disp >> 8) & 0xff; + op[3] = disp; +#endif + reloc_type = keep_reloc ? BFD_RELOC_24_PCREL : BFD_RELOC_NONE; + reloc_adjust = 2; + break; + + default: + /* These are opcodes we'll relax in th linker, later. */ + if (rxb->n_fixups) + reloc_type = rxb->fixups[ri].fixP->fx_r_type; + break; + } + break; + + case RX_RELAX_IMM: + { + int nbytes = fragP->fr_subtype - fragP->tc_frag_data->relax[ri].val_ofs; + int li; + char * imm = op + fragP->tc_frag_data->relax[ri].val_ofs; + + switch (nbytes) + { + case 1: + li = 1; + imm[0] = addr0; + reloc_type = BFD_RELOC_8; + break; + case 2: + li = 2; +#if RX_OPCODE_BIG_ENDIAN + imm[1] = addr0; + imm[0] = addr0 >> 8; +#else + imm[0] = addr0; + imm[1] = addr0 >> 8; +#endif + reloc_type = BFD_RELOC_RX_16_OP; + break; + case 3: + li = 3; +#if RX_OPCODE_BIG_ENDIAN + imm[2] = addr0; + imm[1] = addr0 >> 8; + imm[0] = addr0 >> 16; +#else + imm[0] = addr0; + imm[1] = addr0 >> 8; + imm[2] = addr0 >> 16; +#endif + reloc_type = BFD_RELOC_RX_24_OP; + break; + case 4: + li = 0; +#if RX_OPCODE_BIG_ENDIAN + imm[3] = addr0; + imm[2] = addr0 >> 8; + imm[1] = addr0 >> 16; + imm[0] = addr0 >> 24; +#else + imm[0] = addr0; + imm[1] = addr0 >> 8; + imm[2] = addr0 >> 16; + imm[3] = addr0 >> 24; +#endif + reloc_type = BFD_RELOC_RX_32_OP; + break; + default: + as_bad (_("invalid immediate size")); + li = -1; + } + + switch (fragP->tc_frag_data->relax[ri].field_pos) + { + case 6: + op[0] &= 0xfc; + op[0] |= li; + break; + case 12: + op[1] &= 0xf3; + op[1] |= li << 2; + break; + case 20: + op[2] &= 0xf3; + op[2] |= li << 2; + break; + default: + as_bad (_("invalid immediate field position")); + } + } + break; + + default: + if (rxb->n_fixups) + { + reloc_type = fix->fx_r_type; + reloc_adjust = 0; + } + break; + } + + if (rxb->n_fixups) + { + + fix->fx_r_type = reloc_type; + fix->fx_where += reloc_adjust; + switch (reloc_type) + { + case BFD_RELOC_NONE: + fix->fx_size = 0; + break; + case BFD_RELOC_8: + fix->fx_size = 1; + break; + case BFD_RELOC_16_PCREL: + case BFD_RELOC_RX_16_OP: + fix->fx_size = 2; + break; + case BFD_RELOC_24_PCREL: + case BFD_RELOC_RX_24_OP: + fix->fx_size = 3; + break; + case BFD_RELOC_RX_32_OP: + fix->fx_size = 4; + break; + } + } + + fragP->fr_fix = fragP->fr_subtype + (fragP->fr_opcode - fragP->fr_literal); + tprintf ("fragP->fr_fix now %ld (%d + (%p - %p)\n", fragP->fr_fix, + fragP->fr_subtype, fragP->fr_opcode, fragP->fr_literal); + fragP->fr_var = 0; + + if (fragP->fr_next != NULL + && ((offsetT) (fragP->fr_next->fr_address - fragP->fr_address) + != fragP->fr_fix)) + as_bad (_("bad frag at %p : fix %ld addr %ld %ld \n"), fragP, + fragP->fr_fix, fragP->fr_address, fragP->fr_next->fr_address); +} + +#undef OPCODE + +int +rx_validate_fix_sub (struct fix * f) +{ + /* We permit the subtraction of two symbols as a 32-bit relocation. */ + if (f->fx_r_type == BFD_RELOC_RX_DIFF + && ! f->fx_pcrel + && f->fx_size == 4) + return 1; + return 0; +} + +long +md_pcrel_from_section (fixS * fixP, segT sec) +{ + long rv; + + if (fixP->fx_addsy != NULL + && (! S_IS_DEFINED (fixP->fx_addsy) + || S_GET_SEGMENT (fixP->fx_addsy) != sec)) + /* The symbol is undefined (or is defined but not in this section). + Let the linker figure it out. */ + return 0; + + rv = fixP->fx_frag->fr_address + fixP->fx_where; + switch (fixP->fx_r_type) + { + case BFD_RELOC_RX_DIR3U_PCREL: + return rv; + default: + return rv - 1; + } +} + +void +rx_cons_fix_new (fragS * frag, + int where, + int size, + expressionS * exp) +{ + bfd_reloc_code_real_type type; + + switch (size) + { + case 1: + type = BFD_RELOC_8; + break; + case 2: + type = BFD_RELOC_16; + break; + case 3: + type = BFD_RELOC_24; + break; + case 4: + type = BFD_RELOC_32; + break; + default: + as_bad (_("unsupported constant size %d\n"), size); + return; + } + + if (exp->X_op == O_subtract && exp->X_op_symbol) + { + if (size != 4 && size != 2 && size != 1) + as_bad (_("difference of two symbols only supported with .long, .short, or .byte")); + else + type = BFD_RELOC_RX_DIFF; + } + + fix_new_exp (frag, where, (int) size, exp, 0, type); +} + +void +md_apply_fix (struct fix * f ATTRIBUTE_UNUSED, + valueT * t ATTRIBUTE_UNUSED, + segT s ATTRIBUTE_UNUSED) +{ + /* Instruction bytes are always little endian. */ + char * op; + unsigned long val; + + if (f->fx_addsy && S_FORCE_RELOC (f->fx_addsy, 1)) + return; + if (f->fx_subsy && S_FORCE_RELOC (f->fx_subsy, 1)) + return; + +#define OP2(x) op[target_big_endian ? 1-x : x] +#define OP3(x) op[target_big_endian ? 2-x : x] +#define OP4(x) op[target_big_endian ? 3-x : x] + + op = f->fx_frag->fr_literal + f->fx_where; + val = (unsigned long) * t; + + /* Opcode words are always the same endian. Data words are either + big or little endian. */ + + switch (f->fx_r_type) + { + case BFD_RELOC_NONE: + break; + + case BFD_RELOC_RX_RELAX: + f->fx_done = 1; + break; + + case BFD_RELOC_RX_DIR3U_PCREL: + if (val < 3 || val > 10) + as_bad_where (f->fx_file, f->fx_line, + _("jump not 3..10 bytes away (is %d)"), (int) val); + op[0] &= 0xf8; + op[0] |= val & 0x07; + break; + + case BFD_RELOC_8: + case BFD_RELOC_8_PCREL: + case BFD_RELOC_RX_8U: + op[0] = val; + break; + + case BFD_RELOC_16: + OP2(1) = val & 0xff; + OP2(0) = (val >> 8) & 0xff; + break; + + case BFD_RELOC_16_PCREL: + case BFD_RELOC_RX_16_OP: + case BFD_RELOC_RX_16U: +#if RX_OPCODE_BIG_ENDIAN + op[1] = val & 0xff; + op[0] = (val >> 8) & 0xff; +#else + op[0] = val & 0xff; + op[1] = (val >> 8) & 0xff; +#endif + break; + + case BFD_RELOC_24: + OP3(0) = val & 0xff; + OP3(1) = (val >> 8) & 0xff; + OP3(2) = (val >> 16) & 0xff; + break; + + case BFD_RELOC_24_PCREL: + case BFD_RELOC_RX_24_OP: + case BFD_RELOC_RX_24U: +#if RX_OPCODE_BIG_ENDIAN + op[2] = val & 0xff; + op[1] = (val >> 8) & 0xff; + op[0] = (val >> 16) & 0xff; +#else + op[0] = val & 0xff; + op[1] = (val >> 8) & 0xff; + op[2] = (val >> 16) & 0xff; +#endif + break; + + case BFD_RELOC_RX_DIFF: + switch (f->fx_size) + { + case 1: + op[0] = val & 0xff; + break; + case 2: + OP2(0) = val & 0xff; + OP2(1) = (val >> 8) & 0xff; + break; + case 4: + OP4(0) = val & 0xff; + OP4(1) = (val >> 8) & 0xff; + OP4(2) = (val >> 16) & 0xff; + OP4(3) = (val >> 24) & 0xff; + break; + } + break; + + case BFD_RELOC_32: + OP4(0) = val & 0xff; + OP4(1) = (val >> 8) & 0xff; + OP4(2) = (val >> 16) & 0xff; + OP4(3) = (val >> 24) & 0xff; + break; + + case BFD_RELOC_RX_32_OP: +#if RX_OPCODE_BIG_ENDIAN + op[3] = val & 0xff; + op[2] = (val >> 8) & 0xff; + op[1] = (val >> 16) & 0xff; + op[0] = (val >> 24) & 0xff; +#else + op[0] = val & 0xff; + op[1] = (val >> 8) & 0xff; + op[2] = (val >> 16) & 0xff; + op[3] = (val >> 24) & 0xff; +#endif + break; + + case BFD_RELOC_RX_NEG8: + op[0] = - val; + break; + + case BFD_RELOC_RX_NEG16: + val = -val; +#if RX_OPCODE_BIG_ENDIAN + op[1] = val & 0xff; + op[0] = (val >> 8) & 0xff; +#else + op[0] = val & 0xff; + op[1] = (val >> 8) & 0xff; +#endif + break; + + case BFD_RELOC_RX_NEG24: + val = -val; +#if RX_OPCODE_BIG_ENDIAN + op[2] = val & 0xff; + op[1] = (val >> 8) & 0xff; + op[0] = (val >> 16) & 0xff; +#else + op[0] = val & 0xff; + op[1] = (val >> 8) & 0xff; + op[2] = (val >> 16) & 0xff; +#endif + break; + + case BFD_RELOC_RX_NEG32: + val = -val; +#if RX_OPCODE_BIG_ENDIAN + op[3] = val & 0xff; + op[2] = (val >> 8) & 0xff; + op[1] = (val >> 16) & 0xff; + op[0] = (val >> 24) & 0xff; +#else + op[0] = val & 0xff; + op[1] = (val >> 8) & 0xff; + op[2] = (val >> 16) & 0xff; + op[3] = (val >> 24) & 0xff; +#endif + break; + + case BFD_RELOC_RX_GPRELL: + val >>= 1; + case BFD_RELOC_RX_GPRELW: + val >>= 1; + case BFD_RELOC_RX_GPRELB: +#if RX_OPCODE_BIG_ENDIAN + op[1] = val & 0xff; + op[0] = (val >> 8) & 0xff; +#else + op[0] = val & 0xff; + op[1] = (val >> 8) & 0xff; +#endif + break; + + default: + as_bad (_("Unknown reloc in md_apply_fix: %s"), + bfd_get_reloc_code_name (f->fx_r_type)); + break; + } + + if (f->fx_addsy == NULL) + f->fx_done = 1; +} + +arelent ** +tc_gen_reloc (asection * seg ATTRIBUTE_UNUSED, fixS * fixp) +{ + static arelent * reloc[5]; + + if (fixp->fx_r_type == BFD_RELOC_NONE) + { + reloc[0] = NULL; + return reloc; + } + + if (fixp->fx_subsy + && S_GET_SEGMENT (fixp->fx_subsy) == absolute_section) + { + fixp->fx_offset -= S_GET_VALUE (fixp->fx_subsy); + fixp->fx_subsy = NULL; + } + + reloc[0] = (arelent *) xmalloc (sizeof (arelent)); + reloc[0]->sym_ptr_ptr = (asymbol **) xmalloc (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; + + /* Certain BFD relocations cannot be translated directly into + a single (non-Red Hat) RX relocation, but instead need + multiple RX relocations - handle them here. */ + switch (fixp->fx_r_type) + { + case BFD_RELOC_RX_DIFF: + reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); + + reloc[1] = (arelent *) xmalloc (sizeof (arelent)); + reloc[1]->sym_ptr_ptr = (asymbol **) xmalloc (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] = (arelent *) xmalloc (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] = (arelent *) xmalloc (sizeof (arelent)); + switch (fixp->fx_size) + { + case 1: + reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS8); + break; + case 2: + reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS16); + break; + case 4: + reloc[3]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_ABS32); + break; + } + 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[4] = NULL; + break; + + case BFD_RELOC_RX_GPRELL: + reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); + + reloc[1] = (arelent *) xmalloc (sizeof (arelent)); + reloc[1]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); + if (gp_symbol == NULL) + { + if (symbol_table_frozen) + { + symbolS * gp; + + gp = symbol_find ("__gp"); + if (gp == NULL) + as_bad (("unable to create __gp symbol: please re-assemble with the -msmall-data-limit option specified")); + else + gp_symbol = symbol_get_bfdsym (gp); + } + 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] = (arelent *) xmalloc (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] = (arelent *) xmalloc (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[4] = NULL; + break; + + case BFD_RELOC_RX_GPRELW: + reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); + + reloc[1] = (arelent *) xmalloc (sizeof (arelent)); + reloc[1]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); + if (gp_symbol == NULL) + { + if (symbol_table_frozen) + { + symbolS * gp; + + gp = symbol_find ("__gp"); + if (gp == NULL) + as_bad (("unable to create __gp symbol: please re-assemble with the -msmall-data-limit option specified")); + else + gp_symbol = symbol_get_bfdsym (gp); + } + 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] = (arelent *) xmalloc (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] = (arelent *) xmalloc (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[4] = NULL; + break; + + case BFD_RELOC_RX_GPRELB: + reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_RX_SYM); + + reloc[1] = (arelent *) xmalloc (sizeof (arelent)); + reloc[1]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); + if (gp_symbol == NULL) + { + if (symbol_table_frozen) + { + symbolS * gp; + + gp = symbol_find ("__gp"); + if (gp == NULL) + as_bad (("unable to create __gp symbol: please re-assemble with the -msmall-data-limit option specified")); + else + gp_symbol = symbol_get_bfdsym (gp); + } + 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] = (arelent *) xmalloc (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] = (arelent *) xmalloc (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[4] = NULL; + break; + + default: + reloc[0]->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type); + reloc[1] = NULL; + break; + } + + return reloc; +} + +/* Set the ELF specific flags. */ + +void +rx_elf_final_processing (void) +{ + elf_elfheader (stdoutput)->e_flags |= elf_flags; +} + +/* Scan the current input line for occurances of Renesas + local labels and replace them with the GAS version. */ + +void +rx_start_line (void) +{ + int in_double_quote = 0; + int in_single_quote = 0; + int done = 0; + char * p = input_line_pointer; + + /* Scan the line looking for question marks. Skip past quote enclosed regions. */ + do + { + switch (*p) + { + case '\n': + case 0: + done = 1; + break; + + case '"': + in_double_quote = ! in_double_quote; + break; + + case '\'': + in_single_quote = ! in_single_quote; + break; + + case '?': + if (in_double_quote || in_single_quote) + break; + + if (p[1] == ':') + *p = '1'; + else if (p[1] == '+') + { + p[0] = '1'; + p[1] = 'f'; + } + else if (p[1] == '-') + { + p[0] = '1'; + p[1] = 'b'; + } + break; + + default: + break; + } + + p ++; + } + while (! done); +} diff --git a/gas/config/tc-rx.h b/gas/config/tc-rx.h new file mode 100644 index 0000000..592eb35 --- /dev/null +++ b/gas/config/tc-rx.h @@ -0,0 +1,93 @@ +/* tc-rx.h - header file for Renesas RX + Copyright 2008, 2009 + Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + + GAS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + GAS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GAS; see the file COPYING. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +#define TC_RX + +extern int target_big_endian; + +#define LISTING_HEADER (target_big_endian ? "RX GAS BE" : "RX GAS LE") +#define LISTING_LHS_WIDTH 8 +#define LISTING_WORD_SIZE 1 + +#define TARGET_ARCH bfd_arch_rx + +/* Instruction bytes are big endian, data bytes can be either. */ +#define TARGET_BYTES_BIG_ENDIAN 0 + +#define TARGET_FORMAT (target_big_endian ? "elf32-rx-be" : "elf32-rx-le") + +/* We don't need to handle .word strangely. */ +#define WORKING_DOT_WORD + +/* Permit temporary numeric labels. */ +#define LOCAL_LABELS_FB 1 +/* But make sure that the binutils treat them as locals. */ +#define LOCAL_LABEL_PREFIX '.' + +/* Allow classic-style constants. */ +#define NUMBERS_WITH_SUFFIX 1 + +/* .-foo gets turned into PC relative relocs. */ +#define DIFF_EXPR_OK + +#define md_end rx_md_end +extern void rx_md_end (void); + +#define md_relax_frag rx_relax_frag +extern int rx_relax_frag (segT, fragS *, long); + +#define TC_FRAG_TYPE struct rx_bytesT * +#define TC_FRAG_INIT rx_frag_init +extern void rx_frag_init (fragS *); + +/* Call md_pcrel_from_section(), not md_pcrel_from(). */ +#define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from_section (FIXP, SEC) +extern long md_pcrel_from_section (struct fix *, segT); + +/* RX doesn't have a 32 bit PCREL relocations. */ +#define TC_FORCE_RELOCATION_SUB_LOCAL(FIX, SEG) 1 + +#define TC_VALIDATE_FIX_SUB(FIX, SEG) \ + rx_validate_fix_sub (FIX) +extern int rx_validate_fix_sub (struct fix *); + +#define TC_CONS_FIX_NEW(FRAG, WHERE, NBYTES, EXP) \ + rx_cons_fix_new (FRAG, WHERE, NBYTES, EXP) +extern void rx_cons_fix_new (fragS *, int, int, expressionS *); + +#define tc_fix_adjustable(x) 0 + +#define HANDLE_ALIGN(FRAG) rx_handle_align (FRAG) +extern void rx_handle_align (fragS *); + +#define RELOC_EXPANSION_POSSIBLE 1 +#define MAX_RELOC_EXPANSION 4 + +#define elf_tc_final_processing rx_elf_final_processing +extern void rx_elf_final_processing (void); + +extern bfd_boolean rx_use_conventional_section_names; +#define TEXT_SECTION_NAME (rx_use_conventional_section_names ? ".text" : "P") +#define DATA_SECTION_NAME (rx_use_conventional_section_names ? ".data" : "D_1") +#define BSS_SECTION_NAME (rx_use_conventional_section_names ? ".bss" : "B_1") + +#define md_start_line_hook rx_start_line +extern void rx_start_line (void); diff --git a/gas/configure b/gas/configure index a0d1763..374a6b0 100755 --- a/gas/configure +++ b/gas/configure @@ -12029,6 +12029,13 @@ _ACEOF fi ;; + rx) + echo ${extra_objects} | grep -s "rx-parse.o" + if test $? -ne 0 ; then + extra_objects="$extra_objects rx-parse.o" + fi + ;; + xstormy16) using_cgen=yes ;; diff --git a/gas/configure.in b/gas/configure.in index 2c456e0..8441e13 100644 --- a/gas/configure.in +++ b/gas/configure.in @@ -353,6 +353,13 @@ changequote([,])dnl fi ;; + rx) + echo ${extra_objects} | grep -s "rx-parse.o" + if test $? -ne 0 ; then + extra_objects="$extra_objects rx-parse.o" + fi + ;; + xstormy16) using_cgen=yes ;; diff --git a/gas/configure.tgt b/gas/configure.tgt index 054f2b8..043f445 100644 --- a/gas/configure.tgt +++ b/gas/configure.tgt @@ -65,6 +65,7 @@ case ${cpu} in powerpc*le*) cpu_type=ppc endian=little ;; powerpc*) cpu_type=ppc endian=big ;; rs6000*) cpu_type=ppc ;; + rx) cpu_type=rx ;; s390x*) cpu_type=s390 arch=s390x ;; s390*) cpu_type=s390 arch=s390 ;; score*l) cpu_type=score endian=little ;; diff --git a/gas/doc/Makefile.am b/gas/doc/Makefile.am index e00243c..36a89d9 100644 --- a/gas/doc/Makefile.am +++ b/gas/doc/Makefile.am @@ -58,6 +58,7 @@ CPU_DOCS = \ c-pdp11.texi \ c-pj.texi \ c-ppc.texi \ + c-rx.texi \ c-s390.texi \ c-score.texi \ c-sh.texi \ diff --git a/gas/doc/Makefile.in b/gas/doc/Makefile.in index 74e3c91..74bdb7e 100644 --- a/gas/doc/Makefile.in +++ b/gas/doc/Makefile.in @@ -296,6 +296,7 @@ CPU_DOCS = \ c-pdp11.texi \ c-pj.texi \ c-ppc.texi \ + c-rx.texi \ c-s390.texi \ c-score.texi \ c-sh.texi \ diff --git a/gas/doc/all.texi b/gas/doc/all.texi index b16d26c..9ed3647c 100644 --- a/gas/doc/all.texi +++ b/gas/doc/all.texi @@ -58,6 +58,7 @@ @set PDP11 @set PJ @set PPC +@set RX @set S390 @set SCORE @set SH diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo index 2d9188d..e676f84 100644 --- a/gas/doc/as.texinfo +++ b/gas/doc/as.texinfo @@ -421,6 +421,13 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}. [@b{-mlittle}|@b{-mlittle-endian}|@b{-mbig}|@b{-mbig-endian}] [@b{-msolaris}|@b{-mno-solaris}] @end ifset +@ifset RX + +@emph{Target RX options:} + [@b{-mlittle-endian}|@b{-mbig-endian}] + [@b{-m32bit-ints}|@b{-m16bit-ints}] + [@b{-m32bit-doubles}|@b{-m64bit-doubles}] +@end ifset @ifset S390 @emph{Target s390 options:} diff --git a/gas/doc/c-rx.texi b/gas/doc/c-rx.texi new file mode 100644 index 0000000..33ffe19 --- /dev/null +++ b/gas/doc/c-rx.texi @@ -0,0 +1,145 @@ +@c Copyright 2008, 2009 +@c Free Software Foundation, Inc. +@c This is part of the GAS manual. +@c For copying conditions, see the file as.texinfo. +@ifset GENERIC +@page +@node RX-Dependent +@chapter RX Dependent Features +@end ifset +@ifclear GENERIC +@node Machine Dependencies +@chapter RX Dependent Features +@end ifclear + +@cindex RX support +@menu +* RX-Opts:: RX Assembler Command Line Options +* RX-Modifiers:: Symbolic Operand Modifiers +* RX-Directives:: Assembler Directives +* RX-Float:: Floating Point +@end menu + +@node RX-Opts +@section RX Options +@cindex options, RX +@cindex RX options + +The Renesas RX port of @code{@value{AS}} has a few target specfic +command line options: + +@table @code + +@cindex @samp{-m32bit-doubles} +@item -m32bit-doubles +This option controls the ABI and indicates to use a 32-bit float ABI. +It has no effect on the assembled instructions, but it does influence +the behaviour of the @samp{.double} pseudo-op. +This is the default. + +@cindex @samp{-m64bit-doubles} +@item -m64bit-doubles +This option controls the ABI and indicates to use a 64-bit float ABI. +It has no effect on the assembled instructions, but it does influence +the behaviour of the @samp{.double} pseudo-op. + +@cindex @samp{-mbig-endian} +@item -mbig-endian +This option controls the ABI and indicates to use a big-endian data +ABI. It has no effect on the assembled instructions, but it does +influence the behaviour of the @samp{.short}, @samp{.hword}, @samp{.int}, +@samp{.word}, @samp{.long}, @samp{.quad} and @samp{.octa} pseudo-ops. + +@cindex @samp{-mlittle-endian} +@item -mlittle-endian +This option controls the ABI and indicates to use a little-endian data +ABI. It has no effect on the assembled instructions, but it does +influence the behaviour of the @samp{.short}, @samp{.hword}, @samp{.int}, +@samp{.word}, @samp{.long}, @samp{.quad} and @samp{.octa} pseudo-ops. +This is the default. + +@cindex @samp{-muse-conventional-section-names} +@item -muse-conventional-section-names +This option controls the default names given to the code (.text), +initialised data (.data) and uninitialised data sections (.bss). + +@cindex @samp{-muse-renesas-section-names} +@item -muse-renesas-section-names +This option controls the default names given to the code (.P), +initialised data (.D_1) and uninitialised data sections (.B_1). +This is the default. + +@cindex @samp{-msmall-data-limit} +@item -msmall-data-limit +This option tells the assembler that the small data limit feature of +the RX port of GCC is being used. This results in the assembler +generating an undefined reference to a symbol called __gp for use by +the relocations that are needed to support the small data limit +feature. This option is not enabled by default as it would otherwise +pollute the symbol table. + +@end table + +@node RX-Modifiers +@section Symbolic Operand Modifiers + +@cindex RX modifiers +@cindex syntax, RX + +The assembler supports several modifiers when using symbol addresses +in RX instruction operands. The general syntax is the following: + +@smallexample +%modifier(symbol) +@end smallexample + +@table @code +@cindex symbol modifiers + +@item %gp +@c FIXME: Add documentation here. + +@end table + +@node RX-Directives +@section Assembler Directives + +@cindex assembler directives, RX +@cindex RX assembler directives + +The RX version of @code{@value{AS}} has the following specific +assembler directives: + +@table @code + +@item .3byte +@cindex assembler directive .3byte, RX +@cindex RX assembler directive .3byte +Inserts a 3-byte value into the output file at the current location. + +@end table + +@node RX-Float +@section Floating Point + +@cindex floating point, RX +@cindex RX floating point + +The floating point formats generated by directives are these. + +@table @code +@cindex @code{float} directive, RX + +@item .float +@code{Single} precision (32-bit) floating point constants. + +@cindex @code{double} directive, RX +@item .double +If the @option{-m64bit-doubles} command line option has been specified +then then @code{double} directive generates @code{double} precision +(64-bit) floating point constants, otherwise it generates +@code{single} precision (32-bit) floating point constants. To force +the generation of 64-bit floating point constants used the @code{dc.d} +directive instead. + +@end table diff --git a/gas/read.c b/gas/read.c index 5ebe288..2fa0117 100644 --- a/gas/read.c +++ b/gas/read.c @@ -2981,6 +2981,57 @@ do_repeat (int count, const char *start, const char *end) buffer_limit = input_scrub_next_buffer (&input_line_pointer); } +/* Like do_repeat except that any text matching EXPANDER in the + block is replaced by the itteration count. */ + +void +do_repeat_with_expander (int count, + const char * start, + const char * end, + const char * expander) +{ + sb one; + sb many; + + sb_new (&one); + if (!buffer_and_nest (start, end, &one, get_non_macro_line_sb)) + { + as_bad (_("%s without %s"), start, end); + return; + } + + sb_new (&many); + + if (expander != NULL && strstr (one.ptr, expander) != NULL) + { + while (count -- > 0) + { + int len; + char * sub; + sb processed; + + sb_new (& processed); + sb_add_sb (& processed, & one); + sub = strstr (processed.ptr, expander); + len = sprintf (sub, "%d", count); + gas_assert (len < 8); + strcpy (sub + len, sub + 8); + processed.len -= (8 - len); + sb_add_sb (& many, & processed); + sb_kill (& processed); + } + } + else + while (count-- > 0) + sb_add_sb (&many, &one); + + sb_kill (&one); + + input_scrub_include_sb (&many, input_line_pointer, 1); + sb_kill (&many); + buffer_limit = input_scrub_next_buffer (&input_line_pointer); +} + /* Skip to end of current repeat loop; EXTRA indicates how many additional input buffers to skip. Assumes that conditionals preceding the loop end are properly nested. diff --git a/gas/read.h b/gas/read.h index 1446611..82ccc75 100644 --- a/gas/read.h +++ b/gas/read.h @@ -127,6 +127,7 @@ extern void stabs_generate_asm_lineno (void); extern void stabs_generate_asm_func (const char *, const char *); extern void stabs_generate_asm_endfunc (const char *, const char *); extern void do_repeat (int,const char *,const char *); +extern void do_repeat_with_expander (int, const char *, const char *, const char *); extern void end_repeat (int); extern void do_parse_cons_expression (expressionS *, int); diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index deb9d07..8c151a4 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2009-09-29 DJ Delorie + + * gas/rx: New directory. + * gas/rx/*: New set of test cases. + * gas/elf/section2.e-rx: New expected output file. + * gas/all/gas.exp: Add support for RX target. + * gas/elf/elf.exp: Likewise. + * gas/lns/lns.exp: Likewise. + * gas/macros/macros.exp: Likewise. + 2009-09-29 Peter Bergner * gas/ppc/vsx.s ("lxsdux", "lxvd2ux", "lxvw4ux", "stxsdux", diff --git a/gas/testsuite/gas/all/gas.exp b/gas/testsuite/gas/all/gas.exp index 2b93f57..8008236 100644 --- a/gas/testsuite/gas/all/gas.exp +++ b/gas/testsuite/gas/all/gas.exp @@ -38,8 +38,11 @@ if { ![istarget cris-*-*] && ![istarget crisv32-*-*] # The MN10300 port supports link time relaxation which in turn allows # for link time resolution of the differneces of two symbols which are # undefined at assembly time. Hence this test will not pass for the -# MN10300. -if { ![istarget hppa*-*-*] && ![istarget mn10300-*-*] && ![istarget am3*-*-*] } then { +# MN10300. The same thing is true for the RX port as well. +if { ![istarget hppa*-*-*] + && ![istarget rx-*-*] + && ![istarget mn10300-*-*] + && ![istarget am3*-*-*] } then { gas_test_error "diff1.s" "" "difference of two undefined symbols" } @@ -109,12 +112,12 @@ case $target_triplet in { # symbol `sym' required but not present setup_xfail "*arm*-*-*aout*" "*arm*-*-*coff" \ "*arm*-*-pe" "m68hc*-*-*" "maxq-*-*" \ - "vax*-*-*" "z8k-*-*" + "rx-*-*" "vax*-*-*" "z8k-*-*" run_dump_test redef2 setup_xfail "*-*-aix*" "*-*-coff" "*-*-cygwin" "*-*-mingw*" "*-*-pe*" \ "bfin-*-*" "hppa*-*-hpux*" \ "m68hc*-*-*" "maxq-*-*" "or32-*-*" \ - "vax*-*-*" "z8k-*-*" + "rx-*-*" "vax*-*-*" "z8k-*-*" run_dump_test redef3 gas_test_error "redef4.s" "" ".set for symbol already used as label" gas_test_error "redef5.s" "" ".set for symbol already defined through .comm" @@ -163,7 +166,7 @@ proc general_info_section {} { gas_start "comment.s" "-agn" while 1 { expect { - -re "^ \[^\n\]*\t: \-agn\[^\n\]*\n" { set x1 1 } + -re "^ \[^\n\]*\t: .*\-agn\[^\n\]*\n" { set x1 1 } -re "^ \[^\n\]*\t: \[^\n\]*comment\.s\[^\n\]*\n" { set x2 1 } -re "^ \[^\n\]*\t: a\.out\[^\n\]*\n" { set x3 1 } -re "\[^\n\]*\n" { } @@ -300,6 +303,7 @@ case $target_triplet in { { hppa*-*-* } { } { *c4x*-*-* } { } { *c54x*-*-* } { } + { rx-*-* } { } default { test_cond remote_download host "$srcdir/$subdir/incbin.dat" diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp index caf8436..e65d2cf 100644 --- a/gas/testsuite/gas/elf/elf.exp +++ b/gas/testsuite/gas/elf/elf.exp @@ -62,6 +62,9 @@ if { ([istarget "*-*-*elf*"] if {[istarget "xtensa*-*-*"]} then { set target_machine -xtensa } + if {[istarget "rx-*-*"]} then { + set target_machine -rx + } if { ([istarget "*arm*-*-*"] || [istarget "xscale*-*-*"]) } { @@ -111,6 +114,7 @@ if { ([istarget "*-*-*elf*"] { mn10200-*-* } { } { mn10300-*-* } { } { *c54x*-*-* } { } + { rx-*-* } { } default { # The next test can fail if the target does not convert fixups # against ordinary symbols into relocations against section symbols. diff --git a/gas/testsuite/gas/elf/section2.e-rx b/gas/testsuite/gas/elf/section2.e-rx new file mode 100644 index 0000000..574219d --- /dev/null +++ b/gas/testsuite/gas/elf/section2.e-rx @@ -0,0 +1,9 @@ + +Symbol table '.symtab' contains . entries: + Num: Value[ ]* Size Type Bind Vis Ndx Name + 0: 0+0 0 NOTYPE LOCAL DEFAULT UND + 1: 0+0 0 SECTION LOCAL DEFAULT 1 + 2: 0+0 0 SECTION LOCAL DEFAULT 2 + 3: 0+0 0 SECTION LOCAL DEFAULT 3 + 4: 0+0 0 SECTION LOCAL DEFAULT 4 +#... diff --git a/gas/testsuite/gas/lns/lns.exp b/gas/testsuite/gas/lns/lns.exp index 025a856..4fba663 100644 --- a/gas/testsuite/gas/lns/lns.exp +++ b/gas/testsuite/gas/lns/lns.exp @@ -13,6 +13,7 @@ if { && ![istarget i960-*-*] && ![istarget mcore-*-*] && ![istarget or32-*-*] + && ![istarget rx-*-*] && ![istarget s390*-*-*] } { # Use alternate file for targets using DW_LNS_fixed_advance_pc opcodes. diff --git a/gas/testsuite/gas/macros/macros.exp b/gas/testsuite/gas/macros/macros.exp index f8d5c80..9a4aec8 100644 --- a/gas/testsuite/gas/macros/macros.exp +++ b/gas/testsuite/gas/macros/macros.exp @@ -65,6 +65,7 @@ case $target_triplet in { { m68*-*-* } { } { m88*-*-* } { } { mmix-* } { } + { rx-*-* } { } { z80-* } { } default { run_list_test dot "-alm" } } diff --git a/gas/testsuite/gas/rx/abs.d b/gas/testsuite/gas/rx/abs.d new file mode 100644 index 0000000..1a91231 --- /dev/null +++ b/gas/testsuite/gas/rx/abs.d @@ -0,0 +1,14 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7e 20 abs r0 + 2: 7e 2f abs r15 + 4: fc 0f 00 abs r0, r0 + 7: fc 0f 0f abs r0, r15 + a: fc 0f f0 abs r15, r0 + d: fc 0f ff abs r15, r15 diff --git a/gas/testsuite/gas/rx/abs.sm b/gas/testsuite/gas/rx/abs.sm new file mode 100644 index 0000000..7352a55 --- /dev/null +++ b/gas/testsuite/gas/rx/abs.sm @@ -0,0 +1,2 @@ + abs {reg} + abs {reg},{reg} diff --git a/gas/testsuite/gas/rx/adc.d b/gas/testsuite/gas/rx/adc.d new file mode 100644 index 0000000..c78363e --- /dev/null +++ b/gas/testsuite/gas/rx/adc.d @@ -0,0 +1,40 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 74 20 80 adc #-128, r0 + 4: fd 74 2f 80 adc #-128, r15 + 8: fd 74 20 7f adc #127, r0 + c: fd 74 2f 7f adc #127, r15 + 10: fd 78 20 00 80 adc #0xffff8000, r0 + 15: fd 78 2f 00 80 adc #0xffff8000, r15 + 1a: fd 7c 20 00 80 00 adc #0x8000, r0 + 20: fd 7c 2f 00 80 00 adc #0x8000, r15 + 26: fd 7c 20 00 00 80 adc #0xff800000, r0 + 2c: fd 7c 2f 00 00 80 adc #0xff800000, r15 + 32: fd 7c 20 ff ff 7f adc #0x7fffff, r0 + 38: fd 7c 2f ff ff 7f adc #0x7fffff, r15 + 3e: fd 70 20 00 00 00 80 adc #0x80000000, r0 + 45: fd 70 2f 00 00 00 80 adc #0x80000000, r15 + 4c: fd 70 20 ff ff ff 7f adc #0x7fffffff, r0 + 53: fd 70 2f ff ff ff 7f adc #0x7fffffff, r15 + 5a: fc 0b 00 adc r0, r0 + 5d: fc 0b 0f adc r0, r15 + 60: fc 0b f0 adc r15, r0 + 63: fc 0b ff adc r15, r15 + 66: 06 a0 02 00 adc \[r0\]\.l, r0 + 6a: 06 a0 02 0f adc \[r0\]\.l, r15 + 6e: 06 a0 02 f0 adc \[r15\]\.l, r0 + 72: 06 a0 02 ff adc \[r15\]\.l, r15 + 76: 06 a1 02 00 3f adc 252\[r0\]\.l, r0 + 7b: 06 a1 02 0f 3f adc 252\[r0\]\.l, r15 + 80: 06 a1 02 f0 3f adc 252\[r15\]\.l, r0 + 85: 06 a1 02 ff 3f adc 252\[r15\]\.l, r15 + 8a: 06 a2 02 00 ff 3f adc 65532\[r0\]\.l, r0 + 90: 06 a2 02 0f ff 3f adc 65532\[r0\]\.l, r15 + 96: 06 a2 02 f0 ff 3f adc 65532\[r15\]\.l, r0 + 9c: 06 a2 02 ff ff 3f adc 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/adc.sm b/gas/testsuite/gas/rx/adc.sm new file mode 100644 index 0000000..eea007a --- /dev/null +++ b/gas/testsuite/gas/rx/adc.sm @@ -0,0 +1,4 @@ + adc #{imm},{reg} + adc {reg},{reg} + adc {dsp}[{reg}].L,{reg} + diff --git a/gas/testsuite/gas/rx/add.d b/gas/testsuite/gas/rx/add.d new file mode 100644 index 0000000..1bf5005 --- /dev/null +++ b/gas/testsuite/gas/rx/add.d @@ -0,0 +1,132 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 62 00 add #0, r0 + 2: 62 0f add #0, r15 + 4: 62 f0 add #15, r0 + 6: 62 ff add #15, r15 + 8: 71 00 80 add #-128, r0, r0 + b: 71 ff 80 add #-128, r15, r15 + e: 71 00 7f add #127, r0, r0 + 11: 71 ff 7f add #127, r15, r15 + 14: 72 00 00 80 add #0xffff8000, r0, r0 + 18: 72 ff 00 80 add #0xffff8000, r15, r15 + 1c: 73 00 00 80 00 add #0x8000, r0, r0 + 21: 73 ff 00 80 00 add #0x8000, r15, r15 + 26: 73 00 00 00 80 add #0xff800000, r0, r0 + 2b: 73 ff 00 00 80 add #0xff800000, r15, r15 + 30: 73 00 ff ff 7f add #0x7fffff, r0, r0 + 35: 73 ff ff ff 7f add #0x7fffff, r15, r15 + 3a: 70 00 00 00 00 80 add #0x80000000, r0, r0 + 40: 70 ff 00 00 00 80 add #0x80000000, r15, r15 + 46: 70 00 ff ff ff 7f add #0x7fffffff, r0, r0 + 4c: 70 ff ff ff ff 7f add #0x7fffffff, r15, r15 + 52: 4b 00 add r0, r0 + 54: 4b 0f add r0, r15 + 56: 4b f0 add r15, r0 + 58: 4b ff add r15, r15 + 5a: 48 00 add \[r0\]\.ub, r0 + 5c: 48 0f add \[r0\]\.ub, r15 + 5e: 06 08 00 add \[r0\]\.b, r0 + 61: 06 08 0f add \[r0\]\.b, r15 + 64: 06 c8 00 add \[r0\]\.uw, r0 + 67: 06 c8 0f add \[r0\]\.uw, r15 + 6a: 06 48 00 add \[r0\]\.w, r0 + 6d: 06 48 0f add \[r0\]\.w, r15 + 70: 06 88 00 add \[r0\]\.l, r0 + 73: 06 88 0f add \[r0\]\.l, r15 + 76: 48 f0 add \[r15\]\.ub, r0 + 78: 48 ff add \[r15\]\.ub, r15 + 7a: 06 08 f0 add \[r15\]\.b, r0 + 7d: 06 08 ff add \[r15\]\.b, r15 + 80: 06 c8 f0 add \[r15\]\.uw, r0 + 83: 06 c8 ff add \[r15\]\.uw, r15 + 86: 06 48 f0 add \[r15\]\.w, r0 + 89: 06 48 ff add \[r15\]\.w, r15 + 8c: 06 88 f0 add \[r15\]\.l, r0 + 8f: 06 88 ff add \[r15\]\.l, r15 + 92: 49 00 fc add 252\[r0\]\.ub, r0 + 95: 49 0f fc add 252\[r0\]\.ub, r15 + 98: 06 09 00 fc add 252\[r0\]\.b, r0 + 9c: 06 09 0f fc add 252\[r0\]\.b, r15 + a0: 06 c9 00 7e add 252\[r0\]\.uw, r0 + a4: 06 c9 0f 7e add 252\[r0\]\.uw, r15 + a8: 06 49 00 7e add 252\[r0\]\.w, r0 + ac: 06 49 0f 7e add 252\[r0\]\.w, r15 + b0: 06 89 00 3f add 252\[r0\]\.l, r0 + b4: 06 89 0f 3f add 252\[r0\]\.l, r15 + b8: 49 f0 fc add 252\[r15\]\.ub, r0 + bb: 49 ff fc add 252\[r15\]\.ub, r15 + be: 06 09 f0 fc add 252\[r15\]\.b, r0 + c2: 06 09 ff fc add 252\[r15\]\.b, r15 + c6: 06 c9 f0 7e add 252\[r15\]\.uw, r0 + ca: 06 c9 ff 7e add 252\[r15\]\.uw, r15 + ce: 06 49 f0 7e add 252\[r15\]\.w, r0 + d2: 06 49 ff 7e add 252\[r15\]\.w, r15 + d6: 06 89 f0 3f add 252\[r15\]\.l, r0 + da: 06 89 ff 3f add 252\[r15\]\.l, r15 + de: 4a 00 fc ff add 65532\[r0\]\.ub, r0 + e2: 4a 0f fc ff add 65532\[r0\]\.ub, r15 + e6: 06 0a 00 fc ff add 65532\[r0\]\.b, r0 + eb: 06 0a 0f fc ff add 65532\[r0\]\.b, r15 + f0: 06 ca 00 fe 7f add 65532\[r0\]\.uw, r0 + f5: 06 ca 0f fe 7f add 65532\[r0\]\.uw, r15 + fa: 06 4a 00 fe 7f add 65532\[r0\]\.w, r0 + ff: 06 4a 0f fe 7f add 65532\[r0\]\.w, r15 + 104: 06 8a 00 ff 3f add 65532\[r0\]\.l, r0 + 109: 06 8a 0f ff 3f add 65532\[r0\]\.l, r15 + 10e: 4a f0 fc ff add 65532\[r15\]\.ub, r0 + 112: 4a ff fc ff add 65532\[r15\]\.ub, r15 + 116: 06 0a f0 fc ff add 65532\[r15\]\.b, r0 + 11b: 06 0a ff fc ff add 65532\[r15\]\.b, r15 + 120: 06 ca f0 fe 7f add 65532\[r15\]\.uw, r0 + 125: 06 ca ff fe 7f add 65532\[r15\]\.uw, r15 + 12a: 06 4a f0 fe 7f add 65532\[r15\]\.w, r0 + 12f: 06 4a ff fe 7f add 65532\[r15\]\.w, r15 + 134: 06 8a f0 ff 3f add 65532\[r15\]\.l, r0 + 139: 06 8a ff ff 3f add 65532\[r15\]\.l, r15 + 13e: 71 00 80 add #-128, r0, r0 + 141: 71 0f 80 add #-128, r0, r15 + 144: 71 f0 80 add #-128, r15, r0 + 147: 71 ff 80 add #-128, r15, r15 + 14a: 71 00 7f add #127, r0, r0 + 14d: 71 0f 7f add #127, r0, r15 + 150: 71 f0 7f add #127, r15, r0 + 153: 71 ff 7f add #127, r15, r15 + 156: 72 00 00 80 add #0xffff8000, r0, r0 + 15a: 72 0f 00 80 add #0xffff8000, r0, r15 + 15e: 72 f0 00 80 add #0xffff8000, r15, r0 + 162: 72 ff 00 80 add #0xffff8000, r15, r15 + 166: 73 00 00 80 00 add #0x8000, r0, r0 + 16b: 73 0f 00 80 00 add #0x8000, r0, r15 + 170: 73 f0 00 80 00 add #0x8000, r15, r0 + 175: 73 ff 00 80 00 add #0x8000, r15, r15 + 17a: 73 00 00 00 80 add #0xff800000, r0, r0 + 17f: 73 0f 00 00 80 add #0xff800000, r0, r15 + 184: 73 f0 00 00 80 add #0xff800000, r15, r0 + 189: 73 ff 00 00 80 add #0xff800000, r15, r15 + 18e: 73 00 ff ff 7f add #0x7fffff, r0, r0 + 193: 73 0f ff ff 7f add #0x7fffff, r0, r15 + 198: 73 f0 ff ff 7f add #0x7fffff, r15, r0 + 19d: 73 ff ff ff 7f add #0x7fffff, r15, r15 + 1a2: 70 00 00 00 00 80 add #0x80000000, r0, r0 + 1a8: 70 0f 00 00 00 80 add #0x80000000, r0, r15 + 1ae: 70 f0 00 00 00 80 add #0x80000000, r15, r0 + 1b4: 70 ff 00 00 00 80 add #0x80000000, r15, r15 + 1ba: 70 00 ff ff ff 7f add #0x7fffffff, r0, r0 + 1c0: 70 0f ff ff ff 7f add #0x7fffffff, r0, r15 + 1c6: 70 f0 ff ff ff 7f add #0x7fffffff, r15, r0 + 1cc: 70 ff ff ff ff 7f add #0x7fffffff, r15, r15 + 1d2: ff 20 00 add r0, r0, r0 + 1d5: ff 2f 00 add r0, r0, r15 + 1d8: ff 20 0f add r0, r15, r0 + 1db: ff 2f 0f add r0, r15, r15 + 1de: ff 20 f0 add r15, r0, r0 + 1e1: ff 2f f0 add r15, r0, r15 + 1e4: ff 20 ff add r15, r15, r0 + 1e7: ff 2f ff add r15, r15, r15 diff --git a/gas/testsuite/gas/rx/add.sm b/gas/testsuite/gas/rx/add.sm new file mode 100644 index 0000000..27708f9 --- /dev/null +++ b/gas/testsuite/gas/rx/add.sm @@ -0,0 +1,8 @@ + add #{uimm4},{reg} + add #{imm},{reg} + + add {reg},{reg} + add {memx},{reg} + + add #{imm},{reg},{reg} + add {reg},{reg},{reg} diff --git a/gas/testsuite/gas/rx/and.d b/gas/testsuite/gas/rx/and.d new file mode 100644 index 0000000..5aaafbd --- /dev/null +++ b/gas/testsuite/gas/rx/and.d @@ -0,0 +1,100 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 64 00 and #0, r0 + 2: 64 0f and #0, r15 + 4: 64 f0 and #15, r0 + 6: 64 ff and #15, r15 + 8: 75 20 80 and #-128, r0 + b: 75 2f 80 and #-128, r15 + e: 75 20 7f and #127, r0 + 11: 75 2f 7f and #127, r15 + 14: 76 20 00 80 and #0xffff8000, r0 + 18: 76 2f 00 80 and #0xffff8000, r15 + 1c: 77 20 00 80 00 and #0x8000, r0 + 21: 77 2f 00 80 00 and #0x8000, r15 + 26: 77 20 00 00 80 and #0xff800000, r0 + 2b: 77 2f 00 00 80 and #0xff800000, r15 + 30: 77 20 ff ff 7f and #0x7fffff, r0 + 35: 77 2f ff ff 7f and #0x7fffff, r15 + 3a: 74 20 00 00 00 80 and #0x80000000, r0 + 40: 74 2f 00 00 00 80 and #0x80000000, r15 + 46: 74 20 ff ff ff 7f and #0x7fffffff, r0 + 4c: 74 2f ff ff ff 7f and #0x7fffffff, r15 + 52: 53 00 and r0, r0 + 54: 53 0f and r0, r15 + 56: 53 f0 and r15, r0 + 58: 53 ff and r15, r15 + 5a: 50 00 and \[r0\]\.ub, r0 + 5c: 50 0f and \[r0\]\.ub, r15 + 5e: 06 10 00 and \[r0\]\.b, r0 + 61: 06 10 0f and \[r0\]\.b, r15 + 64: 06 d0 00 and \[r0\]\.uw, r0 + 67: 06 d0 0f and \[r0\]\.uw, r15 + 6a: 06 50 00 and \[r0\]\.w, r0 + 6d: 06 50 0f and \[r0\]\.w, r15 + 70: 06 90 00 and \[r0\]\.l, r0 + 73: 06 90 0f and \[r0\]\.l, r15 + 76: 50 f0 and \[r15\]\.ub, r0 + 78: 50 ff and \[r15\]\.ub, r15 + 7a: 06 10 f0 and \[r15\]\.b, r0 + 7d: 06 10 ff and \[r15\]\.b, r15 + 80: 06 d0 f0 and \[r15\]\.uw, r0 + 83: 06 d0 ff and \[r15\]\.uw, r15 + 86: 06 50 f0 and \[r15\]\.w, r0 + 89: 06 50 ff and \[r15\]\.w, r15 + 8c: 06 90 f0 and \[r15\]\.l, r0 + 8f: 06 90 ff and \[r15\]\.l, r15 + 92: 51 00 fc and 252\[r0\]\.ub, r0 + 95: 51 0f fc and 252\[r0\]\.ub, r15 + 98: 06 11 00 fc and 252\[r0\]\.b, r0 + 9c: 06 11 0f fc and 252\[r0\]\.b, r15 + a0: 06 d1 00 7e and 252\[r0\]\.uw, r0 + a4: 06 d1 0f 7e and 252\[r0\]\.uw, r15 + a8: 06 51 00 7e and 252\[r0\]\.w, r0 + ac: 06 51 0f 7e and 252\[r0\]\.w, r15 + b0: 06 91 00 3f and 252\[r0\]\.l, r0 + b4: 06 91 0f 3f and 252\[r0\]\.l, r15 + b8: 51 f0 fc and 252\[r15\]\.ub, r0 + bb: 51 ff fc and 252\[r15\]\.ub, r15 + be: 06 11 f0 fc and 252\[r15\]\.b, r0 + c2: 06 11 ff fc and 252\[r15\]\.b, r15 + c6: 06 d1 f0 7e and 252\[r15\]\.uw, r0 + ca: 06 d1 ff 7e and 252\[r15\]\.uw, r15 + ce: 06 51 f0 7e and 252\[r15\]\.w, r0 + d2: 06 51 ff 7e and 252\[r15\]\.w, r15 + d6: 06 91 f0 3f and 252\[r15\]\.l, r0 + da: 06 91 ff 3f and 252\[r15\]\.l, r15 + de: 52 00 fc ff and 65532\[r0\]\.ub, r0 + e2: 52 0f fc ff and 65532\[r0\]\.ub, r15 + e6: 06 12 00 fc ff and 65532\[r0\]\.b, r0 + eb: 06 12 0f fc ff and 65532\[r0\]\.b, r15 + f0: 06 d2 00 fe 7f and 65532\[r0\]\.uw, r0 + f5: 06 d2 0f fe 7f and 65532\[r0\]\.uw, r15 + fa: 06 52 00 fe 7f and 65532\[r0\]\.w, r0 + ff: 06 52 0f fe 7f and 65532\[r0\]\.w, r15 + 104: 06 92 00 ff 3f and 65532\[r0\]\.l, r0 + 109: 06 92 0f ff 3f and 65532\[r0\]\.l, r15 + 10e: 52 f0 fc ff and 65532\[r15\]\.ub, r0 + 112: 52 ff fc ff and 65532\[r15\]\.ub, r15 + 116: 06 12 f0 fc ff and 65532\[r15\]\.b, r0 + 11b: 06 12 ff fc ff and 65532\[r15\]\.b, r15 + 120: 06 d2 f0 fe 7f and 65532\[r15\]\.uw, r0 + 125: 06 d2 ff fe 7f and 65532\[r15\]\.uw, r15 + 12a: 06 52 f0 fe 7f and 65532\[r15\]\.w, r0 + 12f: 06 52 ff fe 7f and 65532\[r15\]\.w, r15 + 134: 06 92 f0 ff 3f and 65532\[r15\]\.l, r0 + 139: 06 92 ff ff 3f and 65532\[r15\]\.l, r15 + 13e: ff 40 00 and r0, r0, r0 + 141: ff 4f 00 and r0, r0, r15 + 144: ff 40 0f and r0, r15, r0 + 147: ff 4f 0f and r0, r15, r15 + 14a: ff 40 f0 and r15, r0, r0 + 14d: ff 4f f0 and r15, r0, r15 + 150: ff 40 ff and r15, r15, r0 + 153: ff 4f ff and r15, r15, r15 diff --git a/gas/testsuite/gas/rx/and.sm b/gas/testsuite/gas/rx/and.sm new file mode 100644 index 0000000..7c4cff2 --- /dev/null +++ b/gas/testsuite/gas/rx/and.sm @@ -0,0 +1,7 @@ + and #{uimm4},{reg} + and #{imm},{reg} + + and {reg},{reg} + and {memx},{reg} + + and {reg},{reg},{reg} diff --git a/gas/testsuite/gas/rx/bclr.d b/gas/testsuite/gas/rx/bclr.d new file mode 100644 index 0000000..a5ad631 --- /dev/null +++ b/gas/testsuite/gas/rx/bclr.d @@ -0,0 +1,40 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: f0 08 bclr #0, \[r0\]\.b + 2: f0 f8 bclr #0, \[r15\]\.b + 4: f1 08 fc bclr #0, 252\[r0\]\.b + 7: f1 f8 fc bclr #0, 252\[r15\]\.b + a: f2 08 fc ff bclr #0, 65532\[r0\]\.b + e: f2 f8 fc ff bclr #0, 65532\[r15\]\.b + 12: f0 0f bclr #7, \[r0\]\.b + 14: f0 ff bclr #7, \[r15\]\.b + 16: f1 0f fc bclr #7, 252\[r0\]\.b + 19: f1 ff fc bclr #7, 252\[r15\]\.b + 1c: f2 0f fc ff bclr #7, 65532\[r0\]\.b + 20: f2 ff fc ff bclr #7, 65532\[r15\]\.b + 24: fc 64 00 bclr r0, \[r0\]\.b + 27: fc 64 f0 bclr r0, \[r15\]\.b + 2a: fc 65 00 fc bclr r0, 252\[r0\]\.b + 2e: fc 65 f0 fc bclr r0, 252\[r15\]\.b + 32: fc 66 00 fc ff bclr r0, 65532\[r0\]\.b + 37: fc 66 f0 fc ff bclr r0, 65532\[r15\]\.b + 3c: fc 64 0f bclr r15, \[r0\]\.b + 3f: fc 64 ff bclr r15, \[r15\]\.b + 42: fc 65 0f fc bclr r15, 252\[r0\]\.b + 46: fc 65 ff fc bclr r15, 252\[r15\]\.b + 4a: fc 66 0f fc ff bclr r15, 65532\[r0\]\.b + 4f: fc 66 ff fc ff bclr r15, 65532\[r15\]\.b + 54: 7a 00 bclr #0, r0 + 56: 7a 0f bclr #0, r15 + 58: 7b f0 bclr #31, r0 + 5a: 7b ff bclr #31, r15 + 5c: fc 67 00 bclr r0, r0 + 5f: fc 67 f0 bclr r0, r15 + 62: fc 67 0f bclr r15, r0 + 65: fc 67 ff bclr r15, r15 diff --git a/gas/testsuite/gas/rx/bclr.sm b/gas/testsuite/gas/rx/bclr.sm new file mode 100644 index 0000000..a46a780 --- /dev/null +++ b/gas/testsuite/gas/rx/bclr.sm @@ -0,0 +1,5 @@ + bclr #{uimm3}, {dsp}[{reg}].B + bclr {reg}, {dsp}[{reg}].B + + bclr #{uimm5}, {reg} + bclr {reg}, {reg} diff --git a/gas/testsuite/gas/rx/bcnd.d b/gas/testsuite/gas/rx/bcnd.d new file mode 100644 index 0000000..77d1f77 --- /dev/null +++ b/gas/testsuite/gas/rx/bcnd.d @@ -0,0 +1,104 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 13 beq\.s 0x3 + 1: 12 beq\.s 0xb + 2: 10 beq\.s 0xa + 2: R_RX_DIR3U_PCREL foo + 3: 1b bne\.s 0x6 + 4: 1a bne\.s 0xe + 5: 18 bne\.s 0xd + 5: R_RX_DIR3U_PCREL foo + 6: 22 80 bc\.b 0xffffff86 + 8: 22 7f bc\.b 0x87 + a: 22 00 bc\.b 0xa + b: R_RX_DIR8S_PCREL foo + c: 22 80 bc\.b 0xffffff8c + e: 22 7f bc\.b 0x8d + 10: 22 00 bc\.b 0x10 + 11: R_RX_DIR8S_PCREL foo + 12: 20 80 beq\.b 0xffffff92 + 14: 20 7f beq\.b 0x93 + 16: 20 00 beq\.b 0x16 + 17: R_RX_DIR8S_PCREL foo + 18: 20 80 beq\.b 0xffffff98 + 1a: 20 7f beq\.b 0x99 + 1c: 20 00 beq\.b 0x1c + 1d: R_RX_DIR8S_PCREL foo + 1e: 24 80 bgtu\.b 0xffffff9e + 20: 24 7f bgtu\.b 0x9f + 22: 24 00 bgtu\.b 0x22 + 23: R_RX_DIR8S_PCREL foo + 24: 26 80 bpz\.b 0xffffffa4 + 26: 26 7f bpz\.b 0xa5 + 28: 26 00 bpz\.b 0x28 + 29: R_RX_DIR8S_PCREL foo + 2a: 28 80 bge\.b 0xffffffaa + 2c: 28 7f bge\.b 0xab + 2e: 28 00 bge\.b 0x2e + 2f: R_RX_DIR8S_PCREL foo + 30: 2a 80 bgt\.b 0xffffffb0 + 32: 2a 7f bgt\.b 0xb1 + 34: 2a 00 bgt\.b 0x34 + 35: R_RX_DIR8S_PCREL foo + 36: 2c 80 bo\.b 0xffffffb6 + 38: 2c 7f bo\.b 0xb7 + 3a: 2c 00 bo\.b 0x3a + 3b: R_RX_DIR8S_PCREL foo + 3c: 23 80 bnc\.b 0xffffffbc + 3e: 23 7f bnc\.b 0xbd + 40: 23 00 bnc\.b 0x40 + 41: R_RX_DIR8S_PCREL foo + 42: 23 80 bnc\.b 0xffffffc2 + 44: 23 7f bnc\.b 0xc3 + 46: 23 00 bnc\.b 0x46 + 47: R_RX_DIR8S_PCREL foo + 48: 21 80 bne\.b 0xffffffc8 + 4a: 21 7f bne\.b 0xc9 + 4c: 21 00 bne\.b 0x4c + 4d: R_RX_DIR8S_PCREL foo + 4e: 21 80 bne\.b 0xffffffce + 50: 21 7f bne\.b 0xcf + 52: 21 00 bne\.b 0x52 + 53: R_RX_DIR8S_PCREL foo + 54: 25 80 bleu\.b 0xffffffd4 + 56: 25 7f bleu\.b 0xd5 + 58: 25 00 bleu\.b 0x58 + 59: R_RX_DIR8S_PCREL foo + 5a: 27 80 bn\.b 0xffffffda + 5c: 27 7f bn\.b 0xdb + 5e: 27 00 bn\.b 0x5e + 5f: R_RX_DIR8S_PCREL foo + 60: 29 80 blt\.b 0xffffffe0 + 62: 29 7f blt\.b 0xe1 + 64: 29 00 blt\.b 0x64 + 65: R_RX_DIR8S_PCREL foo + 66: 2b 80 ble\.b 0xffffffe6 + 68: 2b 7f ble\.b 0xe7 + 6a: 2b 00 ble\.b 0x6a + 6b: R_RX_DIR8S_PCREL foo + 6c: 2d 80 bno\.b 0xffffffec + 6e: 2d 7f bno\.b 0xed + 70: 2d 00 bno\.b 0x70 + 71: R_RX_DIR8S_PCREL foo + 72: 3a 00 80 beq\.w 0xffff8072 + 75: 3a ff 7f beq\.w 0x8074 + 78: 3a 00 00 beq\.w 0x78 + 79: R_RX_DIR16S_PCREL foo + 7b: 3b 00 80 bne\.w 0xffff807b + 7e: 3b ff 7f bne\.w 0x807d + 81: 3b 00 00 bne\.w 0x81 + 82: R_RX_DIR16S_PCREL foo + 84: 3a 00 80 beq\.w 0xffff8084 + 87: 3a ff 7f beq\.w 0x8086 + 8a: 3a fc 7f beq\.w 0x8086 + 8b: R_RX_DIR16S_PCREL foo + 8d: 3b 00 80 bne\.w 0xffff808d + 90: 3b ff 7f bne\.w 0x808f + 93: 3b fc 7f bne\.w 0x808f + 94: R_RX_DIR16S_PCREL foo diff --git a/gas/testsuite/gas/rx/bcnd.sm b/gas/testsuite/gas/rx/bcnd.sm new file mode 100644 index 0000000..05e806f --- /dev/null +++ b/gas/testsuite/gas/rx/bcnd.sm @@ -0,0 +1,5 @@ + b{eq;ne}.s {lab_s} + b{cnd}.b {lab_b} + b{eq;ne}.w {lab_w} + b{eq;ne} {lab_w} + diff --git a/gas/testsuite/gas/rx/bmcnd.d b/gas/testsuite/gas/rx/bmcnd.d new file mode 100644 index 0000000..e0d765f --- /dev/null +++ b/gas/testsuite/gas/rx/bmcnd.d @@ -0,0 +1,296 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fc e0 02 bmc #0, \[r0\]\.b + 3: fc e0 f2 bmc #0, \[r15\]\.b + 6: fc e1 02 fc bmc #0, 252\[r0\]\.b + a: fc e1 f2 fc bmc #0, 252\[r15\]\.b + e: fc e2 02 fc ff bmc #0, 65532\[r0\]\.b + 13: fc e2 f2 fc ff bmc #0, 65532\[r15\]\.b + 18: fc fc 02 bmc #7, \[r0\]\.b + 1b: fc fc f2 bmc #7, \[r15\]\.b + 1e: fc fd 02 fc bmc #7, 252\[r0\]\.b + 22: fc fd f2 fc bmc #7, 252\[r15\]\.b + 26: fc fe 02 fc ff bmc #7, 65532\[r0\]\.b + 2b: fc fe f2 fc ff bmc #7, 65532\[r15\]\.b + 30: fc e0 02 bmc #0, \[r0\]\.b + 33: fc e0 f2 bmc #0, \[r15\]\.b + 36: fc e1 02 fc bmc #0, 252\[r0\]\.b + 3a: fc e1 f2 fc bmc #0, 252\[r15\]\.b + 3e: fc e2 02 fc ff bmc #0, 65532\[r0\]\.b + 43: fc e2 f2 fc ff bmc #0, 65532\[r15\]\.b + 48: fc fc 02 bmc #7, \[r0\]\.b + 4b: fc fc f2 bmc #7, \[r15\]\.b + 4e: fc fd 02 fc bmc #7, 252\[r0\]\.b + 52: fc fd f2 fc bmc #7, 252\[r15\]\.b + 56: fc fe 02 fc ff bmc #7, 65532\[r0\]\.b + 5b: fc fe f2 fc ff bmc #7, 65532\[r15\]\.b + 60: fc e0 00 bmeq #0, \[r0\]\.b + 63: fc e0 f0 bmeq #0, \[r15\]\.b + 66: fc e1 00 fc bmeq #0, 252\[r0\]\.b + 6a: fc e1 f0 fc bmeq #0, 252\[r15\]\.b + 6e: fc e2 00 fc ff bmeq #0, 65532\[r0\]\.b + 73: fc e2 f0 fc ff bmeq #0, 65532\[r15\]\.b + 78: fc fc 00 bmeq #7, \[r0\]\.b + 7b: fc fc f0 bmeq #7, \[r15\]\.b + 7e: fc fd 00 fc bmeq #7, 252\[r0\]\.b + 82: fc fd f0 fc bmeq #7, 252\[r15\]\.b + 86: fc fe 00 fc ff bmeq #7, 65532\[r0\]\.b + 8b: fc fe f0 fc ff bmeq #7, 65532\[r15\]\.b + 90: fc e0 00 bmeq #0, \[r0\]\.b + 93: fc e0 f0 bmeq #0, \[r15\]\.b + 96: fc e1 00 fc bmeq #0, 252\[r0\]\.b + 9a: fc e1 f0 fc bmeq #0, 252\[r15\]\.b + 9e: fc e2 00 fc ff bmeq #0, 65532\[r0\]\.b + a3: fc e2 f0 fc ff bmeq #0, 65532\[r15\]\.b + a8: fc fc 00 bmeq #7, \[r0\]\.b + ab: fc fc f0 bmeq #7, \[r15\]\.b + ae: fc fd 00 fc bmeq #7, 252\[r0\]\.b + b2: fc fd f0 fc bmeq #7, 252\[r15\]\.b + b6: fc fe 00 fc ff bmeq #7, 65532\[r0\]\.b + bb: fc fe f0 fc ff bmeq #7, 65532\[r15\]\.b + c0: fc e0 04 bmgtu #0, \[r0\]\.b + c3: fc e0 f4 bmgtu #0, \[r15\]\.b + c6: fc e1 04 fc bmgtu #0, 252\[r0\]\.b + ca: fc e1 f4 fc bmgtu #0, 252\[r15\]\.b + ce: fc e2 04 fc ff bmgtu #0, 65532\[r0\]\.b + d3: fc e2 f4 fc ff bmgtu #0, 65532\[r15\]\.b + d8: fc fc 04 bmgtu #7, \[r0\]\.b + db: fc fc f4 bmgtu #7, \[r15\]\.b + de: fc fd 04 fc bmgtu #7, 252\[r0\]\.b + e2: fc fd f4 fc bmgtu #7, 252\[r15\]\.b + e6: fc fe 04 fc ff bmgtu #7, 65532\[r0\]\.b + eb: fc fe f4 fc ff bmgtu #7, 65532\[r15\]\.b + f0: fc e0 06 bmpz #0, \[r0\]\.b + f3: fc e0 f6 bmpz #0, \[r15\]\.b + f6: fc e1 06 fc bmpz #0, 252\[r0\]\.b + fa: fc e1 f6 fc bmpz #0, 252\[r15\]\.b + fe: fc e2 06 fc ff bmpz #0, 65532\[r0\]\.b + 103: fc e2 f6 fc ff bmpz #0, 65532\[r15\]\.b + 108: fc fc 06 bmpz #7, \[r0\]\.b + 10b: fc fc f6 bmpz #7, \[r15\]\.b + 10e: fc fd 06 fc bmpz #7, 252\[r0\]\.b + 112: fc fd f6 fc bmpz #7, 252\[r15\]\.b + 116: fc fe 06 fc ff bmpz #7, 65532\[r0\]\.b + 11b: fc fe f6 fc ff bmpz #7, 65532\[r15\]\.b + 120: fc e0 08 bmge #0, \[r0\]\.b + 123: fc e0 f8 bmge #0, \[r15\]\.b + 126: fc e1 08 fc bmge #0, 252\[r0\]\.b + 12a: fc e1 f8 fc bmge #0, 252\[r15\]\.b + 12e: fc e2 08 fc ff bmge #0, 65532\[r0\]\.b + 133: fc e2 f8 fc ff bmge #0, 65532\[r15\]\.b + 138: fc fc 08 bmge #7, \[r0\]\.b + 13b: fc fc f8 bmge #7, \[r15\]\.b + 13e: fc fd 08 fc bmge #7, 252\[r0\]\.b + 142: fc fd f8 fc bmge #7, 252\[r15\]\.b + 146: fc fe 08 fc ff bmge #7, 65532\[r0\]\.b + 14b: fc fe f8 fc ff bmge #7, 65532\[r15\]\.b + 150: fc e0 0a bmgt #0, \[r0\]\.b + 153: fc e0 fa bmgt #0, \[r15\]\.b + 156: fc e1 0a fc bmgt #0, 252\[r0\]\.b + 15a: fc e1 fa fc bmgt #0, 252\[r15\]\.b + 15e: fc e2 0a fc ff bmgt #0, 65532\[r0\]\.b + 163: fc e2 fa fc ff bmgt #0, 65532\[r15\]\.b + 168: fc fc 0a bmgt #7, \[r0\]\.b + 16b: fc fc fa bmgt #7, \[r15\]\.b + 16e: fc fd 0a fc bmgt #7, 252\[r0\]\.b + 172: fc fd fa fc bmgt #7, 252\[r15\]\.b + 176: fc fe 0a fc ff bmgt #7, 65532\[r0\]\.b + 17b: fc fe fa fc ff bmgt #7, 65532\[r15\]\.b + 180: fc e0 0c bmo #0, \[r0\]\.b + 183: fc e0 fc bmo #0, \[r15\]\.b + 186: fc e1 0c fc bmo #0, 252\[r0\]\.b + 18a: fc e1 fc fc bmo #0, 252\[r15\]\.b + 18e: fc e2 0c fc ff bmo #0, 65532\[r0\]\.b + 193: fc e2 fc fc ff bmo #0, 65532\[r15\]\.b + 198: fc fc 0c bmo #7, \[r0\]\.b + 19b: fc fc fc bmo #7, \[r15\]\.b + 19e: fc fd 0c fc bmo #7, 252\[r0\]\.b + 1a2: fc fd fc fc bmo #7, 252\[r15\]\.b + 1a6: fc fe 0c fc ff bmo #7, 65532\[r0\]\.b + 1ab: fc fe fc fc ff bmo #7, 65532\[r15\]\.b + 1b0: fc e0 03 bmnc #0, \[r0\]\.b + 1b3: fc e0 f3 bmnc #0, \[r15\]\.b + 1b6: fc e1 03 fc bmnc #0, 252\[r0\]\.b + 1ba: fc e1 f3 fc bmnc #0, 252\[r15\]\.b + 1be: fc e2 03 fc ff bmnc #0, 65532\[r0\]\.b + 1c3: fc e2 f3 fc ff bmnc #0, 65532\[r15\]\.b + 1c8: fc fc 03 bmnc #7, \[r0\]\.b + 1cb: fc fc f3 bmnc #7, \[r15\]\.b + 1ce: fc fd 03 fc bmnc #7, 252\[r0\]\.b + 1d2: fc fd f3 fc bmnc #7, 252\[r15\]\.b + 1d6: fc fe 03 fc ff bmnc #7, 65532\[r0\]\.b + 1db: fc fe f3 fc ff bmnc #7, 65532\[r15\]\.b + 1e0: fc e0 03 bmnc #0, \[r0\]\.b + 1e3: fc e0 f3 bmnc #0, \[r15\]\.b + 1e6: fc e1 03 fc bmnc #0, 252\[r0\]\.b + 1ea: fc e1 f3 fc bmnc #0, 252\[r15\]\.b + 1ee: fc e2 03 fc ff bmnc #0, 65532\[r0\]\.b + 1f3: fc e2 f3 fc ff bmnc #0, 65532\[r15\]\.b + 1f8: fc fc 03 bmnc #7, \[r0\]\.b + 1fb: fc fc f3 bmnc #7, \[r15\]\.b + 1fe: fc fd 03 fc bmnc #7, 252\[r0\]\.b + 202: fc fd f3 fc bmnc #7, 252\[r15\]\.b + 206: fc fe 03 fc ff bmnc #7, 65532\[r0\]\.b + 20b: fc fe f3 fc ff bmnc #7, 65532\[r15\]\.b + 210: fc e0 01 bmne #0, \[r0\]\.b + 213: fc e0 f1 bmne #0, \[r15\]\.b + 216: fc e1 01 fc bmne #0, 252\[r0\]\.b + 21a: fc e1 f1 fc bmne #0, 252\[r15\]\.b + 21e: fc e2 01 fc ff bmne #0, 65532\[r0\]\.b + 223: fc e2 f1 fc ff bmne #0, 65532\[r15\]\.b + 228: fc fc 01 bmne #7, \[r0\]\.b + 22b: fc fc f1 bmne #7, \[r15\]\.b + 22e: fc fd 01 fc bmne #7, 252\[r0\]\.b + 232: fc fd f1 fc bmne #7, 252\[r15\]\.b + 236: fc fe 01 fc ff bmne #7, 65532\[r0\]\.b + 23b: fc fe f1 fc ff bmne #7, 65532\[r15\]\.b + 240: fc e0 01 bmne #0, \[r0\]\.b + 243: fc e0 f1 bmne #0, \[r15\]\.b + 246: fc e1 01 fc bmne #0, 252\[r0\]\.b + 24a: fc e1 f1 fc bmne #0, 252\[r15\]\.b + 24e: fc e2 01 fc ff bmne #0, 65532\[r0\]\.b + 253: fc e2 f1 fc ff bmne #0, 65532\[r15\]\.b + 258: fc fc 01 bmne #7, \[r0\]\.b + 25b: fc fc f1 bmne #7, \[r15\]\.b + 25e: fc fd 01 fc bmne #7, 252\[r0\]\.b + 262: fc fd f1 fc bmne #7, 252\[r15\]\.b + 266: fc fe 01 fc ff bmne #7, 65532\[r0\]\.b + 26b: fc fe f1 fc ff bmne #7, 65532\[r15\]\.b + 270: fc e0 05 bmleu #0, \[r0\]\.b + 273: fc e0 f5 bmleu #0, \[r15\]\.b + 276: fc e1 05 fc bmleu #0, 252\[r0\]\.b + 27a: fc e1 f5 fc bmleu #0, 252\[r15\]\.b + 27e: fc e2 05 fc ff bmleu #0, 65532\[r0\]\.b + 283: fc e2 f5 fc ff bmleu #0, 65532\[r15\]\.b + 288: fc fc 05 bmleu #7, \[r0\]\.b + 28b: fc fc f5 bmleu #7, \[r15\]\.b + 28e: fc fd 05 fc bmleu #7, 252\[r0\]\.b + 292: fc fd f5 fc bmleu #7, 252\[r15\]\.b + 296: fc fe 05 fc ff bmleu #7, 65532\[r0\]\.b + 29b: fc fe f5 fc ff bmleu #7, 65532\[r15\]\.b + 2a0: fc e0 07 bmn #0, \[r0\]\.b + 2a3: fc e0 f7 bmn #0, \[r15\]\.b + 2a6: fc e1 07 fc bmn #0, 252\[r0\]\.b + 2aa: fc e1 f7 fc bmn #0, 252\[r15\]\.b + 2ae: fc e2 07 fc ff bmn #0, 65532\[r0\]\.b + 2b3: fc e2 f7 fc ff bmn #0, 65532\[r15\]\.b + 2b8: fc fc 07 bmn #7, \[r0\]\.b + 2bb: fc fc f7 bmn #7, \[r15\]\.b + 2be: fc fd 07 fc bmn #7, 252\[r0\]\.b + 2c2: fc fd f7 fc bmn #7, 252\[r15\]\.b + 2c6: fc fe 07 fc ff bmn #7, 65532\[r0\]\.b + 2cb: fc fe f7 fc ff bmn #7, 65532\[r15\]\.b + 2d0: fc e0 09 bmlt #0, \[r0\]\.b + 2d3: fc e0 f9 bmlt #0, \[r15\]\.b + 2d6: fc e1 09 fc bmlt #0, 252\[r0\]\.b + 2da: fc e1 f9 fc bmlt #0, 252\[r15\]\.b + 2de: fc e2 09 fc ff bmlt #0, 65532\[r0\]\.b + 2e3: fc e2 f9 fc ff bmlt #0, 65532\[r15\]\.b + 2e8: fc fc 09 bmlt #7, \[r0\]\.b + 2eb: fc fc f9 bmlt #7, \[r15\]\.b + 2ee: fc fd 09 fc bmlt #7, 252\[r0\]\.b + 2f2: fc fd f9 fc bmlt #7, 252\[r15\]\.b + 2f6: fc fe 09 fc ff bmlt #7, 65532\[r0\]\.b + 2fb: fc fe f9 fc ff bmlt #7, 65532\[r15\]\.b + 300: fc e0 0b bmle #0, \[r0\]\.b + 303: fc e0 fb bmle #0, \[r15\]\.b + 306: fc e1 0b fc bmle #0, 252\[r0\]\.b + 30a: fc e1 fb fc bmle #0, 252\[r15\]\.b + 30e: fc e2 0b fc ff bmle #0, 65532\[r0\]\.b + 313: fc e2 fb fc ff bmle #0, 65532\[r15\]\.b + 318: fc fc 0b bmle #7, \[r0\]\.b + 31b: fc fc fb bmle #7, \[r15\]\.b + 31e: fc fd 0b fc bmle #7, 252\[r0\]\.b + 322: fc fd fb fc bmle #7, 252\[r15\]\.b + 326: fc fe 0b fc ff bmle #7, 65532\[r0\]\.b + 32b: fc fe fb fc ff bmle #7, 65532\[r15\]\.b + 330: fc e0 0d bmno #0, \[r0\]\.b + 333: fc e0 fd bmno #0, \[r15\]\.b + 336: fc e1 0d fc bmno #0, 252\[r0\]\.b + 33a: fc e1 fd fc bmno #0, 252\[r15\]\.b + 33e: fc e2 0d fc ff bmno #0, 65532\[r0\]\.b + 343: fc e2 fd fc ff bmno #0, 65532\[r15\]\.b + 348: fc fc 0d bmno #7, \[r0\]\.b + 34b: fc fc fd bmno #7, \[r15\]\.b + 34e: fc fd 0d fc bmno #7, 252\[r0\]\.b + 352: fc fd fd fc bmno #7, 252\[r15\]\.b + 356: fc fe 0d fc ff bmno #7, 65532\[r0\]\.b + 35b: fc fe fd fc ff bmno #7, 65532\[r15\]\.b + 360: fd e0 20 bmc #0, r0 + 363: fd e0 2f bmc #0, r15 + 366: fd ff 20 bmc #31, r0 + 369: fd ff 2f bmc #31, r15 + 36c: fd e0 20 bmc #0, r0 + 36f: fd e0 2f bmc #0, r15 + 372: fd ff 20 bmc #31, r0 + 375: fd ff 2f bmc #31, r15 + 378: fd e0 00 bmeq #0, r0 + 37b: fd e0 0f bmeq #0, r15 + 37e: fd ff 00 bmeq #31, r0 + 381: fd ff 0f bmeq #31, r15 + 384: fd e0 00 bmeq #0, r0 + 387: fd e0 0f bmeq #0, r15 + 38a: fd ff 00 bmeq #31, r0 + 38d: fd ff 0f bmeq #31, r15 + 390: fd e0 40 bmgtu #0, r0 + 393: fd e0 4f bmgtu #0, r15 + 396: fd ff 40 bmgtu #31, r0 + 399: fd ff 4f bmgtu #31, r15 + 39c: fd e0 60 bmpz #0, r0 + 39f: fd e0 6f bmpz #0, r15 + 3a2: fd ff 60 bmpz #31, r0 + 3a5: fd ff 6f bmpz #31, r15 + 3a8: fd e0 80 bmge #0, r0 + 3ab: fd e0 8f bmge #0, r15 + 3ae: fd ff 80 bmge #31, r0 + 3b1: fd ff 8f bmge #31, r15 + 3b4: fd e0 a0 bmgt #0, r0 + 3b7: fd e0 af bmgt #0, r15 + 3ba: fd ff a0 bmgt #31, r0 + 3bd: fd ff af bmgt #31, r15 + 3c0: fd e0 c0 bmo #0, r0 + 3c3: fd e0 cf bmo #0, r15 + 3c6: fd ff c0 bmo #31, r0 + 3c9: fd ff cf bmo #31, r15 + 3cc: fd e0 30 bmnc #0, r0 + 3cf: fd e0 3f bmnc #0, r15 + 3d2: fd ff 30 bmnc #31, r0 + 3d5: fd ff 3f bmnc #31, r15 + 3d8: fd e0 30 bmnc #0, r0 + 3db: fd e0 3f bmnc #0, r15 + 3de: fd ff 30 bmnc #31, r0 + 3e1: fd ff 3f bmnc #31, r15 + 3e4: fd e0 10 bmne #0, r0 + 3e7: fd e0 1f bmne #0, r15 + 3ea: fd ff 10 bmne #31, r0 + 3ed: fd ff 1f bmne #31, r15 + 3f0: fd e0 10 bmne #0, r0 + 3f3: fd e0 1f bmne #0, r15 + 3f6: fd ff 10 bmne #31, r0 + 3f9: fd ff 1f bmne #31, r15 + 3fc: fd e0 50 bmleu #0, r0 + 3ff: fd e0 5f bmleu #0, r15 + 402: fd ff 50 bmleu #31, r0 + 405: fd ff 5f bmleu #31, r15 + 408: fd e0 70 bmn #0, r0 + 40b: fd e0 7f bmn #0, r15 + 40e: fd ff 70 bmn #31, r0 + 411: fd ff 7f bmn #31, r15 + 414: fd e0 90 bmlt #0, r0 + 417: fd e0 9f bmlt #0, r15 + 41a: fd ff 90 bmlt #31, r0 + 41d: fd ff 9f bmlt #31, r15 + 420: fd e0 b0 bmle #0, r0 + 423: fd e0 bf bmle #0, r15 + 426: fd ff b0 bmle #31, r0 + 429: fd ff bf bmle #31, r15 + 42c: fd e0 d0 bmno #0, r0 + 42f: fd e0 df bmno #0, r15 + 432: fd ff d0 bmno #31, r0 + 435: fd ff df bmno #31, r15 diff --git a/gas/testsuite/gas/rx/bmcnd.sm b/gas/testsuite/gas/rx/bmcnd.sm new file mode 100644 index 0000000..7ec587b --- /dev/null +++ b/gas/testsuite/gas/rx/bmcnd.sm @@ -0,0 +1,2 @@ + bm{cnd} #{uimm3}, {dsp}[{reg}].B + bm{cnd} #{uimm5}, {reg} diff --git a/gas/testsuite/gas/rx/bnot.d b/gas/testsuite/gas/rx/bnot.d new file mode 100644 index 0000000..452c701 --- /dev/null +++ b/gas/testsuite/gas/rx/bnot.d @@ -0,0 +1,40 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fc e0 0f bnot #0, \[r0\]\.b + 3: fc e0 ff bnot #0, \[r15\]\.b + 6: fc e1 0f fc bnot #0, 252\[r0\]\.b + a: fc e1 ff fc bnot #0, 252\[r15\]\.b + e: fc e2 0f fc ff bnot #0, 65532\[r0\]\.b + 13: fc e2 ff fc ff bnot #0, 65532\[r15\]\.b + 18: fc fc 0f bnot #7, \[r0\]\.b + 1b: fc fc ff bnot #7, \[r15\]\.b + 1e: fc fd 0f fc bnot #7, 252\[r0\]\.b + 22: fc fd ff fc bnot #7, 252\[r15\]\.b + 26: fc fe 0f fc ff bnot #7, 65532\[r0\]\.b + 2b: fc fe ff fc ff bnot #7, 65532\[r15\]\.b + 30: fc 6c 00 bnot r0, \[r0\]\.b + 33: fc 6c f0 bnot r0, \[r15\]\.b + 36: fc 6d 00 fc bnot r0, 252\[r0\]\.b + 3a: fc 6d f0 fc bnot r0, 252\[r15\]\.b + 3e: fc 6e 00 fc ff bnot r0, 65532\[r0\]\.b + 43: fc 6e f0 fc ff bnot r0, 65532\[r15\]\.b + 48: fc 6c 0f bnot r15, \[r0\]\.b + 4b: fc 6c ff bnot r15, \[r15\]\.b + 4e: fc 6d 0f fc bnot r15, 252\[r0\]\.b + 52: fc 6d ff fc bnot r15, 252\[r15\]\.b + 56: fc 6e 0f fc ff bnot r15, 65532\[r0\]\.b + 5b: fc 6e ff fc ff bnot r15, 65532\[r15\]\.b + 60: fd e0 f0 bnot #0, r0 + 63: fd e0 ff bnot #0, r15 + 66: fd ff f0 bnot #31, r0 + 69: fd ff ff bnot #31, r15 + 6c: fc 6f 00 bnot r0, r0 + 6f: fc 6f f0 bnot r0, r15 + 72: fc 6f 0f bnot r15, r0 + 75: fc 6f ff bnot r15, r15 diff --git a/gas/testsuite/gas/rx/bnot.sm b/gas/testsuite/gas/rx/bnot.sm new file mode 100644 index 0000000..dd08a7c --- /dev/null +++ b/gas/testsuite/gas/rx/bnot.sm @@ -0,0 +1,5 @@ + bnot #{uimm3}, {dsp}[{reg}].B + bnot {reg}, {dsp}[{reg}].B + + bnot #{uimm5}, {reg} + bnot {reg}, {reg} diff --git a/gas/testsuite/gas/rx/bra.d b/gas/testsuite/gas/rx/bra.d new file mode 100644 index 0000000..be8def4 --- /dev/null +++ b/gas/testsuite/gas/rx/bra.d @@ -0,0 +1,30 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 0b bra\.s 0x3 + 1: 0a bra\.s 0xb + 2: 08 bra\.s 0xa + 2: R_RX_DIR3U_PCREL foo + 3: 2e 80 bra\.b 0xffffff83 + 5: 2e 7f bra\.b 0x84 + 7: 2e 00 bra\.b 0x7 + 8: R_RX_DIR8S_PCREL foo + 9: 38 00 80 bra\.w 0xffff8009 + c: 38 ff 7f bra\.w 0x800b + f: 38 00 00 bra\.w 0xf + 10: R_RX_DIR16S_PCREL foo + 12: 04 00 00 80 bra\.a 0xff800012 + 16: 04 ff ff 7f bra\.a 0x800015 + 1a: 04 00 00 00 bra\.a 0x1a + 1b: R_RX_DIR24S_PCREL foo + 1e: 04 00 00 80 bra\.a 0xff80001e + 22: 04 ff ff 7f bra\.a 0x800021 + 26: 04 fb ff 7f bra\.a 0x800021 + 27: R_RX_DIR24S_PCREL foo + 2a: 7f 40 bra\.l r0 + 2c: 7f 4f bra\.l r15 diff --git a/gas/testsuite/gas/rx/bra.sm b/gas/testsuite/gas/rx/bra.sm new file mode 100644 index 0000000..23b6445 --- /dev/null +++ b/gas/testsuite/gas/rx/bra.sm @@ -0,0 +1,6 @@ + bra.s {lab_s} + bra.b {lab_b} + bra.w {lab_w} + bra.a {lab_a} + bra {lab_a} + bra.l {reg} diff --git a/gas/testsuite/gas/rx/brk.d b/gas/testsuite/gas/rx/brk.d new file mode 100644 index 0000000..fe895f9 --- /dev/null +++ b/gas/testsuite/gas/rx/brk.d @@ -0,0 +1,10 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 00 brk + 1: 03 nop diff --git a/gas/testsuite/gas/rx/brk.sm b/gas/testsuite/gas/rx/brk.sm new file mode 100644 index 0000000..c170111 --- /dev/null +++ b/gas/testsuite/gas/rx/brk.sm @@ -0,0 +1,2 @@ + brk + nop diff --git a/gas/testsuite/gas/rx/bset.d b/gas/testsuite/gas/rx/bset.d new file mode 100644 index 0000000..4f540e7 --- /dev/null +++ b/gas/testsuite/gas/rx/bset.d @@ -0,0 +1,40 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: f0 00 bset #0, \[r0\]\.b + 2: f0 f0 bset #0, \[r15\]\.b + 4: f1 00 fc bset #0, 252\[r0\]\.b + 7: f1 f0 fc bset #0, 252\[r15\]\.b + a: f2 00 fc ff bset #0, 65532\[r0\]\.b + e: f2 f0 fc ff bset #0, 65532\[r15\]\.b + 12: f0 07 bset #7, \[r0\]\.b + 14: f0 f7 bset #7, \[r15\]\.b + 16: f1 07 fc bset #7, 252\[r0\]\.b + 19: f1 f7 fc bset #7, 252\[r15\]\.b + 1c: f2 07 fc ff bset #7, 65532\[r0\]\.b + 20: f2 f7 fc ff bset #7, 65532\[r15\]\.b + 24: fc 60 00 bset r0, \[r0\]\.b + 27: fc 60 f0 bset r0, \[r15\]\.b + 2a: fc 61 00 fc bset r0, 252\[r0\]\.b + 2e: fc 61 f0 fc bset r0, 252\[r15\]\.b + 32: fc 62 00 fc ff bset r0, 65532\[r0\]\.b + 37: fc 62 f0 fc ff bset r0, 65532\[r15\]\.b + 3c: fc 60 0f bset r15, \[r0\]\.b + 3f: fc 60 ff bset r15, \[r15\]\.b + 42: fc 61 0f fc bset r15, 252\[r0\]\.b + 46: fc 61 ff fc bset r15, 252\[r15\]\.b + 4a: fc 62 0f fc ff bset r15, 65532\[r0\]\.b + 4f: fc 62 ff fc ff bset r15, 65532\[r15\]\.b + 54: 78 00 bset #0, r0 + 56: 78 0f bset #0, r15 + 58: 79 f0 bset #31, r0 + 5a: 79 ff bset #31, r15 + 5c: fc 63 00 bset r0, r0 + 5f: fc 63 f0 bset r0, r15 + 62: fc 63 0f bset r15, r0 + 65: fc 63 ff bset r15, r15 diff --git a/gas/testsuite/gas/rx/bset.sm b/gas/testsuite/gas/rx/bset.sm new file mode 100644 index 0000000..a76626e --- /dev/null +++ b/gas/testsuite/gas/rx/bset.sm @@ -0,0 +1,5 @@ + bset #{uimm3}, {dsp}[{reg}].B + bset {reg}, {dsp}[{reg}].B + + bset #{uimm5}, {reg} + bset {reg}, {reg} diff --git a/gas/testsuite/gas/rx/bsr.d b/gas/testsuite/gas/rx/bsr.d new file mode 100644 index 0000000..23a27c7 --- /dev/null +++ b/gas/testsuite/gas/rx/bsr.d @@ -0,0 +1,18 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 39 00 80 bsr\.w 0xffff8000 + 3: 39 ff 7f bsr\.w 0x8002 + 6: 39 00 00 bsr\.w 0x6 + 7: R_RX_DIR16S_PCREL foo + 9: 05 00 00 80 bsr\.a 0xff800009 + d: 05 ff ff 7f bsr\.a 0x80000c + 11: 05 00 00 00 bsr\.a 0x11 + 12: R_RX_DIR24S_PCREL foo + 15: 7f 50 bsr\.l r0 + 17: 7f 5f bsr\.l r15 diff --git a/gas/testsuite/gas/rx/bsr.sm b/gas/testsuite/gas/rx/bsr.sm new file mode 100644 index 0000000..bce74d8 --- /dev/null +++ b/gas/testsuite/gas/rx/bsr.sm @@ -0,0 +1,3 @@ + bsr.w {lab_w} + bsr.a {lab_a} + bsr.l {reg} diff --git a/gas/testsuite/gas/rx/btst.d b/gas/testsuite/gas/rx/btst.d new file mode 100644 index 0000000..8cb45d3 --- /dev/null +++ b/gas/testsuite/gas/rx/btst.d @@ -0,0 +1,40 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: f4 00 btst #0, \[r0\]\.b + 2: f4 f0 btst #0, \[r15\]\.b + 4: f5 00 fc btst #0, 252\[r0\]\.b + 7: f5 f0 fc btst #0, 252\[r15\]\.b + a: f6 00 fc ff btst #0, 65532\[r0\]\.b + e: f6 f0 fc ff btst #0, 65532\[r15\]\.b + 12: f4 07 btst #7, \[r0\]\.b + 14: f4 f7 btst #7, \[r15\]\.b + 16: f5 07 fc btst #7, 252\[r0\]\.b + 19: f5 f7 fc btst #7, 252\[r15\]\.b + 1c: f6 07 fc ff btst #7, 65532\[r0\]\.b + 20: f6 f7 fc ff btst #7, 65532\[r15\]\.b + 24: fc 68 00 btst r0, \[r0\]\.b + 27: fc 68 f0 btst r0, \[r15\]\.b + 2a: fc 69 00 fc btst r0, 252\[r0\]\.b + 2e: fc 69 f0 fc btst r0, 252\[r15\]\.b + 32: fc 6a 00 fc ff btst r0, 65532\[r0\]\.b + 37: fc 6a f0 fc ff btst r0, 65532\[r15\]\.b + 3c: fc 68 0f btst r15, \[r0\]\.b + 3f: fc 68 ff btst r15, \[r15\]\.b + 42: fc 69 0f fc btst r15, 252\[r0\]\.b + 46: fc 69 ff fc btst r15, 252\[r15\]\.b + 4a: fc 6a 0f fc ff btst r15, 65532\[r0\]\.b + 4f: fc 6a ff fc ff btst r15, 65532\[r15\]\.b + 54: 7c 00 btst #0, r0 + 56: 7c 0f btst #0, r15 + 58: 7d f0 btst #31, r0 + 5a: 7d ff btst #31, r15 + 5c: fc 6b 00 btst r0, r0 + 5f: fc 6b f0 btst r0, r15 + 62: fc 6b 0f btst r15, r0 + 65: fc 6b ff btst r15, r15 diff --git a/gas/testsuite/gas/rx/btst.sm b/gas/testsuite/gas/rx/btst.sm new file mode 100644 index 0000000..5166d31 --- /dev/null +++ b/gas/testsuite/gas/rx/btst.sm @@ -0,0 +1,5 @@ + btst #{uimm3}, {dsp}[{reg}].B + btst {reg}, {dsp}[{reg}].B + + btst #{uimm5}, {reg} + btst {reg}, {reg} diff --git a/gas/testsuite/gas/rx/clrpsw.d b/gas/testsuite/gas/rx/clrpsw.d new file mode 100644 index 0000000..c82b440 --- /dev/null +++ b/gas/testsuite/gas/rx/clrpsw.d @@ -0,0 +1,14 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f b9 clrpsw u + 2: 7f b8 clrpsw i + 4: 7f b3 clrpsw o + 6: 7f b2 clrpsw s + 8: 7f b1 clrpsw z + a: 7f b0 clrpsw c diff --git a/gas/testsuite/gas/rx/clrpsw.sm b/gas/testsuite/gas/rx/clrpsw.sm new file mode 100644 index 0000000..69ed4e6f --- /dev/null +++ b/gas/testsuite/gas/rx/clrpsw.sm @@ -0,0 +1 @@ + clrpsw {pswf} diff --git a/gas/testsuite/gas/rx/cmp.d b/gas/testsuite/gas/rx/cmp.d new file mode 100644 index 0000000..2b8ad6d --- /dev/null +++ b/gas/testsuite/gas/rx/cmp.d @@ -0,0 +1,96 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 61 00 cmp #0, r0 + 2: 61 0f cmp #0, r15 + 4: 61 f0 cmp #15, r0 + 6: 61 ff cmp #15, r15 + 8: 61 00 cmp #0, r0 + a: 61 0f cmp #0, r15 + c: 75 50 ff cmp #255, r0 + f: 75 5f ff cmp #255, r15 + 12: 75 00 80 cmp #-128, r0 + 15: 75 0f 80 cmp #-128, r15 + 18: 75 50 7f cmp #127, r0 + 1b: 75 5f 7f cmp #127, r15 + 1e: 76 00 00 80 cmp #0xffff8000, r0 + 22: 76 0f 00 80 cmp #0xffff8000, r15 + 26: 77 00 00 80 00 cmp #0x8000, r0 + 2b: 77 0f 00 80 00 cmp #0x8000, r15 + 30: 77 00 00 00 80 cmp #0xff800000, r0 + 35: 77 0f 00 00 80 cmp #0xff800000, r15 + 3a: 77 00 ff ff 7f cmp #0x7fffff, r0 + 3f: 77 0f ff ff 7f cmp #0x7fffff, r15 + 44: 74 00 00 00 00 80 cmp #0x80000000, r0 + 4a: 74 0f 00 00 00 80 cmp #0x80000000, r15 + 50: 74 00 ff ff ff 7f cmp #0x7fffffff, r0 + 56: 74 0f ff ff ff 7f cmp #0x7fffffff, r15 + 5c: 47 00 cmp r0, r0 + 5e: 47 0f cmp r0, r15 + 60: 47 f0 cmp r15, r0 + 62: 47 ff cmp r15, r15 + 64: 44 00 cmp \[r0\]\.ub, r0 + 66: 44 0f cmp \[r0\]\.ub, r15 + 68: 06 04 00 cmp \[r0\]\.b, r0 + 6b: 06 04 0f cmp \[r0\]\.b, r15 + 6e: 06 c4 00 cmp \[r0\]\.uw, r0 + 71: 06 c4 0f cmp \[r0\]\.uw, r15 + 74: 06 44 00 cmp \[r0\]\.w, r0 + 77: 06 44 0f cmp \[r0\]\.w, r15 + 7a: 06 84 00 cmp \[r0\]\.l, r0 + 7d: 06 84 0f cmp \[r0\]\.l, r15 + 80: 44 f0 cmp \[r15\]\.ub, r0 + 82: 44 ff cmp \[r15\]\.ub, r15 + 84: 06 04 f0 cmp \[r15\]\.b, r0 + 87: 06 04 ff cmp \[r15\]\.b, r15 + 8a: 06 c4 f0 cmp \[r15\]\.uw, r0 + 8d: 06 c4 ff cmp \[r15\]\.uw, r15 + 90: 06 44 f0 cmp \[r15\]\.w, r0 + 93: 06 44 ff cmp \[r15\]\.w, r15 + 96: 06 84 f0 cmp \[r15\]\.l, r0 + 99: 06 84 ff cmp \[r15\]\.l, r15 + 9c: 45 00 fc cmp 252\[r0\]\.ub, r0 + 9f: 45 0f fc cmp 252\[r0\]\.ub, r15 + a2: 06 05 00 fc cmp 252\[r0\]\.b, r0 + a6: 06 05 0f fc cmp 252\[r0\]\.b, r15 + aa: 06 c5 00 7e cmp 252\[r0\]\.uw, r0 + ae: 06 c5 0f 7e cmp 252\[r0\]\.uw, r15 + b2: 06 45 00 7e cmp 252\[r0\]\.w, r0 + b6: 06 45 0f 7e cmp 252\[r0\]\.w, r15 + ba: 06 85 00 3f cmp 252\[r0\]\.l, r0 + be: 06 85 0f 3f cmp 252\[r0\]\.l, r15 + c2: 45 f0 fc cmp 252\[r15\]\.ub, r0 + c5: 45 ff fc cmp 252\[r15\]\.ub, r15 + c8: 06 05 f0 fc cmp 252\[r15\]\.b, r0 + cc: 06 05 ff fc cmp 252\[r15\]\.b, r15 + d0: 06 c5 f0 7e cmp 252\[r15\]\.uw, r0 + d4: 06 c5 ff 7e cmp 252\[r15\]\.uw, r15 + d8: 06 45 f0 7e cmp 252\[r15\]\.w, r0 + dc: 06 45 ff 7e cmp 252\[r15\]\.w, r15 + e0: 06 85 f0 3f cmp 252\[r15\]\.l, r0 + e4: 06 85 ff 3f cmp 252\[r15\]\.l, r15 + e8: 46 00 fc ff cmp 65532\[r0\]\.ub, r0 + ec: 46 0f fc ff cmp 65532\[r0\]\.ub, r15 + f0: 06 06 00 fc ff cmp 65532\[r0\]\.b, r0 + f5: 06 06 0f fc ff cmp 65532\[r0\]\.b, r15 + fa: 06 c6 00 fe 7f cmp 65532\[r0\]\.uw, r0 + ff: 06 c6 0f fe 7f cmp 65532\[r0\]\.uw, r15 + 104: 06 46 00 fe 7f cmp 65532\[r0\]\.w, r0 + 109: 06 46 0f fe 7f cmp 65532\[r0\]\.w, r15 + 10e: 06 86 00 ff 3f cmp 65532\[r0\]\.l, r0 + 113: 06 86 0f ff 3f cmp 65532\[r0\]\.l, r15 + 118: 46 f0 fc ff cmp 65532\[r15\]\.ub, r0 + 11c: 46 ff fc ff cmp 65532\[r15\]\.ub, r15 + 120: 06 06 f0 fc ff cmp 65532\[r15\]\.b, r0 + 125: 06 06 ff fc ff cmp 65532\[r15\]\.b, r15 + 12a: 06 c6 f0 fe 7f cmp 65532\[r15\]\.uw, r0 + 12f: 06 c6 ff fe 7f cmp 65532\[r15\]\.uw, r15 + 134: 06 46 f0 fe 7f cmp 65532\[r15\]\.w, r0 + 139: 06 46 ff fe 7f cmp 65532\[r15\]\.w, r15 + 13e: 06 86 f0 ff 3f cmp 65532\[r15\]\.l, r0 + 143: 06 86 ff ff 3f cmp 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/cmp.sm b/gas/testsuite/gas/rx/cmp.sm new file mode 100644 index 0000000..be2a790 --- /dev/null +++ b/gas/testsuite/gas/rx/cmp.sm @@ -0,0 +1,6 @@ + cmp #{uimm4},{reg} + cmp #{uimm8},{reg} + cmp #{imm},{reg} + cmp {reg},{reg} + cmp {memx},{reg} + diff --git a/gas/testsuite/gas/rx/dbt.d b/gas/testsuite/gas/rx/dbt.d new file mode 100644 index 0000000..30aefd8 --- /dev/null +++ b/gas/testsuite/gas/rx/dbt.d @@ -0,0 +1,9 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 01 dbt diff --git a/gas/testsuite/gas/rx/dbt.sm b/gas/testsuite/gas/rx/dbt.sm new file mode 100644 index 0000000..e72f3aa --- /dev/null +++ b/gas/testsuite/gas/rx/dbt.sm @@ -0,0 +1 @@ + dbt diff --git a/gas/testsuite/gas/rx/div.d b/gas/testsuite/gas/rx/div.d new file mode 100644 index 0000000..b0aa5ee --- /dev/null +++ b/gas/testsuite/gas/rx/div.d @@ -0,0 +1,88 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 74 80 80 div #-128, r0 + 4: fd 74 8f 80 div #-128, r15 + 8: fd 74 80 7f div #127, r0 + c: fd 74 8f 7f div #127, r15 + 10: fd 78 80 00 80 div #0xffff8000, r0 + 15: fd 78 8f 00 80 div #0xffff8000, r15 + 1a: fd 7c 80 00 80 00 div #0x8000, r0 + 20: fd 7c 8f 00 80 00 div #0x8000, r15 + 26: fd 7c 80 00 00 80 div #0xff800000, r0 + 2c: fd 7c 8f 00 00 80 div #0xff800000, r15 + 32: fd 7c 80 ff ff 7f div #0x7fffff, r0 + 38: fd 7c 8f ff ff 7f div #0x7fffff, r15 + 3e: fd 70 80 00 00 00 80 div #0x80000000, r0 + 45: fd 70 8f 00 00 00 80 div #0x80000000, r15 + 4c: fd 70 80 ff ff ff 7f div #0x7fffffff, r0 + 53: fd 70 8f ff ff ff 7f div #0x7fffffff, r15 + 5a: fc 23 00 div r0, r0 + 5d: fc 23 0f div r0, r15 + 60: fc 23 f0 div r15, r0 + 63: fc 23 ff div r15, r15 + 66: fc 20 00 div \[r0\]\.ub, r0 + 69: fc 20 0f div \[r0\]\.ub, r15 + 6c: 06 20 08 00 div \[r0\]\.b, r0 + 70: 06 20 08 0f div \[r0\]\.b, r15 + 74: 06 e0 08 00 div \[r0\]\.uw, r0 + 78: 06 e0 08 0f div \[r0\]\.uw, r15 + 7c: 06 60 08 00 div \[r0\]\.w, r0 + 80: 06 60 08 0f div \[r0\]\.w, r15 + 84: 06 a0 08 00 div \[r0\]\.l, r0 + 88: 06 a0 08 0f div \[r0\]\.l, r15 + 8c: fc 20 f0 div \[r15\]\.ub, r0 + 8f: fc 20 ff div \[r15\]\.ub, r15 + 92: 06 20 08 f0 div \[r15\]\.b, r0 + 96: 06 20 08 ff div \[r15\]\.b, r15 + 9a: 06 e0 08 f0 div \[r15\]\.uw, r0 + 9e: 06 e0 08 ff div \[r15\]\.uw, r15 + a2: 06 60 08 f0 div \[r15\]\.w, r0 + a6: 06 60 08 ff div \[r15\]\.w, r15 + aa: 06 a0 08 f0 div \[r15\]\.l, r0 + ae: 06 a0 08 ff div \[r15\]\.l, r15 + b2: fc 21 00 fc div 252\[r0\]\.ub, r0 + b6: fc 21 0f fc div 252\[r0\]\.ub, r15 + ba: 06 21 08 00 fc div 252\[r0\]\.b, r0 + bf: 06 21 08 0f fc div 252\[r0\]\.b, r15 + c4: 06 e1 08 00 7e div 252\[r0\]\.uw, r0 + c9: 06 e1 08 0f 7e div 252\[r0\]\.uw, r15 + ce: 06 61 08 00 7e div 252\[r0\]\.w, r0 + d3: 06 61 08 0f 7e div 252\[r0\]\.w, r15 + d8: 06 a1 08 00 3f div 252\[r0\]\.l, r0 + dd: 06 a1 08 0f 3f div 252\[r0\]\.l, r15 + e2: fc 21 f0 fc div 252\[r15\]\.ub, r0 + e6: fc 21 ff fc div 252\[r15\]\.ub, r15 + ea: 06 21 08 f0 fc div 252\[r15\]\.b, r0 + ef: 06 21 08 ff fc div 252\[r15\]\.b, r15 + f4: 06 e1 08 f0 7e div 252\[r15\]\.uw, r0 + f9: 06 e1 08 ff 7e div 252\[r15\]\.uw, r15 + fe: 06 61 08 f0 7e div 252\[r15\]\.w, r0 + 103: 06 61 08 ff 7e div 252\[r15\]\.w, r15 + 108: 06 a1 08 f0 3f div 252\[r15\]\.l, r0 + 10d: 06 a1 08 ff 3f div 252\[r15\]\.l, r15 + 112: fc 22 00 fc ff div 65532\[r0\]\.ub, r0 + 117: fc 22 0f fc ff div 65532\[r0\]\.ub, r15 + 11c: 06 22 08 00 fc ff div 65532\[r0\]\.b, r0 + 122: 06 22 08 0f fc ff div 65532\[r0\]\.b, r15 + 128: 06 e2 08 00 fe 7f div 65532\[r0\]\.uw, r0 + 12e: 06 e2 08 0f fe 7f div 65532\[r0\]\.uw, r15 + 134: 06 62 08 00 fe 7f div 65532\[r0\]\.w, r0 + 13a: 06 62 08 0f fe 7f div 65532\[r0\]\.w, r15 + 140: 06 a2 08 00 ff 3f div 65532\[r0\]\.l, r0 + 146: 06 a2 08 0f ff 3f div 65532\[r0\]\.l, r15 + 14c: fc 22 f0 fc ff div 65532\[r15\]\.ub, r0 + 151: fc 22 ff fc ff div 65532\[r15\]\.ub, r15 + 156: 06 22 08 f0 fc ff div 65532\[r15\]\.b, r0 + 15c: 06 22 08 ff fc ff div 65532\[r15\]\.b, r15 + 162: 06 e2 08 f0 fe 7f div 65532\[r15\]\.uw, r0 + 168: 06 e2 08 ff fe 7f div 65532\[r15\]\.uw, r15 + 16e: 06 62 08 f0 fe 7f div 65532\[r15\]\.w, r0 + 174: 06 62 08 ff fe 7f div 65532\[r15\]\.w, r15 + 17a: 06 a2 08 f0 ff 3f div 65532\[r15\]\.l, r0 + 180: 06 a2 08 ff ff 3f div 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/div.sm b/gas/testsuite/gas/rx/div.sm new file mode 100644 index 0000000..1a5587a --- /dev/null +++ b/gas/testsuite/gas/rx/div.sm @@ -0,0 +1,4 @@ + div #{imm},{reg} + div {reg},{reg} + div {memx},{reg} + diff --git a/gas/testsuite/gas/rx/divu.d b/gas/testsuite/gas/rx/divu.d new file mode 100644 index 0000000..f380294 --- /dev/null +++ b/gas/testsuite/gas/rx/divu.d @@ -0,0 +1,88 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 74 90 80 divu #-128, r0 + 4: fd 74 9f 80 divu #-128, r15 + 8: fd 74 90 7f divu #127, r0 + c: fd 74 9f 7f divu #127, r15 + 10: fd 78 90 00 80 divu #0xffff8000, r0 + 15: fd 78 9f 00 80 divu #0xffff8000, r15 + 1a: fd 7c 90 00 80 00 divu #0x8000, r0 + 20: fd 7c 9f 00 80 00 divu #0x8000, r15 + 26: fd 7c 90 00 00 80 divu #0xff800000, r0 + 2c: fd 7c 9f 00 00 80 divu #0xff800000, r15 + 32: fd 7c 90 ff ff 7f divu #0x7fffff, r0 + 38: fd 7c 9f ff ff 7f divu #0x7fffff, r15 + 3e: fd 70 90 00 00 00 80 divu #0x80000000, r0 + 45: fd 70 9f 00 00 00 80 divu #0x80000000, r15 + 4c: fd 70 90 ff ff ff 7f divu #0x7fffffff, r0 + 53: fd 70 9f ff ff ff 7f divu #0x7fffffff, r15 + 5a: fc 27 00 divu r0, r0 + 5d: fc 27 0f divu r0, r15 + 60: fc 27 f0 divu r15, r0 + 63: fc 27 ff divu r15, r15 + 66: fc 24 00 divu \[r0\]\.ub, r0 + 69: fc 24 0f divu \[r0\]\.ub, r15 + 6c: 06 20 09 00 divu \[r0\]\.b, r0 + 70: 06 20 09 0f divu \[r0\]\.b, r15 + 74: 06 e0 09 00 divu \[r0\]\.uw, r0 + 78: 06 e0 09 0f divu \[r0\]\.uw, r15 + 7c: 06 60 09 00 divu \[r0\]\.w, r0 + 80: 06 60 09 0f divu \[r0\]\.w, r15 + 84: 06 a0 09 00 divu \[r0\]\.l, r0 + 88: 06 a0 09 0f divu \[r0\]\.l, r15 + 8c: fc 24 f0 divu \[r15\]\.ub, r0 + 8f: fc 24 ff divu \[r15\]\.ub, r15 + 92: 06 20 09 f0 divu \[r15\]\.b, r0 + 96: 06 20 09 ff divu \[r15\]\.b, r15 + 9a: 06 e0 09 f0 divu \[r15\]\.uw, r0 + 9e: 06 e0 09 ff divu \[r15\]\.uw, r15 + a2: 06 60 09 f0 divu \[r15\]\.w, r0 + a6: 06 60 09 ff divu \[r15\]\.w, r15 + aa: 06 a0 09 f0 divu \[r15\]\.l, r0 + ae: 06 a0 09 ff divu \[r15\]\.l, r15 + b2: fc 25 00 fc divu 252\[r0\]\.ub, r0 + b6: fc 25 0f fc divu 252\[r0\]\.ub, r15 + ba: 06 21 09 00 fc divu 252\[r0\]\.b, r0 + bf: 06 21 09 0f fc divu 252\[r0\]\.b, r15 + c4: 06 e1 09 00 7e divu 252\[r0\]\.uw, r0 + c9: 06 e1 09 0f 7e divu 252\[r0\]\.uw, r15 + ce: 06 61 09 00 7e divu 252\[r0\]\.w, r0 + d3: 06 61 09 0f 7e divu 252\[r0\]\.w, r15 + d8: 06 a1 09 00 3f divu 252\[r0\]\.l, r0 + dd: 06 a1 09 0f 3f divu 252\[r0\]\.l, r15 + e2: fc 25 f0 fc divu 252\[r15\]\.ub, r0 + e6: fc 25 ff fc divu 252\[r15\]\.ub, r15 + ea: 06 21 09 f0 fc divu 252\[r15\]\.b, r0 + ef: 06 21 09 ff fc divu 252\[r15\]\.b, r15 + f4: 06 e1 09 f0 7e divu 252\[r15\]\.uw, r0 + f9: 06 e1 09 ff 7e divu 252\[r15\]\.uw, r15 + fe: 06 61 09 f0 7e divu 252\[r15\]\.w, r0 + 103: 06 61 09 ff 7e divu 252\[r15\]\.w, r15 + 108: 06 a1 09 f0 3f divu 252\[r15\]\.l, r0 + 10d: 06 a1 09 ff 3f divu 252\[r15\]\.l, r15 + 112: fc 26 00 fc ff divu 65532\[r0\]\.ub, r0 + 117: fc 26 0f fc ff divu 65532\[r0\]\.ub, r15 + 11c: 06 22 09 00 fc ff divu 65532\[r0\]\.b, r0 + 122: 06 22 09 0f fc ff divu 65532\[r0\]\.b, r15 + 128: 06 e2 09 00 fe 7f divu 65532\[r0\]\.uw, r0 + 12e: 06 e2 09 0f fe 7f divu 65532\[r0\]\.uw, r15 + 134: 06 62 09 00 fe 7f divu 65532\[r0\]\.w, r0 + 13a: 06 62 09 0f fe 7f divu 65532\[r0\]\.w, r15 + 140: 06 a2 09 00 ff 3f divu 65532\[r0\]\.l, r0 + 146: 06 a2 09 0f ff 3f divu 65532\[r0\]\.l, r15 + 14c: fc 26 f0 fc ff divu 65532\[r15\]\.ub, r0 + 151: fc 26 ff fc ff divu 65532\[r15\]\.ub, r15 + 156: 06 22 09 f0 fc ff divu 65532\[r15\]\.b, r0 + 15c: 06 22 09 ff fc ff divu 65532\[r15\]\.b, r15 + 162: 06 e2 09 f0 fe 7f divu 65532\[r15\]\.uw, r0 + 168: 06 e2 09 ff fe 7f divu 65532\[r15\]\.uw, r15 + 16e: 06 62 09 f0 fe 7f divu 65532\[r15\]\.w, r0 + 174: 06 62 09 ff fe 7f divu 65532\[r15\]\.w, r15 + 17a: 06 a2 09 f0 ff 3f divu 65532\[r15\]\.l, r0 + 180: 06 a2 09 ff ff 3f divu 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/divu.sm b/gas/testsuite/gas/rx/divu.sm new file mode 100644 index 0000000..95b5f1f --- /dev/null +++ b/gas/testsuite/gas/rx/divu.sm @@ -0,0 +1,4 @@ + divu #{imm},{reg} + divu {reg},{reg} + divu {memx},{reg} + diff --git a/gas/testsuite/gas/rx/emul.d b/gas/testsuite/gas/rx/emul.d new file mode 100644 index 0000000..49ecdcd --- /dev/null +++ b/gas/testsuite/gas/rx/emul.d @@ -0,0 +1,88 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 74 60 80 emul #-128, r0 + 4: fd 74 6e 80 emul #-128, r14 + 8: fd 74 60 7f emul #127, r0 + c: fd 74 6e 7f emul #127, r14 + 10: fd 78 60 00 80 emul #0xffff8000, r0 + 15: fd 78 6e 00 80 emul #0xffff8000, r14 + 1a: fd 7c 60 00 80 00 emul #0x8000, r0 + 20: fd 7c 6e 00 80 00 emul #0x8000, r14 + 26: fd 7c 60 00 00 80 emul #0xff800000, r0 + 2c: fd 7c 6e 00 00 80 emul #0xff800000, r14 + 32: fd 7c 60 ff ff 7f emul #0x7fffff, r0 + 38: fd 7c 6e ff ff 7f emul #0x7fffff, r14 + 3e: fd 70 60 00 00 00 80 emul #0x80000000, r0 + 45: fd 70 6e 00 00 00 80 emul #0x80000000, r14 + 4c: fd 70 60 ff ff ff 7f emul #0x7fffffff, r0 + 53: fd 70 6e ff ff ff 7f emul #0x7fffffff, r14 + 5a: fc 1b 00 emul r0, r0 + 5d: fc 1b 0e emul r0, r14 + 60: fc 1b f0 emul r15, r0 + 63: fc 1b fe emul r15, r14 + 66: fc 18 00 emul \[r0\]\.ub, r0 + 69: fc 18 0e emul \[r0\]\.ub, r14 + 6c: 06 20 06 00 emul \[r0\]\.b, r0 + 70: 06 20 06 0e emul \[r0\]\.b, r14 + 74: 06 e0 06 00 emul \[r0\]\.uw, r0 + 78: 06 e0 06 0e emul \[r0\]\.uw, r14 + 7c: 06 60 06 00 emul \[r0\]\.w, r0 + 80: 06 60 06 0e emul \[r0\]\.w, r14 + 84: 06 a0 06 00 emul \[r0\]\.l, r0 + 88: 06 a0 06 0e emul \[r0\]\.l, r14 + 8c: fc 18 f0 emul \[r15\]\.ub, r0 + 8f: fc 18 fe emul \[r15\]\.ub, r14 + 92: 06 20 06 f0 emul \[r15\]\.b, r0 + 96: 06 20 06 fe emul \[r15\]\.b, r14 + 9a: 06 e0 06 f0 emul \[r15\]\.uw, r0 + 9e: 06 e0 06 fe emul \[r15\]\.uw, r14 + a2: 06 60 06 f0 emul \[r15\]\.w, r0 + a6: 06 60 06 fe emul \[r15\]\.w, r14 + aa: 06 a0 06 f0 emul \[r15\]\.l, r0 + ae: 06 a0 06 fe emul \[r15\]\.l, r14 + b2: fc 19 00 fc emul 252\[r0\]\.ub, r0 + b6: fc 19 0e fc emul 252\[r0\]\.ub, r14 + ba: 06 21 06 00 fc emul 252\[r0\]\.b, r0 + bf: 06 21 06 0e fc emul 252\[r0\]\.b, r14 + c4: 06 e1 06 00 7e emul 252\[r0\]\.uw, r0 + c9: 06 e1 06 0e 7e emul 252\[r0\]\.uw, r14 + ce: 06 61 06 00 7e emul 252\[r0\]\.w, r0 + d3: 06 61 06 0e 7e emul 252\[r0\]\.w, r14 + d8: 06 a1 06 00 3f emul 252\[r0\]\.l, r0 + dd: 06 a1 06 0e 3f emul 252\[r0\]\.l, r14 + e2: fc 19 f0 fc emul 252\[r15\]\.ub, r0 + e6: fc 19 fe fc emul 252\[r15\]\.ub, r14 + ea: 06 21 06 f0 fc emul 252\[r15\]\.b, r0 + ef: 06 21 06 fe fc emul 252\[r15\]\.b, r14 + f4: 06 e1 06 f0 7e emul 252\[r15\]\.uw, r0 + f9: 06 e1 06 fe 7e emul 252\[r15\]\.uw, r14 + fe: 06 61 06 f0 7e emul 252\[r15\]\.w, r0 + 103: 06 61 06 fe 7e emul 252\[r15\]\.w, r14 + 108: 06 a1 06 f0 3f emul 252\[r15\]\.l, r0 + 10d: 06 a1 06 fe 3f emul 252\[r15\]\.l, r14 + 112: fc 1a 00 fc ff emul 65532\[r0\]\.ub, r0 + 117: fc 1a 0e fc ff emul 65532\[r0\]\.ub, r14 + 11c: 06 22 06 00 fc ff emul 65532\[r0\]\.b, r0 + 122: 06 22 06 0e fc ff emul 65532\[r0\]\.b, r14 + 128: 06 e2 06 00 fe 7f emul 65532\[r0\]\.uw, r0 + 12e: 06 e2 06 0e fe 7f emul 65532\[r0\]\.uw, r14 + 134: 06 62 06 00 fe 7f emul 65532\[r0\]\.w, r0 + 13a: 06 62 06 0e fe 7f emul 65532\[r0\]\.w, r14 + 140: 06 a2 06 00 ff 3f emul 65532\[r0\]\.l, r0 + 146: 06 a2 06 0e ff 3f emul 65532\[r0\]\.l, r14 + 14c: fc 1a f0 fc ff emul 65532\[r15\]\.ub, r0 + 151: fc 1a fe fc ff emul 65532\[r15\]\.ub, r14 + 156: 06 22 06 f0 fc ff emul 65532\[r15\]\.b, r0 + 15c: 06 22 06 fe fc ff emul 65532\[r15\]\.b, r14 + 162: 06 e2 06 f0 fe 7f emul 65532\[r15\]\.uw, r0 + 168: 06 e2 06 fe fe 7f emul 65532\[r15\]\.uw, r14 + 16e: 06 62 06 f0 fe 7f emul 65532\[r15\]\.w, r0 + 174: 06 62 06 fe fe 7f emul 65532\[r15\]\.w, r14 + 17a: 06 a2 06 f0 ff 3f emul 65532\[r15\]\.l, r0 + 180: 06 a2 06 fe ff 3f emul 65532\[r15\]\.l, r14 diff --git a/gas/testsuite/gas/rx/emul.sm b/gas/testsuite/gas/rx/emul.sm new file mode 100644 index 0000000..10a357d --- /dev/null +++ b/gas/testsuite/gas/rx/emul.sm @@ -0,0 +1,4 @@ + emul #{imm},{reg2} + emul {reg},{reg2} + emul {memx},{reg2} + diff --git a/gas/testsuite/gas/rx/emulu.d b/gas/testsuite/gas/rx/emulu.d new file mode 100644 index 0000000..6cafe88 --- /dev/null +++ b/gas/testsuite/gas/rx/emulu.d @@ -0,0 +1,88 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 74 70 80 emulu #-128, r0 + 4: fd 74 7e 80 emulu #-128, r14 + 8: fd 74 70 7f emulu #127, r0 + c: fd 74 7e 7f emulu #127, r14 + 10: fd 78 70 00 80 emulu #0xffff8000, r0 + 15: fd 78 7e 00 80 emulu #0xffff8000, r14 + 1a: fd 7c 70 00 80 00 emulu #0x8000, r0 + 20: fd 7c 7e 00 80 00 emulu #0x8000, r14 + 26: fd 7c 70 00 00 80 emulu #0xff800000, r0 + 2c: fd 7c 7e 00 00 80 emulu #0xff800000, r14 + 32: fd 7c 70 ff ff 7f emulu #0x7fffff, r0 + 38: fd 7c 7e ff ff 7f emulu #0x7fffff, r14 + 3e: fd 70 70 00 00 00 80 emulu #0x80000000, r0 + 45: fd 70 7e 00 00 00 80 emulu #0x80000000, r14 + 4c: fd 70 70 ff ff ff 7f emulu #0x7fffffff, r0 + 53: fd 70 7e ff ff ff 7f emulu #0x7fffffff, r14 + 5a: fc 1f 00 emulu r0, r0 + 5d: fc 1f 0e emulu r0, r14 + 60: fc 1f f0 emulu r15, r0 + 63: fc 1f fe emulu r15, r14 + 66: fc 1c 00 emulu \[r0\]\.ub, r0 + 69: fc 1c 0e emulu \[r0\]\.ub, r14 + 6c: 06 20 07 00 emulu \[r0\]\.b, r0 + 70: 06 20 07 0e emulu \[r0\]\.b, r14 + 74: 06 e0 07 00 emulu \[r0\]\.uw, r0 + 78: 06 e0 07 0e emulu \[r0\]\.uw, r14 + 7c: 06 60 07 00 emulu \[r0\]\.w, r0 + 80: 06 60 07 0e emulu \[r0\]\.w, r14 + 84: 06 a0 07 00 emulu \[r0\]\.l, r0 + 88: 06 a0 07 0e emulu \[r0\]\.l, r14 + 8c: fc 1c f0 emulu \[r15\]\.ub, r0 + 8f: fc 1c fe emulu \[r15\]\.ub, r14 + 92: 06 20 07 f0 emulu \[r15\]\.b, r0 + 96: 06 20 07 fe emulu \[r15\]\.b, r14 + 9a: 06 e0 07 f0 emulu \[r15\]\.uw, r0 + 9e: 06 e0 07 fe emulu \[r15\]\.uw, r14 + a2: 06 60 07 f0 emulu \[r15\]\.w, r0 + a6: 06 60 07 fe emulu \[r15\]\.w, r14 + aa: 06 a0 07 f0 emulu \[r15\]\.l, r0 + ae: 06 a0 07 fe emulu \[r15\]\.l, r14 + b2: fc 1d 00 fc emulu 252\[r0\]\.ub, r0 + b6: fc 1d 0e fc emulu 252\[r0\]\.ub, r14 + ba: 06 21 07 00 fc emulu 252\[r0\]\.b, r0 + bf: 06 21 07 0e fc emulu 252\[r0\]\.b, r14 + c4: 06 e1 07 00 7e emulu 252\[r0\]\.uw, r0 + c9: 06 e1 07 0e 7e emulu 252\[r0\]\.uw, r14 + ce: 06 61 07 00 7e emulu 252\[r0\]\.w, r0 + d3: 06 61 07 0e 7e emulu 252\[r0\]\.w, r14 + d8: 06 a1 07 00 3f emulu 252\[r0\]\.l, r0 + dd: 06 a1 07 0e 3f emulu 252\[r0\]\.l, r14 + e2: fc 1d f0 fc emulu 252\[r15\]\.ub, r0 + e6: fc 1d fe fc emulu 252\[r15\]\.ub, r14 + ea: 06 21 07 f0 fc emulu 252\[r15\]\.b, r0 + ef: 06 21 07 fe fc emulu 252\[r15\]\.b, r14 + f4: 06 e1 07 f0 7e emulu 252\[r15\]\.uw, r0 + f9: 06 e1 07 fe 7e emulu 252\[r15\]\.uw, r14 + fe: 06 61 07 f0 7e emulu 252\[r15\]\.w, r0 + 103: 06 61 07 fe 7e emulu 252\[r15\]\.w, r14 + 108: 06 a1 07 f0 3f emulu 252\[r15\]\.l, r0 + 10d: 06 a1 07 fe 3f emulu 252\[r15\]\.l, r14 + 112: fc 1e 00 fc ff emulu 65532\[r0\]\.ub, r0 + 117: fc 1e 0e fc ff emulu 65532\[r0\]\.ub, r14 + 11c: 06 22 07 00 fc ff emulu 65532\[r0\]\.b, r0 + 122: 06 22 07 0e fc ff emulu 65532\[r0\]\.b, r14 + 128: 06 e2 07 00 fe 7f emulu 65532\[r0\]\.uw, r0 + 12e: 06 e2 07 0e fe 7f emulu 65532\[r0\]\.uw, r14 + 134: 06 62 07 00 fe 7f emulu 65532\[r0\]\.w, r0 + 13a: 06 62 07 0e fe 7f emulu 65532\[r0\]\.w, r14 + 140: 06 a2 07 00 ff 3f emulu 65532\[r0\]\.l, r0 + 146: 06 a2 07 0e ff 3f emulu 65532\[r0\]\.l, r14 + 14c: fc 1e f0 fc ff emulu 65532\[r15\]\.ub, r0 + 151: fc 1e fe fc ff emulu 65532\[r15\]\.ub, r14 + 156: 06 22 07 f0 fc ff emulu 65532\[r15\]\.b, r0 + 15c: 06 22 07 fe fc ff emulu 65532\[r15\]\.b, r14 + 162: 06 e2 07 f0 fe 7f emulu 65532\[r15\]\.uw, r0 + 168: 06 e2 07 fe fe 7f emulu 65532\[r15\]\.uw, r14 + 16e: 06 62 07 f0 fe 7f emulu 65532\[r15\]\.w, r0 + 174: 06 62 07 fe fe 7f emulu 65532\[r15\]\.w, r14 + 17a: 06 a2 07 f0 ff 3f emulu 65532\[r15\]\.l, r0 + 180: 06 a2 07 fe ff 3f emulu 65532\[r15\]\.l, r14 diff --git a/gas/testsuite/gas/rx/emulu.sm b/gas/testsuite/gas/rx/emulu.sm new file mode 100644 index 0000000..c8b13ef --- /dev/null +++ b/gas/testsuite/gas/rx/emulu.sm @@ -0,0 +1,4 @@ + emulu #{imm},{reg2} + emulu {reg},{reg2} + emulu {memx},{reg2} + diff --git a/gas/testsuite/gas/rx/explode b/gas/testsuite/gas/rx/explode new file mode 100755 index 0000000..f4d26fe --- /dev/null +++ b/gas/testsuite/gas/rx/explode @@ -0,0 +1,199 @@ +#!/usr/bin/perl +# -*- perl -*- + +# Copyright (C) 2006 Red Hat Inc. +# +# This file is part of GAS, the GNU Assembler. +# +# GAS is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# GAS is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GAS; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. */ + +%myfiles = (); + +$incdir = "."; + +while ($ARGV[0] =~ /^-/) { + $opt = shift; + if ($opt eq "-I") { + $incdir = shift; + } +} + +$infile = shift; +$outfile = shift; + +$inbase = $infile; +$inbase =~ s@.*/@@; +$inbase =~ s@[^a-zA-Z0-9].*@@; + +$t = 0; +$errors = 0; + +if ($outfile) { + open(OUT, ">$outfile"); +} else { + open(OUT, ">&STDOUT"); +} + +open(I, "$incdir/macros.inc") || die("$incdir/macros.inc: $!"); +&read_file(); +close I; +open(I, $infile) || die("$infile: $!"); +&read_file(); +close I; + +sub read_file { + while () { + $line ++; + next if /^;/; + s/[\r\n]+$//; + if (/^macro\s+(\S+)\s+(.*)/) { + ($name, $val) = ($1,$2); + print "set macro \"$name\" to \"$val\"\n" if $t; + $macro{$name} = $val; + } elsif (/\S/) { + &explode($_); + } + } +} + +exit ($errors); + +# There's no way to quote braces so you can output them :-P + +sub explode { + my ($s) = @_; + my ($a, $b, $p, $e, @params); + + print "explode($s)\n" if $t; + + ($b, $a, @params) = &split_braces($s); + @params = explode_params (@params); + if (! $a && ! @params) { + if ($t) { + print "\033[33m$s\033[0m\n"; + } else { + print OUT "$s\n"; + } + return; + } + if (@params == 1 && defined $macro{$params[0]}) { + $p = $macro{$params[0]}; + &explode ("$b$p$a"); + } else { + for $p (@params) { + &explode ("$b$p$a"); + } + } +} + +sub explode_params { + my (@p) = @_; + my ($p,@r); + + @r = (); + while (@p) { + $p = shift @p; + ($b,$a,@e) = split_braces ($p); + if (defined $a) { + for $e (reverse @e) { + unshift (@p, "$b$e$a"); + } + } else { + push (@r, $p); + } + } + return @r; +} + +sub getmacro { + my ($v) = $macro{$_[0]}; + if (! defined $v) { + print STDERR "$line: Error: macro $_[0] not defined\n"; + $errors ++; + } + return $v; +} + +sub expand_macros { + my ($l) = @_; + 0 while $l =~ s/{([^{};]+)}/&getmacro($1)/ge; + return $l; +} + +# returns (before, after, list of variances) +sub split_braces { + my ($l) = @_; + my (@l, $i, $a, @parms, $b, $n,$p); + + print "split_braces($l) = (" if $t; + + $l = &expand_macros ($l); + + if ($l !~ /\{.*\}/) { + print "nothing)\n" if $t; + return ($l); + } + if ($l =~ /^{([^{};]+)}/) { + print "macro:", $macro{$1}, ")\n" if $t; + return (&getmacro($1), ""); + } + + $n = 0; + @parms = (''); + $p = 0; + + ($a, $l) = $l =~ m@^([^\{]*)\{(.*)@; + @l = split(//, $l); + + while (defined ($i = shift @l)) { + if ($n == 0) { + print "\033[32m$i" if $t; + if ($i eq '}') { + print "\033[0m$a, ", join('', @l), ", (", join("\033[31m;\033[0m", @parms), ")\n" if $t; + return ($a, join('',@l), @parms); + } elsif ($i eq ';') { + $p ++; + $parms[$p] = ''; + } else { + $parms[$p] .= $i; + $n ++ if $i eq '{'; + } + } else { + print "\033[34m$i" if $t; + $n ++ if $i eq '{'; + $n -- if $i eq '}'; + $parms[$p] .= $i; + } + } + print "$a, , (", join(';', @parms), ")\n" if $t; + return ($a, "", @parms); +} + +__END__; + +macro rest c,d + foo {a;b},{{rest};e;} + +expands to: + + foo a,c + foo a,d + foo a,e + foo a, + foo b,c + foo b,d + foo b,e + foo b, diff --git a/gas/testsuite/gas/rx/fadd.d b/gas/testsuite/gas/rx/fadd.d new file mode 100644 index 0000000..406052b --- /dev/null +++ b/gas/testsuite/gas/rx/fadd.d @@ -0,0 +1,28 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 72 20 00 00 00 80 fadd #0x80000000, r0 + 7: fd 72 2f 00 00 00 80 fadd #0x80000000, r15 + e: fd 72 20 ff ff ff ff fadd #-1, r0 + 15: fd 72 2f ff ff ff ff fadd #-1, r15 + 1c: fc 8b 00 fadd r0, r0 + 1f: fc 8b 0f fadd r0, r15 + 22: fc 8b f0 fadd r15, r0 + 25: fc 8b ff fadd r15, r15 + 28: fc 88 00 fadd \[r0\]\.l, r0 + 2b: fc 88 0f fadd \[r0\]\.l, r15 + 2e: fc 88 f0 fadd \[r15\]\.l, r0 + 31: fc 88 ff fadd \[r15\]\.l, r15 + 34: fc 89 00 3f fadd 252\[r0\]\.l, r0 + 38: fc 89 0f 3f fadd 252\[r0\]\.l, r15 + 3c: fc 89 f0 3f fadd 252\[r15\]\.l, r0 + 40: fc 89 ff 3f fadd 252\[r15\]\.l, r15 + 44: fc 8a 00 ff 3f fadd 65532\[r0\]\.l, r0 + 49: fc 8a 0f ff 3f fadd 65532\[r0\]\.l, r15 + 4e: fc 8a f0 ff 3f fadd 65532\[r15\]\.l, r0 + 53: fc 8a ff ff 3f fadd 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/fadd.sm b/gas/testsuite/gas/rx/fadd.sm new file mode 100644 index 0000000..94021af --- /dev/null +++ b/gas/testsuite/gas/rx/fadd.sm @@ -0,0 +1,3 @@ + fadd #{imm32},{reg} + fadd {reg},{reg} + fadd {mem}.L,{reg} diff --git a/gas/testsuite/gas/rx/fcmp.d b/gas/testsuite/gas/rx/fcmp.d new file mode 100644 index 0000000..3a32ead --- /dev/null +++ b/gas/testsuite/gas/rx/fcmp.d @@ -0,0 +1,28 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 72 10 00 00 00 80 fcmp #0x80000000, r0 + 7: fd 72 1f 00 00 00 80 fcmp #0x80000000, r15 + e: fd 72 10 ff ff ff ff fcmp #-1, r0 + 15: fd 72 1f ff ff ff ff fcmp #-1, r15 + 1c: fc 87 00 fcmp r0, r0 + 1f: fc 87 0f fcmp r0, r15 + 22: fc 87 f0 fcmp r15, r0 + 25: fc 87 ff fcmp r15, r15 + 28: fc 84 00 fcmp \[r0\]\.l, r0 + 2b: fc 84 0f fcmp \[r0\]\.l, r15 + 2e: fc 84 f0 fcmp \[r15\]\.l, r0 + 31: fc 84 ff fcmp \[r15\]\.l, r15 + 34: fc 85 00 3f fcmp 252\[r0\]\.l, r0 + 38: fc 85 0f 3f fcmp 252\[r0\]\.l, r15 + 3c: fc 85 f0 3f fcmp 252\[r15\]\.l, r0 + 40: fc 85 ff 3f fcmp 252\[r15\]\.l, r15 + 44: fc 86 00 ff 3f fcmp 65532\[r0\]\.l, r0 + 49: fc 86 0f ff 3f fcmp 65532\[r0\]\.l, r15 + 4e: fc 86 f0 ff 3f fcmp 65532\[r15\]\.l, r0 + 53: fc 86 ff ff 3f fcmp 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/fcmp.sm b/gas/testsuite/gas/rx/fcmp.sm new file mode 100644 index 0000000..7e43cbc --- /dev/null +++ b/gas/testsuite/gas/rx/fcmp.sm @@ -0,0 +1,3 @@ + fcmp #{imm32},{reg} + fcmp {reg},{reg} + fcmp {mem}.L,{reg} diff --git a/gas/testsuite/gas/rx/fdiv.d b/gas/testsuite/gas/rx/fdiv.d new file mode 100644 index 0000000..0e78882 --- /dev/null +++ b/gas/testsuite/gas/rx/fdiv.d @@ -0,0 +1,28 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 72 40 00 00 00 80 fdiv #0x80000000, r0 + 7: fd 72 4f 00 00 00 80 fdiv #0x80000000, r15 + e: fd 72 40 ff ff ff ff fdiv #-1, r0 + 15: fd 72 4f ff ff ff ff fdiv #-1, r15 + 1c: fc 93 00 fdiv r0, r0 + 1f: fc 93 0f fdiv r0, r15 + 22: fc 93 f0 fdiv r15, r0 + 25: fc 93 ff fdiv r15, r15 + 28: fc 90 00 fdiv \[r0\]\.l, r0 + 2b: fc 90 0f fdiv \[r0\]\.l, r15 + 2e: fc 90 f0 fdiv \[r15\]\.l, r0 + 31: fc 90 ff fdiv \[r15\]\.l, r15 + 34: fc 91 00 3f fdiv 252\[r0\]\.l, r0 + 38: fc 91 0f 3f fdiv 252\[r0\]\.l, r15 + 3c: fc 91 f0 3f fdiv 252\[r15\]\.l, r0 + 40: fc 91 ff 3f fdiv 252\[r15\]\.l, r15 + 44: fc 92 00 ff 3f fdiv 65532\[r0\]\.l, r0 + 49: fc 92 0f ff 3f fdiv 65532\[r0\]\.l, r15 + 4e: fc 92 f0 ff 3f fdiv 65532\[r15\]\.l, r0 + 53: fc 92 ff ff 3f fdiv 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/fdiv.sm b/gas/testsuite/gas/rx/fdiv.sm new file mode 100644 index 0000000..3710849 --- /dev/null +++ b/gas/testsuite/gas/rx/fdiv.sm @@ -0,0 +1,3 @@ + fdiv #{imm32},{reg} + fdiv {reg},{reg} + fdiv {mem}.L,{reg} diff --git a/gas/testsuite/gas/rx/fmul.d b/gas/testsuite/gas/rx/fmul.d new file mode 100644 index 0000000..7fec0af --- /dev/null +++ b/gas/testsuite/gas/rx/fmul.d @@ -0,0 +1,28 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 72 30 00 00 00 80 fmul #0x80000000, r0 + 7: fd 72 3f 00 00 00 80 fmul #0x80000000, r15 + e: fd 72 30 ff ff ff ff fmul #-1, r0 + 15: fd 72 3f ff ff ff ff fmul #-1, r15 + 1c: fc 8f 00 fmul r0, r0 + 1f: fc 8f 0f fmul r0, r15 + 22: fc 8f f0 fmul r15, r0 + 25: fc 8f ff fmul r15, r15 + 28: fc 8c 00 fmul \[r0\]\.l, r0 + 2b: fc 8c 0f fmul \[r0\]\.l, r15 + 2e: fc 8c f0 fmul \[r15\]\.l, r0 + 31: fc 8c ff fmul \[r15\]\.l, r15 + 34: fc 8d 00 3f fmul 252\[r0\]\.l, r0 + 38: fc 8d 0f 3f fmul 252\[r0\]\.l, r15 + 3c: fc 8d f0 3f fmul 252\[r15\]\.l, r0 + 40: fc 8d ff 3f fmul 252\[r15\]\.l, r15 + 44: fc 8e 00 ff 3f fmul 65532\[r0\]\.l, r0 + 49: fc 8e 0f ff 3f fmul 65532\[r0\]\.l, r15 + 4e: fc 8e f0 ff 3f fmul 65532\[r15\]\.l, r0 + 53: fc 8e ff ff 3f fmul 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/fmul.sm b/gas/testsuite/gas/rx/fmul.sm new file mode 100644 index 0000000..e68f24f --- /dev/null +++ b/gas/testsuite/gas/rx/fmul.sm @@ -0,0 +1,3 @@ + fmul #{imm32},{reg} + fmul {reg},{reg} + fmul {mem}.L,{reg} diff --git a/gas/testsuite/gas/rx/fsub.d b/gas/testsuite/gas/rx/fsub.d new file mode 100644 index 0000000..5d26e5a --- /dev/null +++ b/gas/testsuite/gas/rx/fsub.d @@ -0,0 +1,28 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 72 00 00 00 00 80 fsub #0x80000000, r0 + 7: fd 72 0f 00 00 00 80 fsub #0x80000000, r15 + e: fd 72 00 ff ff ff ff fsub #-1, r0 + 15: fd 72 0f ff ff ff ff fsub #-1, r15 + 1c: fc 83 00 fsub r0, r0 + 1f: fc 83 0f fsub r0, r15 + 22: fc 83 f0 fsub r15, r0 + 25: fc 83 ff fsub r15, r15 + 28: fc 80 00 fsub \[r0\]\.l, r0 + 2b: fc 80 0f fsub \[r0\]\.l, r15 + 2e: fc 80 f0 fsub \[r15\]\.l, r0 + 31: fc 80 ff fsub \[r15\]\.l, r15 + 34: fc 81 00 3f fsub 252\[r0\]\.l, r0 + 38: fc 81 0f 3f fsub 252\[r0\]\.l, r15 + 3c: fc 81 f0 3f fsub 252\[r15\]\.l, r0 + 40: fc 81 ff 3f fsub 252\[r15\]\.l, r15 + 44: fc 82 00 ff 3f fsub 65532\[r0\]\.l, r0 + 49: fc 82 0f ff 3f fsub 65532\[r0\]\.l, r15 + 4e: fc 82 f0 ff 3f fsub 65532\[r15\]\.l, r0 + 53: fc 82 ff ff 3f fsub 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/fsub.sm b/gas/testsuite/gas/rx/fsub.sm new file mode 100644 index 0000000..64b93c9 --- /dev/null +++ b/gas/testsuite/gas/rx/fsub.sm @@ -0,0 +1,3 @@ + fsub #{imm32},{reg} + fsub {reg},{reg} + fsub {mem}.L,{reg} diff --git a/gas/testsuite/gas/rx/ftoi.d b/gas/testsuite/gas/rx/ftoi.d new file mode 100644 index 0000000..f5075e7 --- /dev/null +++ b/gas/testsuite/gas/rx/ftoi.d @@ -0,0 +1,24 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fc 97 00 ftoi r0, r0 + 3: fc 97 0f ftoi r0, r15 + 6: fc 97 f0 ftoi r15, r0 + 9: fc 97 ff ftoi r15, r15 + c: fc 94 00 ftoi \[r0\]\.l, r0 + f: fc 94 0f ftoi \[r0\]\.l, r15 + 12: fc 94 f0 ftoi \[r15\]\.l, r0 + 15: fc 94 ff ftoi \[r15\]\.l, r15 + 18: fc 95 00 3f ftoi 252\[r0\]\.l, r0 + 1c: fc 95 0f 3f ftoi 252\[r0\]\.l, r15 + 20: fc 95 f0 3f ftoi 252\[r15\]\.l, r0 + 24: fc 95 ff 3f ftoi 252\[r15\]\.l, r15 + 28: fc 96 00 ff 3f ftoi 65532\[r0\]\.l, r0 + 2d: fc 96 0f ff 3f ftoi 65532\[r0\]\.l, r15 + 32: fc 96 f0 ff 3f ftoi 65532\[r15\]\.l, r0 + 37: fc 96 ff ff 3f ftoi 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/ftoi.sm b/gas/testsuite/gas/rx/ftoi.sm new file mode 100644 index 0000000..a112d1a --- /dev/null +++ b/gas/testsuite/gas/rx/ftoi.sm @@ -0,0 +1,2 @@ + ftoi {reg},{reg} + ftoi {mem}.L,{reg} diff --git a/gas/testsuite/gas/rx/gprel.d b/gas/testsuite/gas/rx/gprel.d new file mode 100644 index 0000000..6e7c887 --- /dev/null +++ b/gas/testsuite/gas/rx/gprel.d @@ -0,0 +1,53 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section .text: + +00000000 <_start>: + 0: ce f1 04 00 mov\.b 4\[r15\], r1 + 2: R_RX_SYM _foo + 2: R_RX_SYM __gp + 2: R_RX_OPsub __gp + 2: R_RX_ABS16U __gp + 4: ce f1 08 00 mov\.b 8\[r15\], r1 + 6: R_RX_SYM _bar + 6: R_RX_SYM __gp + 6: R_RX_OPsub __gp + 6: R_RX_ABS16U __gp + 8: ce f1 00 00 mov\.b \[r15\], r1 + a: R_RX_SYM _grill + a: R_RX_SYM __gp + a: R_RX_OPsub __gp + a: R_RX_ABS16U __gp + c: de f1 02 00 mov\.w 4\[r15\], r1 + e: R_RX_SYM _foo + e: R_RX_SYM __gp + e: R_RX_OPsub __gp + e: R_RX_ABS16UW __gp + 10: de f1 04 00 mov\.w 8\[r15\], r1 + 12: R_RX_SYM _bar + 12: R_RX_SYM __gp + 12: R_RX_OPsub __gp + 12: R_RX_ABS16UW __gp + 14: de f1 00 00 mov\.w \[r15\], r1 + 16: R_RX_SYM _grill + 16: R_RX_SYM __gp + 16: R_RX_OPsub __gp + 16: R_RX_ABS16UW __gp + 18: ee f1 01 00 mov\.l 4\[r15\], r1 + 1a: R_RX_SYM _foo + 1a: R_RX_SYM __gp + 1a: R_RX_OPsub __gp + 1a: R_RX_ABS16UL __gp + 1c: ee f1 02 00 mov\.l 8\[r15\], r1 + 1e: R_RX_SYM _bar + 1e: R_RX_SYM __gp + 1e: R_RX_OPsub __gp + 1e: R_RX_ABS16UL __gp + 20: ee f1 00 00 mov\.l \[r15\], r1 + 22: R_RX_SYM _grill + 22: R_RX_SYM __gp + 22: R_RX_OPsub __gp + 22: R_RX_ABS16UL __gp diff --git a/gas/testsuite/gas/rx/gprel.sm b/gas/testsuite/gas/rx/gprel.sm new file mode 100644 index 0000000..c2f29ba --- /dev/null +++ b/gas/testsuite/gas/rx/gprel.sm @@ -0,0 +1,9 @@ + .text + .global _start +_start: + mov{bwl} %gp({_foo;_bar;_grill})[r15], r1 + + .data +__gp: .long 0 +_foo: .long 5 +_bar: .long 6 diff --git a/gas/testsuite/gas/rx/int.d b/gas/testsuite/gas/rx/int.d new file mode 100644 index 0000000..dc161cf --- /dev/null +++ b/gas/testsuite/gas/rx/int.d @@ -0,0 +1,10 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 75 60 00 int #0 + 3: 75 60 ff int #255 diff --git a/gas/testsuite/gas/rx/int.sm b/gas/testsuite/gas/rx/int.sm new file mode 100644 index 0000000..8d957a8 --- /dev/null +++ b/gas/testsuite/gas/rx/int.sm @@ -0,0 +1 @@ + int #{uimm8} diff --git a/gas/testsuite/gas/rx/itof.d b/gas/testsuite/gas/rx/itof.d new file mode 100644 index 0000000..6102de1 --- /dev/null +++ b/gas/testsuite/gas/rx/itof.d @@ -0,0 +1,72 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fc 47 00 itof r0, r0 + 3: fc 47 0f itof r0, r15 + 6: fc 47 f0 itof r15, r0 + 9: fc 47 ff itof r15, r15 + c: fc 44 00 itof \[r0\]\.ub, r0 + f: fc 44 0f itof \[r0\]\.ub, r15 + 12: 06 20 11 00 itof \[r0\]\.b, r0 + 16: 06 20 11 0f itof \[r0\]\.b, r15 + 1a: 06 e0 11 00 itof \[r0\]\.uw, r0 + 1e: 06 e0 11 0f itof \[r0\]\.uw, r15 + 22: 06 60 11 00 itof \[r0\]\.w, r0 + 26: 06 60 11 0f itof \[r0\]\.w, r15 + 2a: 06 a0 11 00 itof \[r0\]\.l, r0 + 2e: 06 a0 11 0f itof \[r0\]\.l, r15 + 32: fc 44 f0 itof \[r15\]\.ub, r0 + 35: fc 44 ff itof \[r15\]\.ub, r15 + 38: 06 20 11 f0 itof \[r15\]\.b, r0 + 3c: 06 20 11 ff itof \[r15\]\.b, r15 + 40: 06 e0 11 f0 itof \[r15\]\.uw, r0 + 44: 06 e0 11 ff itof \[r15\]\.uw, r15 + 48: 06 60 11 f0 itof \[r15\]\.w, r0 + 4c: 06 60 11 ff itof \[r15\]\.w, r15 + 50: 06 a0 11 f0 itof \[r15\]\.l, r0 + 54: 06 a0 11 ff itof \[r15\]\.l, r15 + 58: fc 45 00 fc itof 252\[r0\]\.ub, r0 + 5c: fc 45 0f fc itof 252\[r0\]\.ub, r15 + 60: 06 21 11 00 fc itof 252\[r0\]\.b, r0 + 65: 06 21 11 0f fc itof 252\[r0\]\.b, r15 + 6a: 06 e1 11 00 7e itof 252\[r0\]\.uw, r0 + 6f: 06 e1 11 0f 7e itof 252\[r0\]\.uw, r15 + 74: 06 61 11 00 7e itof 252\[r0\]\.w, r0 + 79: 06 61 11 0f 7e itof 252\[r0\]\.w, r15 + 7e: 06 a1 11 00 3f itof 252\[r0\]\.l, r0 + 83: 06 a1 11 0f 3f itof 252\[r0\]\.l, r15 + 88: fc 45 f0 fc itof 252\[r15\]\.ub, r0 + 8c: fc 45 ff fc itof 252\[r15\]\.ub, r15 + 90: 06 21 11 f0 fc itof 252\[r15\]\.b, r0 + 95: 06 21 11 ff fc itof 252\[r15\]\.b, r15 + 9a: 06 e1 11 f0 7e itof 252\[r15\]\.uw, r0 + 9f: 06 e1 11 ff 7e itof 252\[r15\]\.uw, r15 + a4: 06 61 11 f0 7e itof 252\[r15\]\.w, r0 + a9: 06 61 11 ff 7e itof 252\[r15\]\.w, r15 + ae: 06 a1 11 f0 3f itof 252\[r15\]\.l, r0 + b3: 06 a1 11 ff 3f itof 252\[r15\]\.l, r15 + b8: fc 46 00 fc ff itof 65532\[r0\]\.ub, r0 + bd: fc 46 0f fc ff itof 65532\[r0\]\.ub, r15 + c2: 06 22 11 00 fc ff itof 65532\[r0\]\.b, r0 + c8: 06 22 11 0f fc ff itof 65532\[r0\]\.b, r15 + ce: 06 e2 11 00 fe 7f itof 65532\[r0\]\.uw, r0 + d4: 06 e2 11 0f fe 7f itof 65532\[r0\]\.uw, r15 + da: 06 62 11 00 fe 7f itof 65532\[r0\]\.w, r0 + e0: 06 62 11 0f fe 7f itof 65532\[r0\]\.w, r15 + e6: 06 a2 11 00 ff 3f itof 65532\[r0\]\.l, r0 + ec: 06 a2 11 0f ff 3f itof 65532\[r0\]\.l, r15 + f2: fc 46 f0 fc ff itof 65532\[r15\]\.ub, r0 + f7: fc 46 ff fc ff itof 65532\[r15\]\.ub, r15 + fc: 06 22 11 f0 fc ff itof 65532\[r15\]\.b, r0 + 102: 06 22 11 ff fc ff itof 65532\[r15\]\.b, r15 + 108: 06 e2 11 f0 fe 7f itof 65532\[r15\]\.uw, r0 + 10e: 06 e2 11 ff fe 7f itof 65532\[r15\]\.uw, r15 + 114: 06 62 11 f0 fe 7f itof 65532\[r15\]\.w, r0 + 11a: 06 62 11 ff fe 7f itof 65532\[r15\]\.w, r15 + 120: 06 a2 11 f0 ff 3f itof 65532\[r15\]\.l, r0 + 126: 06 a2 11 ff ff 3f itof 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/itof.sm b/gas/testsuite/gas/rx/itof.sm new file mode 100644 index 0000000..aa3783c --- /dev/null +++ b/gas/testsuite/gas/rx/itof.sm @@ -0,0 +1,2 @@ + itof {reg},{reg} + itof {memx},{reg} diff --git a/gas/testsuite/gas/rx/jmp.d b/gas/testsuite/gas/rx/jmp.d new file mode 100644 index 0000000..1cbfd5a --- /dev/null +++ b/gas/testsuite/gas/rx/jmp.d @@ -0,0 +1,10 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f 00 jmp r0 + 2: 7f 0f jmp r15 diff --git a/gas/testsuite/gas/rx/jmp.sm b/gas/testsuite/gas/rx/jmp.sm new file mode 100644 index 0000000..e858c64 --- /dev/null +++ b/gas/testsuite/gas/rx/jmp.sm @@ -0,0 +1 @@ + jmp {reg} diff --git a/gas/testsuite/gas/rx/jsr.d b/gas/testsuite/gas/rx/jsr.d new file mode 100644 index 0000000..77d7f37 --- /dev/null +++ b/gas/testsuite/gas/rx/jsr.d @@ -0,0 +1,10 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f 10 jsr r0 + 2: 7f 1f jsr r15 diff --git a/gas/testsuite/gas/rx/jsr.sm b/gas/testsuite/gas/rx/jsr.sm new file mode 100644 index 0000000..7a52c1b --- /dev/null +++ b/gas/testsuite/gas/rx/jsr.sm @@ -0,0 +1 @@ + jsr {reg} diff --git a/gas/testsuite/gas/rx/machi.d b/gas/testsuite/gas/rx/machi.d new file mode 100644 index 0000000..0800696 --- /dev/null +++ b/gas/testsuite/gas/rx/machi.d @@ -0,0 +1,12 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 04 00 machi r0, r0 + 3: fd 04 0f machi r0, r15 + 6: fd 04 f0 machi r15, r0 + 9: fd 04 ff machi r15, r15 diff --git a/gas/testsuite/gas/rx/machi.sm b/gas/testsuite/gas/rx/machi.sm new file mode 100644 index 0000000..f3651d0 --- /dev/null +++ b/gas/testsuite/gas/rx/machi.sm @@ -0,0 +1 @@ + machi {reg},{reg} diff --git a/gas/testsuite/gas/rx/maclo.d b/gas/testsuite/gas/rx/maclo.d new file mode 100644 index 0000000..41ee1f2 --- /dev/null +++ b/gas/testsuite/gas/rx/maclo.d @@ -0,0 +1,12 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 05 00 maclo r0, r0 + 3: fd 05 0f maclo r0, r15 + 6: fd 05 f0 maclo r15, r0 + 9: fd 05 ff maclo r15, r15 diff --git a/gas/testsuite/gas/rx/maclo.sm b/gas/testsuite/gas/rx/maclo.sm new file mode 100644 index 0000000..84a019c --- /dev/null +++ b/gas/testsuite/gas/rx/maclo.sm @@ -0,0 +1 @@ + maclo {reg},{reg} diff --git a/gas/testsuite/gas/rx/macros.inc b/gas/testsuite/gas/rx/macros.inc new file mode 100644 index 0000000..d025ac9 --- /dev/null +++ b/gas/testsuite/gas/rx/macros.inc @@ -0,0 +1,49 @@ +macro reg {r0;r15} +macro reg2 {r0;r14} +macro reg7 {r0;r7} +macro regPlo {r1;r7} +macro regPhi {r8;r14} +macro creg {psw;fpsw;usp;isp;intb;bpsw;bpc;fintv;cpen} +macro pswf {U;I;O;S;Z;C} + +macro simm8 {-128;127} +macro simm16 {-32768;32768} +macro simm24 {-8388608;8388607} +macro simm32 {-2147483648;2147483647} + +macro imm {{simm8};{simm16};{simm24};{simm32}} + +macro uimm2 {0;3} +macro uimm3 {0;7} +macro uimm4 {0;15} +macro uimm5 {0;31} +macro uimm8 {0;255} +macro uimm16 {0;65535} +macro uimm24 {0;16777215} +macro uimm32 {0;4294967295} + +macro imm32 {-2147483648;4294967295} + +macro dsp5 {4;28} +macro dsp8 252 +macro dsp16 65532 +macro dsp8L 1020 +macro dsp16L 262140 + +macro dsp {;{dsp8};{dsp16}} +macro dspL {;{dsp8L};{dsp16L}} + +macro memex {.ub;.b;.uw;.w;.l} +macro memx {dsp}[{reg}]{memex} +macro mem {dsp}[{reg}] +macro bwl {.b;.w;.l} +macro bw {.b;.w} + +macro cnd {geu;c;eq;z;gtu;pz;ge;gt;o;ltu;nc;ne;nz;leu;n;lt;le;no} +macro lab_s {.+3;.+10;foo} +macro lab_b {.-128;.+127;foo} +macro lab_w {.-32768;.+32767;foo} +macro lab_a {.-8388608;.+8388607;foo} +macro lab_l {.-2147483648;.+2147483647;foo} + + .text diff --git a/gas/testsuite/gas/rx/make-d b/gas/testsuite/gas/rx/make-d new file mode 100755 index 0000000..be1958e --- /dev/null +++ b/gas/testsuite/gas/rx/make-d @@ -0,0 +1,31 @@ +#!/usr/bin/perl +# -*- perl -*- + +# Utility to create *.d files from *.lst files. Not normally needed. + +opendir L, "/tmp/lsts"; +for $f (sort readdir L) { + next unless $f =~ /\.lst/; + $f =~ s@\.lst@@; + push (@files, $f); +} +closedir L; + +for $f (@files) { + + open (I, "/tmp/lsts/$f.lst"); + open (O, ">$f.d"); + + print O "#objdump: -dr\n"; + + while () { + s/$f\.o/dump.o/; + s/\\/\\\\/g; + s/([\[\]\.\*\?\+])/\\$1/g; + s/file format .*/file format \.\*/; + print O; + } + + close I; + close O; +} diff --git a/gas/testsuite/gas/rx/max.d b/gas/testsuite/gas/rx/max.d new file mode 100644 index 0000000..1389322 --- /dev/null +++ b/gas/testsuite/gas/rx/max.d @@ -0,0 +1,88 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 74 40 80 max #-128, r0 + 4: fd 74 4f 80 max #-128, r15 + 8: fd 74 40 7f max #127, r0 + c: fd 74 4f 7f max #127, r15 + 10: fd 78 40 00 80 max #0xffff8000, r0 + 15: fd 78 4f 00 80 max #0xffff8000, r15 + 1a: fd 7c 40 00 80 00 max #0x8000, r0 + 20: fd 7c 4f 00 80 00 max #0x8000, r15 + 26: fd 7c 40 00 00 80 max #0xff800000, r0 + 2c: fd 7c 4f 00 00 80 max #0xff800000, r15 + 32: fd 7c 40 ff ff 7f max #0x7fffff, r0 + 38: fd 7c 4f ff ff 7f max #0x7fffff, r15 + 3e: fd 70 40 00 00 00 80 max #0x80000000, r0 + 45: fd 70 4f 00 00 00 80 max #0x80000000, r15 + 4c: fd 70 40 ff ff ff 7f max #0x7fffffff, r0 + 53: fd 70 4f ff ff ff 7f max #0x7fffffff, r15 + 5a: fc 13 00 max r0, r0 + 5d: fc 13 0f max r0, r15 + 60: fc 13 f0 max r15, r0 + 63: fc 13 ff max r15, r15 + 66: fc 10 00 max \[r0\]\.ub, r0 + 69: fc 10 0f max \[r0\]\.ub, r15 + 6c: 06 20 04 00 max \[r0\]\.b, r0 + 70: 06 20 04 0f max \[r0\]\.b, r15 + 74: 06 e0 04 00 max \[r0\]\.uw, r0 + 78: 06 e0 04 0f max \[r0\]\.uw, r15 + 7c: 06 60 04 00 max \[r0\]\.w, r0 + 80: 06 60 04 0f max \[r0\]\.w, r15 + 84: 06 a0 04 00 max \[r0\]\.l, r0 + 88: 06 a0 04 0f max \[r0\]\.l, r15 + 8c: fc 10 f0 max \[r15\]\.ub, r0 + 8f: fc 10 ff max \[r15\]\.ub, r15 + 92: 06 20 04 f0 max \[r15\]\.b, r0 + 96: 06 20 04 ff max \[r15\]\.b, r15 + 9a: 06 e0 04 f0 max \[r15\]\.uw, r0 + 9e: 06 e0 04 ff max \[r15\]\.uw, r15 + a2: 06 60 04 f0 max \[r15\]\.w, r0 + a6: 06 60 04 ff max \[r15\]\.w, r15 + aa: 06 a0 04 f0 max \[r15\]\.l, r0 + ae: 06 a0 04 ff max \[r15\]\.l, r15 + b2: fc 11 00 fc max 252\[r0\]\.ub, r0 + b6: fc 11 0f fc max 252\[r0\]\.ub, r15 + ba: 06 21 04 00 fc max 252\[r0\]\.b, r0 + bf: 06 21 04 0f fc max 252\[r0\]\.b, r15 + c4: 06 e1 04 00 7e max 252\[r0\]\.uw, r0 + c9: 06 e1 04 0f 7e max 252\[r0\]\.uw, r15 + ce: 06 61 04 00 7e max 252\[r0\]\.w, r0 + d3: 06 61 04 0f 7e max 252\[r0\]\.w, r15 + d8: 06 a1 04 00 3f max 252\[r0\]\.l, r0 + dd: 06 a1 04 0f 3f max 252\[r0\]\.l, r15 + e2: fc 11 f0 fc max 252\[r15\]\.ub, r0 + e6: fc 11 ff fc max 252\[r15\]\.ub, r15 + ea: 06 21 04 f0 fc max 252\[r15\]\.b, r0 + ef: 06 21 04 ff fc max 252\[r15\]\.b, r15 + f4: 06 e1 04 f0 7e max 252\[r15\]\.uw, r0 + f9: 06 e1 04 ff 7e max 252\[r15\]\.uw, r15 + fe: 06 61 04 f0 7e max 252\[r15\]\.w, r0 + 103: 06 61 04 ff 7e max 252\[r15\]\.w, r15 + 108: 06 a1 04 f0 3f max 252\[r15\]\.l, r0 + 10d: 06 a1 04 ff 3f max 252\[r15\]\.l, r15 + 112: fc 12 00 fc ff max 65532\[r0\]\.ub, r0 + 117: fc 12 0f fc ff max 65532\[r0\]\.ub, r15 + 11c: 06 22 04 00 fc ff max 65532\[r0\]\.b, r0 + 122: 06 22 04 0f fc ff max 65532\[r0\]\.b, r15 + 128: 06 e2 04 00 fe 7f max 65532\[r0\]\.uw, r0 + 12e: 06 e2 04 0f fe 7f max 65532\[r0\]\.uw, r15 + 134: 06 62 04 00 fe 7f max 65532\[r0\]\.w, r0 + 13a: 06 62 04 0f fe 7f max 65532\[r0\]\.w, r15 + 140: 06 a2 04 00 ff 3f max 65532\[r0\]\.l, r0 + 146: 06 a2 04 0f ff 3f max 65532\[r0\]\.l, r15 + 14c: fc 12 f0 fc ff max 65532\[r15\]\.ub, r0 + 151: fc 12 ff fc ff max 65532\[r15\]\.ub, r15 + 156: 06 22 04 f0 fc ff max 65532\[r15\]\.b, r0 + 15c: 06 22 04 ff fc ff max 65532\[r15\]\.b, r15 + 162: 06 e2 04 f0 fe 7f max 65532\[r15\]\.uw, r0 + 168: 06 e2 04 ff fe 7f max 65532\[r15\]\.uw, r15 + 16e: 06 62 04 f0 fe 7f max 65532\[r15\]\.w, r0 + 174: 06 62 04 ff fe 7f max 65532\[r15\]\.w, r15 + 17a: 06 a2 04 f0 ff 3f max 65532\[r15\]\.l, r0 + 180: 06 a2 04 ff ff 3f max 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/max.sm b/gas/testsuite/gas/rx/max.sm new file mode 100644 index 0000000..eb8b7ac --- /dev/null +++ b/gas/testsuite/gas/rx/max.sm @@ -0,0 +1,3 @@ + max #{imm},{reg} + max {reg},{reg} + max {memx},{reg} diff --git a/gas/testsuite/gas/rx/min.d b/gas/testsuite/gas/rx/min.d new file mode 100644 index 0000000..f00a34b --- /dev/null +++ b/gas/testsuite/gas/rx/min.d @@ -0,0 +1,88 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 74 50 80 min #-128, r0 + 4: fd 74 5f 80 min #-128, r15 + 8: fd 74 50 7f min #127, r0 + c: fd 74 5f 7f min #127, r15 + 10: fd 78 50 00 80 min #0xffff8000, r0 + 15: fd 78 5f 00 80 min #0xffff8000, r15 + 1a: fd 7c 50 00 80 00 min #0x8000, r0 + 20: fd 7c 5f 00 80 00 min #0x8000, r15 + 26: fd 7c 50 00 00 80 min #0xff800000, r0 + 2c: fd 7c 5f 00 00 80 min #0xff800000, r15 + 32: fd 7c 50 ff ff 7f min #0x7fffff, r0 + 38: fd 7c 5f ff ff 7f min #0x7fffff, r15 + 3e: fd 70 50 00 00 00 80 min #0x80000000, r0 + 45: fd 70 5f 00 00 00 80 min #0x80000000, r15 + 4c: fd 70 50 ff ff ff 7f min #0x7fffffff, r0 + 53: fd 70 5f ff ff ff 7f min #0x7fffffff, r15 + 5a: fc 17 00 min r0, r0 + 5d: fc 17 0f min r0, r15 + 60: fc 17 f0 min r15, r0 + 63: fc 17 ff min r15, r15 + 66: fc 14 00 min \[r0\]\.ub, r0 + 69: fc 14 0f min \[r0\]\.ub, r15 + 6c: 06 20 05 00 min \[r0\]\.b, r0 + 70: 06 20 05 0f min \[r0\]\.b, r15 + 74: 06 e0 05 00 min \[r0\]\.uw, r0 + 78: 06 e0 05 0f min \[r0\]\.uw, r15 + 7c: 06 60 05 00 min \[r0\]\.w, r0 + 80: 06 60 05 0f min \[r0\]\.w, r15 + 84: 06 a0 05 00 min \[r0\]\.l, r0 + 88: 06 a0 05 0f min \[r0\]\.l, r15 + 8c: fc 14 f0 min \[r15\]\.ub, r0 + 8f: fc 14 ff min \[r15\]\.ub, r15 + 92: 06 20 05 f0 min \[r15\]\.b, r0 + 96: 06 20 05 ff min \[r15\]\.b, r15 + 9a: 06 e0 05 f0 min \[r15\]\.uw, r0 + 9e: 06 e0 05 ff min \[r15\]\.uw, r15 + a2: 06 60 05 f0 min \[r15\]\.w, r0 + a6: 06 60 05 ff min \[r15\]\.w, r15 + aa: 06 a0 05 f0 min \[r15\]\.l, r0 + ae: 06 a0 05 ff min \[r15\]\.l, r15 + b2: fc 15 00 fc min 252\[r0\]\.ub, r0 + b6: fc 15 0f fc min 252\[r0\]\.ub, r15 + ba: 06 21 05 00 fc min 252\[r0\]\.b, r0 + bf: 06 21 05 0f fc min 252\[r0\]\.b, r15 + c4: 06 e1 05 00 7e min 252\[r0\]\.uw, r0 + c9: 06 e1 05 0f 7e min 252\[r0\]\.uw, r15 + ce: 06 61 05 00 7e min 252\[r0\]\.w, r0 + d3: 06 61 05 0f 7e min 252\[r0\]\.w, r15 + d8: 06 a1 05 00 3f min 252\[r0\]\.l, r0 + dd: 06 a1 05 0f 3f min 252\[r0\]\.l, r15 + e2: fc 15 f0 fc min 252\[r15\]\.ub, r0 + e6: fc 15 ff fc min 252\[r15\]\.ub, r15 + ea: 06 21 05 f0 fc min 252\[r15\]\.b, r0 + ef: 06 21 05 ff fc min 252\[r15\]\.b, r15 + f4: 06 e1 05 f0 7e min 252\[r15\]\.uw, r0 + f9: 06 e1 05 ff 7e min 252\[r15\]\.uw, r15 + fe: 06 61 05 f0 7e min 252\[r15\]\.w, r0 + 103: 06 61 05 ff 7e min 252\[r15\]\.w, r15 + 108: 06 a1 05 f0 3f min 252\[r15\]\.l, r0 + 10d: 06 a1 05 ff 3f min 252\[r15\]\.l, r15 + 112: fc 16 00 fc ff min 65532\[r0\]\.ub, r0 + 117: fc 16 0f fc ff min 65532\[r0\]\.ub, r15 + 11c: 06 22 05 00 fc ff min 65532\[r0\]\.b, r0 + 122: 06 22 05 0f fc ff min 65532\[r0\]\.b, r15 + 128: 06 e2 05 00 fe 7f min 65532\[r0\]\.uw, r0 + 12e: 06 e2 05 0f fe 7f min 65532\[r0\]\.uw, r15 + 134: 06 62 05 00 fe 7f min 65532\[r0\]\.w, r0 + 13a: 06 62 05 0f fe 7f min 65532\[r0\]\.w, r15 + 140: 06 a2 05 00 ff 3f min 65532\[r0\]\.l, r0 + 146: 06 a2 05 0f ff 3f min 65532\[r0\]\.l, r15 + 14c: fc 16 f0 fc ff min 65532\[r15\]\.ub, r0 + 151: fc 16 ff fc ff min 65532\[r15\]\.ub, r15 + 156: 06 22 05 f0 fc ff min 65532\[r15\]\.b, r0 + 15c: 06 22 05 ff fc ff min 65532\[r15\]\.b, r15 + 162: 06 e2 05 f0 fe 7f min 65532\[r15\]\.uw, r0 + 168: 06 e2 05 ff fe 7f min 65532\[r15\]\.uw, r15 + 16e: 06 62 05 f0 fe 7f min 65532\[r15\]\.w, r0 + 174: 06 62 05 ff fe 7f min 65532\[r15\]\.w, r15 + 17a: 06 a2 05 f0 ff 3f min 65532\[r15\]\.l, r0 + 180: 06 a2 05 ff ff 3f min 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/min.sm b/gas/testsuite/gas/rx/min.sm new file mode 100644 index 0000000..e735a64 --- /dev/null +++ b/gas/testsuite/gas/rx/min.sm @@ -0,0 +1,3 @@ + min #{imm},{reg} + min {reg},{reg} + min {memx},{reg} diff --git a/gas/testsuite/gas/rx/mov.d b/gas/testsuite/gas/rx/mov.d new file mode 100644 index 0000000..71dfc0a --- /dev/null +++ b/gas/testsuite/gas/rx/mov.d @@ -0,0 +1,476 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 81 00 mov\.b r0, 4\[r0\] + 2: 81 70 mov\.b r0, 4\[r7\] + 4: 87 00 mov\.b r0, 28\[r0\] + 6: 87 70 mov\.b r0, 28\[r7\] + 8: 81 07 mov\.b r7, 4\[r0\] + a: 81 77 mov\.b r7, 4\[r7\] + c: 87 07 mov\.b r7, 28\[r0\] + e: 87 77 mov\.b r7, 28\[r7\] + 10: 90 80 mov\.w r0, 4\[r0\] + 12: 90 f0 mov\.w r0, 4\[r7\] + 14: 93 80 mov\.w r0, 28\[r0\] + 16: 93 f0 mov\.w r0, 28\[r7\] + 18: 90 87 mov\.w r7, 4\[r0\] + 1a: 90 f7 mov\.w r7, 4\[r7\] + 1c: 93 87 mov\.w r7, 28\[r0\] + 1e: 93 f7 mov\.w r7, 28\[r7\] + 20: a0 08 mov\.l r0, 4\[r0\] + 22: a0 78 mov\.l r0, 4\[r7\] + 24: a1 88 mov\.l r0, 28\[r0\] + 26: a1 f8 mov\.l r0, 28\[r7\] + 28: a0 0f mov\.l r7, 4\[r0\] + 2a: a0 7f mov\.l r7, 4\[r7\] + 2c: a1 8f mov\.l r7, 28\[r0\] + 2e: a1 ff mov\.l r7, 28\[r7\] + 30: 89 00 mov\.b 4\[r0\], r0 + 32: 89 07 mov\.b 4\[r0\], r7 + 34: 89 70 mov\.b 4\[r7\], r0 + 36: 89 77 mov\.b 4\[r7\], r7 + 38: 8f 00 mov\.b 28\[r0\], r0 + 3a: 8f 07 mov\.b 28\[r0\], r7 + 3c: 8f 70 mov\.b 28\[r7\], r0 + 3e: 8f 77 mov\.b 28\[r7\], r7 + 40: 98 80 mov\.w 4\[r0\], r0 + 42: 98 87 mov\.w 4\[r0\], r7 + 44: 98 f0 mov\.w 4\[r7\], r0 + 46: 98 f7 mov\.w 4\[r7\], r7 + 48: 9b 80 mov\.w 28\[r0\], r0 + 4a: 9b 87 mov\.w 28\[r0\], r7 + 4c: 9b f0 mov\.w 28\[r7\], r0 + 4e: 9b f7 mov\.w 28\[r7\], r7 + 50: a8 08 mov\.l 4\[r0\], r0 + 52: a8 0f mov\.l 4\[r0\], r7 + 54: a8 78 mov\.l 4\[r7\], r0 + 56: a8 7f mov\.l 4\[r7\], r7 + 58: a9 88 mov\.l 28\[r0\], r0 + 5a: a9 8f mov\.l 28\[r0\], r7 + 5c: a9 f8 mov\.l 28\[r7\], r0 + 5e: a9 ff mov\.l 28\[r7\], r7 + 60: 66 00 mov\.l #0, r0 + 62: 66 0f mov\.l #0, r15 + 64: 66 f0 mov\.l #15, r0 + 66: 66 ff mov\.l #15, r15 + 68: f9 04 04 80 mov\.b #-128, 4\[r0\] + 6c: f9 74 04 80 mov\.b #-128, 4\[r7\] + 70: f9 04 1c 80 mov\.b #-128, 28\[r0\] + 74: f9 74 1c 80 mov\.b #-128, 28\[r7\] + 78: 3c 04 7f mov\.b #127, 4\[r0\] + 7b: 3c 74 7f mov\.b #127, 4\[r7\] + 7e: 3c 8c 7f mov\.b #127, 28\[r0\] + 81: 3c fc 7f mov\.b #127, 28\[r7\] + 84: 3d 02 00 mov\.w #0, 4\[r0\] + 87: 3d 72 00 mov\.w #0, 4\[r7\] + 8a: 3d 0e 00 mov\.w #0, 28\[r0\] + 8d: 3d 7e 00 mov\.w #0, 28\[r7\] + 90: 3d 02 ff mov\.w #255, 4\[r0\] + 93: 3d 72 ff mov\.w #255, 4\[r7\] + 96: 3d 0e ff mov\.w #255, 28\[r0\] + 99: 3d 7e ff mov\.w #255, 28\[r7\] + 9c: 3e 01 00 mov\.l #0, 4\[r0\] + 9f: 3e 71 00 mov\.l #0, 4\[r7\] + a2: 3e 07 00 mov\.l #0, 28\[r0\] + a5: 3e 77 00 mov\.l #0, 28\[r7\] + a8: 3e 01 ff mov\.l #255, 4\[r0\] + ab: 3e 71 ff mov\.l #255, 4\[r7\] + ae: 3e 07 ff mov\.l #255, 28\[r0\] + b1: 3e 77 ff mov\.l #255, 28\[r7\] + b4: 66 00 mov\.l #0, r0 + b6: 66 0f mov\.l #0, r15 + b8: 75 40 ff mov\.l #255, r0 + bb: 75 4f ff mov\.l #255, r15 + be: fb 06 80 mov\.l #-128, r0 + c1: fb f6 80 mov\.l #-128, r15 + c4: 75 40 7f mov\.l #127, r0 + c7: 75 4f 7f mov\.l #127, r15 + ca: fb 0a 00 80 mov\.l #0xffff8000, r0 + ce: fb fa 00 80 mov\.l #0xffff8000, r15 + d2: fb 0e 00 80 00 mov\.l #0x8000, r0 + d7: fb fe 00 80 00 mov\.l #0x8000, r15 + dc: fb 0e 00 00 80 mov\.l #0xff800000, r0 + e1: fb fe 00 00 80 mov\.l #0xff800000, r15 + e6: fb 0e ff ff 7f mov\.l #0x7fffff, r0 + eb: fb fe ff ff 7f mov\.l #0x7fffff, r15 + f0: fb 02 00 00 00 80 mov\.l #0x80000000, r0 + f6: fb f2 00 00 00 80 mov\.l #0x80000000, r15 + fc: fb 02 ff ff ff 7f mov\.l #0x7fffffff, r0 + 102: fb f2 ff ff ff 7f mov\.l #0x7fffffff, r15 + 108: cf 00 mov\.b r0, r0 + 10a: cf 0f mov\.b r0, r15 + 10c: cf f0 mov\.b r15, r0 + 10e: cf ff mov\.b r15, r15 + 110: df 00 mov\.w r0, r0 + 112: df 0f mov\.w r0, r15 + 114: df f0 mov\.w r15, r0 + 116: df ff mov\.w r15, r15 + 118: ef 00 mov\.l r0, r0 + 11a: ef 0f mov\.l r0, r15 + 11c: ef f0 mov\.l r15, r0 + 11e: ef ff mov\.l r15, r15 + 120: 3c 00 00 mov\.b #0, \[r0\] + 123: f8 f4 00 mov\.b #0, \[r15\] + 126: f9 04 fc 00 mov\.b #0, 252\[r0\] + 12a: f9 f4 fc 00 mov\.b #0, 252\[r15\] + 12e: fa 04 fc ff 00 mov\.b #0, 65532\[r0\] + 133: fa f4 fc ff 00 mov\.b #0, 65532\[r15\] + 138: 3c 00 ff mov\.b #255, \[r0\] + 13b: f8 f4 ff mov\.b #-1, \[r15\] + 13e: f9 04 fc ff mov\.b #-1, 252\[r0\] + 142: f9 f4 fc ff mov\.b #-1, 252\[r15\] + 146: fa 04 fc ff ff mov\.b #-1, 65532\[r0\] + 14b: fa f4 fc ff ff mov\.b #-1, 65532\[r15\] + 150: f8 05 80 mov\.w #-128, \[r0\] + 153: f8 f5 80 mov\.w #-128, \[r15\] + 156: f9 05 7e 80 mov\.w #-128, 252\[r0\] + 15a: f9 f5 7e 80 mov\.w #-128, 252\[r15\] + 15e: fa 05 fe 7f 80 mov\.w #-128, 65532\[r0\] + 163: fa f5 fe 7f 80 mov\.w #-128, 65532\[r15\] + 168: 3d 00 7f mov\.w #127, \[r0\] + 16b: f8 f5 7f mov\.w #127, \[r15\] + 16e: f9 05 7e 7f mov\.w #127, 252\[r0\] + 172: f9 f5 7e 7f mov\.w #127, 252\[r15\] + 176: fa 05 fe 7f 7f mov\.w #127, 65532\[r0\] + 17b: fa f5 fe 7f 7f mov\.w #127, 65532\[r15\] + 180: 3d 00 00 mov\.w #0, \[r0\] + 183: f8 f5 00 mov\.w #0, \[r15\] + 186: f9 05 7e 00 mov\.w #0, 252\[r0\] + 18a: f9 f5 7e 00 mov\.w #0, 252\[r15\] + 18e: fa 05 fe 7f 00 mov\.w #0, 65532\[r0\] + 193: fa f5 fe 7f 00 mov\.w #0, 65532\[r15\] + 198: f8 0d ff ff 00 mov\.w #0xffff, \[r0\] + 19d: f8 fd ff ff 00 mov\.w #0xffff, \[r15\] + 1a2: f9 0d 7e ff ff 00 mov\.w #0xffff, 252\[r0\] + 1a8: f9 fd 7e ff ff 00 mov\.w #0xffff, 252\[r15\] + 1ae: fa 0d fe 7f ff ff 00 mov\.w #0xffff, 65532\[r0\] + 1b5: fa fd fe 7f ff ff 00 mov\.w #0xffff, 65532\[r15\] + 1bc: f8 06 80 mov\.l #-128, \[r0\] + 1bf: f8 f6 80 mov\.l #-128, \[r15\] + 1c2: f9 06 3f 80 mov\.l #-128, 252\[r0\] + 1c6: f9 f6 3f 80 mov\.l #-128, 252\[r15\] + 1ca: fa 06 ff 3f 80 mov\.l #-128, 65532\[r0\] + 1cf: fa f6 ff 3f 80 mov\.l #-128, 65532\[r15\] + 1d4: 3e 00 7f mov\.l #127, \[r0\] + 1d7: f8 f6 7f mov\.l #127, \[r15\] + 1da: f9 06 3f 7f mov\.l #127, 252\[r0\] + 1de: f9 f6 3f 7f mov\.l #127, 252\[r15\] + 1e2: fa 06 ff 3f 7f mov\.l #127, 65532\[r0\] + 1e7: fa f6 ff 3f 7f mov\.l #127, 65532\[r15\] + 1ec: f8 0a 00 80 mov\.l #0xffff8000, \[r0\] + 1f0: f8 fa 00 80 mov\.l #0xffff8000, \[r15\] + 1f4: f9 0a 3f 00 80 mov\.l #0xffff8000, 252\[r0\] + 1f9: f9 fa 3f 00 80 mov\.l #0xffff8000, 252\[r15\] + 1fe: fa 0a ff 3f 00 80 mov\.l #0xffff8000, 65532\[r0\] + 204: fa fa ff 3f 00 80 mov\.l #0xffff8000, 65532\[r15\] + 20a: f8 0e 00 80 00 mov\.l #0x8000, \[r0\] + 20f: f8 fe 00 80 00 mov\.l #0x8000, \[r15\] + 214: f9 0e 3f 00 80 00 mov\.l #0x8000, 252\[r0\] + 21a: f9 fe 3f 00 80 00 mov\.l #0x8000, 252\[r15\] + 220: fa 0e ff 3f 00 80 00 mov\.l #0x8000, 65532\[r0\] + 227: fa fe ff 3f 00 80 00 mov\.l #0x8000, 65532\[r15\] + 22e: f8 0e 00 00 80 mov\.l #0xff800000, \[r0\] + 233: f8 fe 00 00 80 mov\.l #0xff800000, \[r15\] + 238: f9 0e 3f 00 00 80 mov\.l #0xff800000, 252\[r0\] + 23e: f9 fe 3f 00 00 80 mov\.l #0xff800000, 252\[r15\] + 244: fa 0e ff 3f 00 00 80 mov\.l #0xff800000, 65532\[r0\] + 24b: fa fe ff 3f 00 00 80 mov\.l #0xff800000, 65532\[r15\] + 252: f8 0e ff ff 7f mov\.l #0x7fffff, \[r0\] + 257: f8 fe ff ff 7f mov\.l #0x7fffff, \[r15\] + 25c: f9 0e 3f ff ff 7f mov\.l #0x7fffff, 252\[r0\] + 262: f9 fe 3f ff ff 7f mov\.l #0x7fffff, 252\[r15\] + 268: fa 0e ff 3f ff ff 7f mov\.l #0x7fffff, 65532\[r0\] + 26f: fa fe ff 3f ff ff 7f mov\.l #0x7fffff, 65532\[r15\] + 276: f8 02 00 00 00 80 mov\.l #0x80000000, \[r0\] + 27c: f8 f2 00 00 00 80 mov\.l #0x80000000, \[r15\] + 282: f9 02 3f 00 00 00 80 mov\.l #0x80000000, 252\[r0\] + 289: f9 f2 3f 00 00 00 80 mov\.l #0x80000000, 252\[r15\] + 290: fa 02 ff 3f 00 00 00 80 mov\.l #0x80000000, 65532\[r0\] + 298: fa f2 ff 3f 00 00 00 80 mov\.l #0x80000000, 65532\[r15\] + 2a0: f8 02 ff ff ff 7f mov\.l #0x7fffffff, \[r0\] + 2a6: f8 f2 ff ff ff 7f mov\.l #0x7fffffff, \[r15\] + 2ac: f9 02 3f ff ff ff 7f mov\.l #0x7fffffff, 252\[r0\] + 2b3: f9 f2 3f ff ff ff 7f mov\.l #0x7fffffff, 252\[r15\] + 2ba: fa 02 ff 3f ff ff ff 7f mov\.l #0x7fffffff, 65532\[r0\] + 2c2: fa f2 ff 3f ff ff ff 7f mov\.l #0x7fffffff, 65532\[r15\] + 2ca: cc 00 mov\.b \[r0\], r0 + 2cc: cc 0f mov\.b \[r0\], r15 + 2ce: cc f0 mov\.b \[r15\], r0 + 2d0: cc ff mov\.b \[r15\], r15 + 2d2: cd 00 fc mov\.b 252\[r0\], r0 + 2d5: cd 0f fc mov\.b 252\[r0\], r15 + 2d8: cd f0 fc mov\.b 252\[r15\], r0 + 2db: cd ff fc mov\.b 252\[r15\], r15 + 2de: ce 00 fc ff mov\.b 65532\[r0\], r0 + 2e2: ce 0f fc ff mov\.b 65532\[r0\], r15 + 2e6: ce f0 fc ff mov\.b 65532\[r15\], r0 + 2ea: ce ff fc ff mov\.b 65532\[r15\], r15 + 2ee: dc 00 mov\.w \[r0\], r0 + 2f0: dc 0f mov\.w \[r0\], r15 + 2f2: dc f0 mov\.w \[r15\], r0 + 2f4: dc ff mov\.w \[r15\], r15 + 2f6: dd 00 7e mov\.w 252\[r0\], r0 + 2f9: dd 0f 7e mov\.w 252\[r0\], r15 + 2fc: dd f0 7e mov\.w 252\[r15\], r0 + 2ff: dd ff 7e mov\.w 252\[r15\], r15 + 302: de 00 fe 7f mov\.w 65532\[r0\], r0 + 306: de 0f fe 7f mov\.w 65532\[r0\], r15 + 30a: de f0 fe 7f mov\.w 65532\[r15\], r0 + 30e: de ff fe 7f mov\.w 65532\[r15\], r15 + 312: ec 00 mov\.l \[r0\], r0 + 314: ec 0f mov\.l \[r0\], r15 + 316: ec f0 mov\.l \[r15\], r0 + 318: ec ff mov\.l \[r15\], r15 + 31a: ed 00 3f mov\.l 252\[r0\], r0 + 31d: ed 0f 3f mov\.l 252\[r0\], r15 + 320: ed f0 3f mov\.l 252\[r15\], r0 + 323: ed ff 3f mov\.l 252\[r15\], r15 + 326: ee 00 ff 3f mov\.l 65532\[r0\], r0 + 32a: ee 0f ff 3f mov\.l 65532\[r0\], r15 + 32e: ee f0 ff 3f mov\.l 65532\[r15\], r0 + 332: ee ff ff 3f mov\.l 65532\[r15\], r15 + 336: fe 40 00 mov\.b \[r0, r0\], r0 + 339: fe 40 0f mov\.b \[r0, r0\], r15 + 33c: fe 40 f0 mov\.b \[r0, r15\], r0 + 33f: fe 40 ff mov\.b \[r0, r15\], r15 + 342: fe 4f 00 mov\.b \[r15, r0\], r0 + 345: fe 4f 0f mov\.b \[r15, r0\], r15 + 348: fe 4f f0 mov\.b \[r15, r15\], r0 + 34b: fe 4f ff mov\.b \[r15, r15\], r15 + 34e: fe 50 00 mov\.w \[r0, r0\], r0 + 351: fe 50 0f mov\.w \[r0, r0\], r15 + 354: fe 50 f0 mov\.w \[r0, r15\], r0 + 357: fe 50 ff mov\.w \[r0, r15\], r15 + 35a: fe 5f 00 mov\.w \[r15, r0\], r0 + 35d: fe 5f 0f mov\.w \[r15, r0\], r15 + 360: fe 5f f0 mov\.w \[r15, r15\], r0 + 363: fe 5f ff mov\.w \[r15, r15\], r15 + 366: fe 60 00 mov\.l \[r0, r0\], r0 + 369: fe 60 0f mov\.l \[r0, r0\], r15 + 36c: fe 60 f0 mov\.l \[r0, r15\], r0 + 36f: fe 60 ff mov\.l \[r0, r15\], r15 + 372: fe 6f 00 mov\.l \[r15, r0\], r0 + 375: fe 6f 0f mov\.l \[r15, r0\], r15 + 378: fe 6f f0 mov\.l \[r15, r15\], r0 + 37b: fe 6f ff mov\.l \[r15, r15\], r15 + 37e: c3 00 mov\.b r0, \[r0\] + 380: c3 f0 mov\.b r0, \[r15\] + 382: c7 00 fc mov\.b r0, 252\[r0\] + 385: c7 f0 fc mov\.b r0, 252\[r15\] + 388: cb 00 fc ff mov\.b r0, 65532\[r0\] + 38c: cb f0 fc ff mov\.b r0, 65532\[r15\] + 390: c3 0f mov\.b r15, \[r0\] + 392: c3 ff mov\.b r15, \[r15\] + 394: c7 0f fc mov\.b r15, 252\[r0\] + 397: c7 ff fc mov\.b r15, 252\[r15\] + 39a: cb 0f fc ff mov\.b r15, 65532\[r0\] + 39e: cb ff fc ff mov\.b r15, 65532\[r15\] + 3a2: d3 00 mov\.w r0, \[r0\] + 3a4: d3 f0 mov\.w r0, \[r15\] + 3a6: d7 00 7e mov\.w r0, 252\[r0\] + 3a9: d7 f0 7e mov\.w r0, 252\[r15\] + 3ac: db 00 fe 7f mov\.w r0, 65532\[r0\] + 3b0: db f0 fe 7f mov\.w r0, 65532\[r15\] + 3b4: d3 0f mov\.w r15, \[r0\] + 3b6: d3 ff mov\.w r15, \[r15\] + 3b8: d7 0f 7e mov\.w r15, 252\[r0\] + 3bb: d7 ff 7e mov\.w r15, 252\[r15\] + 3be: db 0f fe 7f mov\.w r15, 65532\[r0\] + 3c2: db ff fe 7f mov\.w r15, 65532\[r15\] + 3c6: e3 00 mov\.l r0, \[r0\] + 3c8: e3 f0 mov\.l r0, \[r15\] + 3ca: e7 00 3f mov\.l r0, 252\[r0\] + 3cd: e7 f0 3f mov\.l r0, 252\[r15\] + 3d0: eb 00 ff 3f mov\.l r0, 65532\[r0\] + 3d4: eb f0 ff 3f mov\.l r0, 65532\[r15\] + 3d8: e3 0f mov\.l r15, \[r0\] + 3da: e3 ff mov\.l r15, \[r15\] + 3dc: e7 0f 3f mov\.l r15, 252\[r0\] + 3df: e7 ff 3f mov\.l r15, 252\[r15\] + 3e2: eb 0f ff 3f mov\.l r15, 65532\[r0\] + 3e6: eb ff ff 3f mov\.l r15, 65532\[r15\] + 3ea: fe 00 00 mov\.b r0, \[r0, r0\] + 3ed: fe 00 f0 mov\.b r0, \[r0, r15\] + 3f0: fe 0f 00 mov\.b r0, \[r15, r0\] + 3f3: fe 0f f0 mov\.b r0, \[r15, r15\] + 3f6: fe 00 0f mov\.b r15, \[r0, r0\] + 3f9: fe 00 ff mov\.b r15, \[r0, r15\] + 3fc: fe 0f 0f mov\.b r15, \[r15, r0\] + 3ff: fe 0f ff mov\.b r15, \[r15, r15\] + 402: fe 10 00 mov\.w r0, \[r0, r0\] + 405: fe 10 f0 mov\.w r0, \[r0, r15\] + 408: fe 1f 00 mov\.w r0, \[r15, r0\] + 40b: fe 1f f0 mov\.w r0, \[r15, r15\] + 40e: fe 10 0f mov\.w r15, \[r0, r0\] + 411: fe 10 ff mov\.w r15, \[r0, r15\] + 414: fe 1f 0f mov\.w r15, \[r15, r0\] + 417: fe 1f ff mov\.w r15, \[r15, r15\] + 41a: fe 20 00 mov\.l r0, \[r0, r0\] + 41d: fe 20 f0 mov\.l r0, \[r0, r15\] + 420: fe 2f 00 mov\.l r0, \[r15, r0\] + 423: fe 2f f0 mov\.l r0, \[r15, r15\] + 426: fe 20 0f mov\.l r15, \[r0, r0\] + 429: fe 20 ff mov\.l r15, \[r0, r15\] + 42c: fe 2f 0f mov\.l r15, \[r15, r0\] + 42f: fe 2f ff mov\.l r15, \[r15, r15\] + 432: c0 00 mov\.b \[r0\], \[r0\] + 434: c0 0f mov\.b \[r0\], \[r15\] + 436: c4 00 fc mov\.b \[r0\], 252\[r0\] + 439: c4 0f fc mov\.b \[r0\], 252\[r15\] + 43c: c8 00 fc ff mov\.b \[r0\], 65532\[r0\] + 440: c8 0f fc ff mov\.b \[r0\], 65532\[r15\] + 444: c0 f0 mov\.b \[r15\], \[r0\] + 446: c0 ff mov\.b \[r15\], \[r15\] + 448: c4 f0 fc mov\.b \[r15\], 252\[r0\] + 44b: c4 ff fc mov\.b \[r15\], 252\[r15\] + 44e: c8 f0 fc ff mov\.b \[r15\], 65532\[r0\] + 452: c8 ff fc ff mov\.b \[r15\], 65532\[r15\] + 456: c1 00 fc mov\.b 252\[r0\], \[r0\] + 459: c1 0f fc mov\.b 252\[r0\], \[r15\] + 45c: c5 00 fc fc mov\.b 252\[r0\], 252\[r0\] + 460: c5 0f fc fc mov\.b 252\[r0\], 252\[r15\] + 464: c9 00 fc fc ff mov\.b 252\[r0\], 65532\[r0\] + 469: c9 0f fc fc ff mov\.b 252\[r0\], 65532\[r15\] + 46e: c1 f0 fc mov\.b 252\[r15\], \[r0\] + 471: c1 ff fc mov\.b 252\[r15\], \[r15\] + 474: c5 f0 fc fc mov\.b 252\[r15\], 252\[r0\] + 478: c5 ff fc fc mov\.b 252\[r15\], 252\[r15\] + 47c: c9 f0 fc fc ff mov\.b 252\[r15\], 65532\[r0\] + 481: c9 ff fc fc ff mov\.b 252\[r15\], 65532\[r15\] + 486: c2 00 fc ff mov\.b 65532\[r0\], \[r0\] + 48a: c2 0f fc ff mov\.b 65532\[r0\], \[r15\] + 48e: c6 00 fc ff fc mov\.b 65532\[r0\], 252\[r0\] + 493: c6 0f fc ff fc mov\.b 65532\[r0\], 252\[r15\] + 498: ca 00 fc ff fc ff mov\.b 65532\[r0\], 65532\[r0\] + 49e: ca 0f fc ff fc ff mov\.b 65532\[r0\], 65532\[r15\] + 4a4: c2 f0 fc ff mov\.b 65532\[r15\], \[r0\] + 4a8: c2 ff fc ff mov\.b 65532\[r15\], \[r15\] + 4ac: c6 f0 fc ff fc mov\.b 65532\[r15\], 252\[r0\] + 4b1: c6 ff fc ff fc mov\.b 65532\[r15\], 252\[r15\] + 4b6: ca f0 fc ff fc ff mov\.b 65532\[r15\], 65532\[r0\] + 4bc: ca ff fc ff fc ff mov\.b 65532\[r15\], 65532\[r15\] + 4c2: d0 00 mov\.w \[r0\], \[r0\] + 4c4: d0 0f mov\.w \[r0\], \[r15\] + 4c6: d4 00 7e mov\.w \[r0\], 252\[r0\] + 4c9: d4 0f 7e mov\.w \[r0\], 252\[r15\] + 4cc: d8 00 fe 7f mov\.w \[r0\], 65532\[r0\] + 4d0: d8 0f fe 7f mov\.w \[r0\], 65532\[r15\] + 4d4: d0 f0 mov\.w \[r15\], \[r0\] + 4d6: d0 ff mov\.w \[r15\], \[r15\] + 4d8: d4 f0 7e mov\.w \[r15\], 252\[r0\] + 4db: d4 ff 7e mov\.w \[r15\], 252\[r15\] + 4de: d8 f0 fe 7f mov\.w \[r15\], 65532\[r0\] + 4e2: d8 ff fe 7f mov\.w \[r15\], 65532\[r15\] + 4e6: d1 00 7e mov\.w 252\[r0\], \[r0\] + 4e9: d1 0f 7e mov\.w 252\[r0\], \[r15\] + 4ec: d5 00 7e 7e mov\.w 252\[r0\], 252\[r0\] + 4f0: d5 0f 7e 7e mov\.w 252\[r0\], 252\[r15\] + 4f4: d9 00 7e fe 7f mov\.w 252\[r0\], 65532\[r0\] + 4f9: d9 0f 7e fe 7f mov\.w 252\[r0\], 65532\[r15\] + 4fe: d1 f0 7e mov\.w 252\[r15\], \[r0\] + 501: d1 ff 7e mov\.w 252\[r15\], \[r15\] + 504: d5 f0 7e 7e mov\.w 252\[r15\], 252\[r0\] + 508: d5 ff 7e 7e mov\.w 252\[r15\], 252\[r15\] + 50c: d9 f0 7e fe 7f mov\.w 252\[r15\], 65532\[r0\] + 511: d9 ff 7e fe 7f mov\.w 252\[r15\], 65532\[r15\] + 516: d2 00 fe 7f mov\.w 65532\[r0\], \[r0\] + 51a: d2 0f fe 7f mov\.w 65532\[r0\], \[r15\] + 51e: d6 00 fe 7f 7e mov\.w 65532\[r0\], 252\[r0\] + 523: d6 0f fe 7f 7e mov\.w 65532\[r0\], 252\[r15\] + 528: da 00 fe 7f fe 7f mov\.w 65532\[r0\], 65532\[r0\] + 52e: da 0f fe 7f fe 7f mov\.w 65532\[r0\], 65532\[r15\] + 534: d2 f0 fe 7f mov\.w 65532\[r15\], \[r0\] + 538: d2 ff fe 7f mov\.w 65532\[r15\], \[r15\] + 53c: d6 f0 fe 7f 7e mov\.w 65532\[r15\], 252\[r0\] + 541: d6 ff fe 7f 7e mov\.w 65532\[r15\], 252\[r15\] + 546: da f0 fe 7f fe 7f mov\.w 65532\[r15\], 65532\[r0\] + 54c: da ff fe 7f fe 7f mov\.w 65532\[r15\], 65532\[r15\] + 552: e0 00 mov\.l \[r0\], \[r0\] + 554: e0 0f mov\.l \[r0\], \[r15\] + 556: e4 00 3f mov\.l \[r0\], 252\[r0\] + 559: e4 0f 3f mov\.l \[r0\], 252\[r15\] + 55c: e8 00 ff 3f mov\.l \[r0\], 65532\[r0\] + 560: e8 0f ff 3f mov\.l \[r0\], 65532\[r15\] + 564: e0 f0 mov\.l \[r15\], \[r0\] + 566: e0 ff mov\.l \[r15\], \[r15\] + 568: e4 f0 3f mov\.l \[r15\], 252\[r0\] + 56b: e4 ff 3f mov\.l \[r15\], 252\[r15\] + 56e: e8 f0 ff 3f mov\.l \[r15\], 65532\[r0\] + 572: e8 ff ff 3f mov\.l \[r15\], 65532\[r15\] + 576: e1 00 3f mov\.l 252\[r0\], \[r0\] + 579: e1 0f 3f mov\.l 252\[r0\], \[r15\] + 57c: e5 00 3f 3f mov\.l 252\[r0\], 252\[r0\] + 580: e5 0f 3f 3f mov\.l 252\[r0\], 252\[r15\] + 584: e9 00 3f ff 3f mov\.l 252\[r0\], 65532\[r0\] + 589: e9 0f 3f ff 3f mov\.l 252\[r0\], 65532\[r15\] + 58e: e1 f0 3f mov\.l 252\[r15\], \[r0\] + 591: e1 ff 3f mov\.l 252\[r15\], \[r15\] + 594: e5 f0 3f 3f mov\.l 252\[r15\], 252\[r0\] + 598: e5 ff 3f 3f mov\.l 252\[r15\], 252\[r15\] + 59c: e9 f0 3f ff 3f mov\.l 252\[r15\], 65532\[r0\] + 5a1: e9 ff 3f ff 3f mov\.l 252\[r15\], 65532\[r15\] + 5a6: e2 00 ff 3f mov\.l 65532\[r0\], \[r0\] + 5aa: e2 0f ff 3f mov\.l 65532\[r0\], \[r15\] + 5ae: e6 00 ff 3f 3f mov\.l 65532\[r0\], 252\[r0\] + 5b3: e6 0f ff 3f 3f mov\.l 65532\[r0\], 252\[r15\] + 5b8: ea 00 ff 3f ff 3f mov\.l 65532\[r0\], 65532\[r0\] + 5be: ea 0f ff 3f ff 3f mov\.l 65532\[r0\], 65532\[r15\] + 5c4: e2 f0 ff 3f mov\.l 65532\[r15\], \[r0\] + 5c8: e2 ff ff 3f mov\.l 65532\[r15\], \[r15\] + 5cc: e6 f0 ff 3f 3f mov\.l 65532\[r15\], 252\[r0\] + 5d1: e6 ff ff 3f 3f mov\.l 65532\[r15\], 252\[r15\] + 5d6: ea f0 ff 3f ff 3f mov\.l 65532\[r15\], 65532\[r0\] + 5dc: ea ff ff 3f ff 3f mov\.l 65532\[r15\], 65532\[r15\] + 5e2: fd 20 00 mov\.b r0, \[r0\+\] + 5e5: fd 20 f0 mov\.b r0, \[r15\+\] + 5e8: fd 20 0f mov\.b r15, \[r0\+\] + 5eb: fd 20 ff mov\.b r15, \[r15\+\] + 5ee: fd 21 00 mov\.w r0, \[r0\+\] + 5f1: fd 21 f0 mov\.w r0, \[r15\+\] + 5f4: fd 21 0f mov\.w r15, \[r0\+\] + 5f7: fd 21 ff mov\.w r15, \[r15\+\] + 5fa: fd 22 00 mov\.l r0, \[r0\+\] + 5fd: fd 22 f0 mov\.l r0, \[r15\+\] + 600: fd 22 0f mov\.l r15, \[r0\+\] + 603: fd 22 ff mov\.l r15, \[r15\+\] + 606: fd 28 00 mov\.b \[r0\+\], r0 + 609: fd 28 0f mov\.b \[r0\+\], r15 + 60c: fd 28 f0 mov\.b \[r15\+\], r0 + 60f: fd 28 ff mov\.b \[r15\+\], r15 + 612: fd 29 00 mov\.w \[r0\+\], r0 + 615: fd 29 0f mov\.w \[r0\+\], r15 + 618: fd 29 f0 mov\.w \[r15\+\], r0 + 61b: fd 29 ff mov\.w \[r15\+\], r15 + 61e: fd 2a 00 mov\.l \[r0\+\], r0 + 621: fd 2a 0f mov\.l \[r0\+\], r15 + 624: fd 2a f0 mov\.l \[r15\+\], r0 + 627: fd 2a ff mov\.l \[r15\+\], r15 + 62a: fd 24 00 mov\.b r0, \[-r0\] + 62d: fd 24 f0 mov\.b r0, \[-r15\] + 630: fd 24 0f mov\.b r15, \[-r0\] + 633: fd 24 ff mov\.b r15, \[-r15\] + 636: fd 25 00 mov\.w r0, \[-r0\] + 639: fd 25 f0 mov\.w r0, \[-r15\] + 63c: fd 25 0f mov\.w r15, \[-r0\] + 63f: fd 25 ff mov\.w r15, \[-r15\] + 642: fd 26 00 mov\.l r0, \[-r0\] + 645: fd 26 f0 mov\.l r0, \[-r15\] + 648: fd 26 0f mov\.l r15, \[-r0\] + 64b: fd 26 ff mov\.l r15, \[-r15\] + 64e: fd 2c 00 mov\.b \[-r0\], r0 + 651: fd 2c 0f mov\.b \[-r0\], r15 + 654: fd 2c f0 mov\.b \[-r15\], r0 + 657: fd 2c ff mov\.b \[-r15\], r15 + 65a: fd 2d 00 mov\.w \[-r0\], r0 + 65d: fd 2d 0f mov\.w \[-r0\], r15 + 660: fd 2d f0 mov\.w \[-r15\], r0 + 663: fd 2d ff mov\.w \[-r15\], r15 + 666: fd 2e 00 mov\.l \[-r0\], r0 + 669: fd 2e 0f mov\.l \[-r0\], r15 + 66c: fd 2e f0 mov\.l \[-r15\], r0 + 66f: fd 2e ff mov\.l \[-r15\], r15 diff --git a/gas/testsuite/gas/rx/mov.sm b/gas/testsuite/gas/rx/mov.sm new file mode 100644 index 0000000..8914ac7 --- /dev/null +++ b/gas/testsuite/gas/rx/mov.sm @@ -0,0 +1,27 @@ + mov{bwl} {reg7},{dsp5}[{reg7}] + mov{bwl} {dsp5}[{reg7}],{reg7} + mov.L #{uimm4},{reg} + mov.B #{simm8},{dsp5}[{reg7}] + mov.{W;L} #{uimm8},{dsp5}[{reg7}] + + mov.L #{uimm8},{reg} + mov.L #{imm},{reg} + mov{bwl} {reg},{reg} + + mov.B #{uimm8},{mem} + mov.W #{simm8},{mem} + mov.W #{uimm16},{mem} + mov.L #{imm},{mem} + + mov{bwl} {mem},{reg} + mov{bwl} [{reg},{reg}],{reg} + + mov{bwl} {reg},{mem} + mov{bwl} {reg},[{reg},{reg}] + + mov{bwl} {mem},{mem} + + mov{bwl} {reg},[{reg}+] + mov{bwl} [{reg}+],{reg} + mov{bwl} {reg},[-{reg}] + mov{bwl} [-{reg}],{reg} diff --git a/gas/testsuite/gas/rx/movu.d b/gas/testsuite/gas/rx/movu.d new file mode 100644 index 0000000..5ae622f --- /dev/null +++ b/gas/testsuite/gas/rx/movu.d @@ -0,0 +1,88 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: b1 00 movu\.b 4\[r0\], r0 + 2: b1 07 movu\.b 4\[r0\], r7 + 4: b1 70 movu\.b 4\[r7\], r0 + 6: b1 77 movu\.b 4\[r7\], r7 + 8: b7 00 movu\.b 28\[r0\], r0 + a: b7 07 movu\.b 28\[r0\], r7 + c: b7 70 movu\.b 28\[r7\], r0 + e: b7 77 movu\.b 28\[r7\], r7 + 10: b8 80 movu\.w 4\[r0\], r0 + 12: b8 87 movu\.w 4\[r0\], r7 + 14: b8 f0 movu\.w 4\[r7\], r0 + 16: b8 f7 movu\.w 4\[r7\], r7 + 18: bb 80 movu\.w 28\[r0\], r0 + 1a: bb 87 movu\.w 28\[r0\], r7 + 1c: bb f0 movu\.w 28\[r7\], r0 + 1e: bb f7 movu\.w 28\[r7\], r7 + 20: 5b 00 movu\.b r0, r0 + 22: 5b 0f movu\.b r0, r15 + 24: 5b f0 movu\.b r15, r0 + 26: 5b ff movu\.b r15, r15 + 28: 5f 00 movu\.w r0, r0 + 2a: 5f 0f movu\.w r0, r15 + 2c: 5f f0 movu\.w r15, r0 + 2e: 5f ff movu\.w r15, r15 + 30: 58 00 movu\.b \[r0\], r0 + 32: 58 0f movu\.b \[r0\], r15 + 34: 58 f0 movu\.b \[r15\], r0 + 36: 58 ff movu\.b \[r15\], r15 + 38: 59 00 fc movu\.b 252\[r0\], r0 + 3b: 59 0f fc movu\.b 252\[r0\], r15 + 3e: 59 f0 fc movu\.b 252\[r15\], r0 + 41: 59 ff fc movu\.b 252\[r15\], r15 + 44: 5a 00 fc ff movu\.b 65532\[r0\], r0 + 48: 5a 0f fc ff movu\.b 65532\[r0\], r15 + 4c: 5a f0 fc ff movu\.b 65532\[r15\], r0 + 50: 5a ff fc ff movu\.b 65532\[r15\], r15 + 54: 5c 00 movu\.w \[r0\], r0 + 56: 5c 0f movu\.w \[r0\], r15 + 58: 5c f0 movu\.w \[r15\], r0 + 5a: 5c ff movu\.w \[r15\], r15 + 5c: 5d 00 7e movu\.w 252\[r0\], r0 + 5f: 5d 0f 7e movu\.w 252\[r0\], r15 + 62: 5d f0 7e movu\.w 252\[r15\], r0 + 65: 5d ff 7e movu\.w 252\[r15\], r15 + 68: 5e 00 fe 7f movu\.w 65532\[r0\], r0 + 6c: 5e 0f fe 7f movu\.w 65532\[r0\], r15 + 70: 5e f0 fe 7f movu\.w 65532\[r15\], r0 + 74: 5e ff fe 7f movu\.w 65532\[r15\], r15 + 78: fe c0 00 movu\.b \[r0, r0\], r0 + 7b: fe c0 0f movu\.b \[r0, r0\], r15 + 7e: fe c0 f0 movu\.b \[r0, r15\], r0 + 81: fe c0 ff movu\.b \[r0, r15\], r15 + 84: fe cf 00 movu\.b \[r15, r0\], r0 + 87: fe cf 0f movu\.b \[r15, r0\], r15 + 8a: fe cf f0 movu\.b \[r15, r15\], r0 + 8d: fe cf ff movu\.b \[r15, r15\], r15 + 90: fe d0 00 movu\.w \[r0, r0\], r0 + 93: fe d0 0f movu\.w \[r0, r0\], r15 + 96: fe d0 f0 movu\.w \[r0, r15\], r0 + 99: fe d0 ff movu\.w \[r0, r15\], r15 + 9c: fe df 00 movu\.w \[r15, r0\], r0 + 9f: fe df 0f movu\.w \[r15, r0\], r15 + a2: fe df f0 movu\.w \[r15, r15\], r0 + a5: fe df ff movu\.w \[r15, r15\], r15 + a8: fd 38 00 movu\.b \[r0\+\], r0 + ab: fd 38 0f movu\.b \[r0\+\], r15 + ae: fd 38 f0 movu\.b \[r15\+\], r0 + b1: fd 38 ff movu\.b \[r15\+\], r15 + b4: fd 39 00 movu\.w \[r0\+\], r0 + b7: fd 39 0f movu\.w \[r0\+\], r15 + ba: fd 39 f0 movu\.w \[r15\+\], r0 + bd: fd 39 ff movu\.w \[r15\+\], r15 + c0: fd 3c 00 movu\.b \[-r0\], r0 + c3: fd 3c 0f movu\.b \[-r0\], r15 + c6: fd 3c f0 movu\.b \[-r15\], r0 + c9: fd 3c ff movu\.b \[-r15\], r15 + cc: fd 3d 00 movu\.w \[-r0\], r0 + cf: fd 3d 0f movu\.w \[-r0\], r15 + d2: fd 3d f0 movu\.w \[-r15\], r0 + d5: fd 3d ff movu\.w \[-r15\], r15 diff --git a/gas/testsuite/gas/rx/movu.sm b/gas/testsuite/gas/rx/movu.sm new file mode 100644 index 0000000..b1a83bd --- /dev/null +++ b/gas/testsuite/gas/rx/movu.sm @@ -0,0 +1,9 @@ + movu{bw} {dsp5}[{reg7}],{reg7} + + movu{bw} {reg},{reg} + + movu{bw} {mem},{reg} + movu{bw} [{reg},{reg}],{reg} + + movu{bw} [{reg}+],{reg} + movu{bw} [-{reg}],{reg} diff --git a/gas/testsuite/gas/rx/mul.d b/gas/testsuite/gas/rx/mul.d new file mode 100644 index 0000000..55d9079 --- /dev/null +++ b/gas/testsuite/gas/rx/mul.d @@ -0,0 +1,100 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 63 00 mul #0, r0 + 2: 63 0f mul #0, r15 + 4: 63 f0 mul #15, r0 + 6: 63 ff mul #15, r15 + 8: 75 10 80 mul #-128, r0 + b: 75 1f 80 mul #-128, r15 + e: 75 10 7f mul #127, r0 + 11: 75 1f 7f mul #127, r15 + 14: 76 10 00 80 mul #0xffff8000, r0 + 18: 76 1f 00 80 mul #0xffff8000, r15 + 1c: 77 10 00 80 00 mul #0x8000, r0 + 21: 77 1f 00 80 00 mul #0x8000, r15 + 26: 77 10 00 00 80 mul #0xff800000, r0 + 2b: 77 1f 00 00 80 mul #0xff800000, r15 + 30: 77 10 ff ff 7f mul #0x7fffff, r0 + 35: 77 1f ff ff 7f mul #0x7fffff, r15 + 3a: 74 10 00 00 00 80 mul #0x80000000, r0 + 40: 74 1f 00 00 00 80 mul #0x80000000, r15 + 46: 74 10 ff ff ff 7f mul #0x7fffffff, r0 + 4c: 74 1f ff ff ff 7f mul #0x7fffffff, r15 + 52: 4f 00 mul r0, r0 + 54: 4f 0f mul r0, r15 + 56: 4f f0 mul r15, r0 + 58: 4f ff mul r15, r15 + 5a: 4c 00 mul \[r0\]\.ub, r0 + 5c: 4c 0f mul \[r0\]\.ub, r15 + 5e: 06 0c 00 mul \[r0\]\.b, r0 + 61: 06 0c 0f mul \[r0\]\.b, r15 + 64: 06 cc 00 mul \[r0\]\.uw, r0 + 67: 06 cc 0f mul \[r0\]\.uw, r15 + 6a: 06 4c 00 mul \[r0\]\.w, r0 + 6d: 06 4c 0f mul \[r0\]\.w, r15 + 70: 06 8c 00 mul \[r0\]\.l, r0 + 73: 06 8c 0f mul \[r0\]\.l, r15 + 76: 4c f0 mul \[r15\]\.ub, r0 + 78: 4c ff mul \[r15\]\.ub, r15 + 7a: 06 0c f0 mul \[r15\]\.b, r0 + 7d: 06 0c ff mul \[r15\]\.b, r15 + 80: 06 cc f0 mul \[r15\]\.uw, r0 + 83: 06 cc ff mul \[r15\]\.uw, r15 + 86: 06 4c f0 mul \[r15\]\.w, r0 + 89: 06 4c ff mul \[r15\]\.w, r15 + 8c: 06 8c f0 mul \[r15\]\.l, r0 + 8f: 06 8c ff mul \[r15\]\.l, r15 + 92: 4d 00 fc mul 252\[r0\]\.ub, r0 + 95: 4d 0f fc mul 252\[r0\]\.ub, r15 + 98: 06 0d 00 fc mul 252\[r0\]\.b, r0 + 9c: 06 0d 0f fc mul 252\[r0\]\.b, r15 + a0: 06 cd 00 7e mul 252\[r0\]\.uw, r0 + a4: 06 cd 0f 7e mul 252\[r0\]\.uw, r15 + a8: 06 4d 00 7e mul 252\[r0\]\.w, r0 + ac: 06 4d 0f 7e mul 252\[r0\]\.w, r15 + b0: 06 8d 00 3f mul 252\[r0\]\.l, r0 + b4: 06 8d 0f 3f mul 252\[r0\]\.l, r15 + b8: 4d f0 fc mul 252\[r15\]\.ub, r0 + bb: 4d ff fc mul 252\[r15\]\.ub, r15 + be: 06 0d f0 fc mul 252\[r15\]\.b, r0 + c2: 06 0d ff fc mul 252\[r15\]\.b, r15 + c6: 06 cd f0 7e mul 252\[r15\]\.uw, r0 + ca: 06 cd ff 7e mul 252\[r15\]\.uw, r15 + ce: 06 4d f0 7e mul 252\[r15\]\.w, r0 + d2: 06 4d ff 7e mul 252\[r15\]\.w, r15 + d6: 06 8d f0 3f mul 252\[r15\]\.l, r0 + da: 06 8d ff 3f mul 252\[r15\]\.l, r15 + de: 4e 00 fc ff mul 65532\[r0\]\.ub, r0 + e2: 4e 0f fc ff mul 65532\[r0\]\.ub, r15 + e6: 06 0e 00 fc ff mul 65532\[r0\]\.b, r0 + eb: 06 0e 0f fc ff mul 65532\[r0\]\.b, r15 + f0: 06 ce 00 fe 7f mul 65532\[r0\]\.uw, r0 + f5: 06 ce 0f fe 7f mul 65532\[r0\]\.uw, r15 + fa: 06 4e 00 fe 7f mul 65532\[r0\]\.w, r0 + ff: 06 4e 0f fe 7f mul 65532\[r0\]\.w, r15 + 104: 06 8e 00 ff 3f mul 65532\[r0\]\.l, r0 + 109: 06 8e 0f ff 3f mul 65532\[r0\]\.l, r15 + 10e: 4e f0 fc ff mul 65532\[r15\]\.ub, r0 + 112: 4e ff fc ff mul 65532\[r15\]\.ub, r15 + 116: 06 0e f0 fc ff mul 65532\[r15\]\.b, r0 + 11b: 06 0e ff fc ff mul 65532\[r15\]\.b, r15 + 120: 06 ce f0 fe 7f mul 65532\[r15\]\.uw, r0 + 125: 06 ce ff fe 7f mul 65532\[r15\]\.uw, r15 + 12a: 06 4e f0 fe 7f mul 65532\[r15\]\.w, r0 + 12f: 06 4e ff fe 7f mul 65532\[r15\]\.w, r15 + 134: 06 8e f0 ff 3f mul 65532\[r15\]\.l, r0 + 139: 06 8e ff ff 3f mul 65532\[r15\]\.l, r15 + 13e: ff 30 00 mul r0, r0, r0 + 141: ff 3f 00 mul r0, r0, r15 + 144: ff 30 0f mul r0, r15, r0 + 147: ff 3f 0f mul r0, r15, r15 + 14a: ff 30 f0 mul r15, r0, r0 + 14d: ff 3f f0 mul r15, r0, r15 + 150: ff 30 ff mul r15, r15, r0 + 153: ff 3f ff mul r15, r15, r15 diff --git a/gas/testsuite/gas/rx/mul.sm b/gas/testsuite/gas/rx/mul.sm new file mode 100644 index 0000000..cd1202a --- /dev/null +++ b/gas/testsuite/gas/rx/mul.sm @@ -0,0 +1,6 @@ + mul #{uimm4},{reg} + mul #{imm},{reg} + mul {reg},{reg} + mul {memx},{reg} + mul {reg},{reg},{reg} + diff --git a/gas/testsuite/gas/rx/mulhi.d b/gas/testsuite/gas/rx/mulhi.d new file mode 100644 index 0000000..0653bb4 --- /dev/null +++ b/gas/testsuite/gas/rx/mulhi.d @@ -0,0 +1,12 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 00 00 mulhi r0, r0 + 3: fd 00 0f mulhi r0, r15 + 6: fd 00 f0 mulhi r15, r0 + 9: fd 00 ff mulhi r15, r15 diff --git a/gas/testsuite/gas/rx/mulhi.sm b/gas/testsuite/gas/rx/mulhi.sm new file mode 100644 index 0000000..a9765a4 --- /dev/null +++ b/gas/testsuite/gas/rx/mulhi.sm @@ -0,0 +1 @@ + mulhi {reg},{reg} diff --git a/gas/testsuite/gas/rx/mullo.d b/gas/testsuite/gas/rx/mullo.d new file mode 100644 index 0000000..fbf014f --- /dev/null +++ b/gas/testsuite/gas/rx/mullo.d @@ -0,0 +1,12 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 01 00 mullo r0, r0 + 3: fd 01 0f mullo r0, r15 + 6: fd 01 f0 mullo r15, r0 + 9: fd 01 ff mullo r15, r15 diff --git a/gas/testsuite/gas/rx/mullo.sm b/gas/testsuite/gas/rx/mullo.sm new file mode 100644 index 0000000..56d6b8b1 --- /dev/null +++ b/gas/testsuite/gas/rx/mullo.sm @@ -0,0 +1 @@ + mullo {reg},{reg} diff --git a/gas/testsuite/gas/rx/mvfachi.d b/gas/testsuite/gas/rx/mvfachi.d new file mode 100644 index 0000000..de0abf1 --- /dev/null +++ b/gas/testsuite/gas/rx/mvfachi.d @@ -0,0 +1,10 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 1f 00 mvfachi r0 + 3: fd 1f 0f mvfachi r15 diff --git a/gas/testsuite/gas/rx/mvfachi.sm b/gas/testsuite/gas/rx/mvfachi.sm new file mode 100644 index 0000000..e8755d6 --- /dev/null +++ b/gas/testsuite/gas/rx/mvfachi.sm @@ -0,0 +1 @@ + mvfachi {reg} diff --git a/gas/testsuite/gas/rx/mvfaclo.d b/gas/testsuite/gas/rx/mvfaclo.d new file mode 100644 index 0000000..33df9b0 --- /dev/null +++ b/gas/testsuite/gas/rx/mvfaclo.d @@ -0,0 +1,10 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 1f 10 mvfaclo r0 + 3: fd 1f 1f mvfaclo r15 diff --git a/gas/testsuite/gas/rx/mvfaclo.sm b/gas/testsuite/gas/rx/mvfaclo.sm new file mode 100644 index 0000000..b9080e4 --- /dev/null +++ b/gas/testsuite/gas/rx/mvfaclo.sm @@ -0,0 +1 @@ + mvfaclo {reg} diff --git a/gas/testsuite/gas/rx/mvfacmi.d b/gas/testsuite/gas/rx/mvfacmi.d new file mode 100644 index 0000000..c24479a --- /dev/null +++ b/gas/testsuite/gas/rx/mvfacmi.d @@ -0,0 +1,10 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 1f 20 mvfacmi r0 + 3: fd 1f 2f mvfacmi r15 diff --git a/gas/testsuite/gas/rx/mvfacmi.sm b/gas/testsuite/gas/rx/mvfacmi.sm new file mode 100644 index 0000000..400f125 --- /dev/null +++ b/gas/testsuite/gas/rx/mvfacmi.sm @@ -0,0 +1 @@ + mvfacmi {reg} diff --git a/gas/testsuite/gas/rx/mvfc.d b/gas/testsuite/gas/rx/mvfc.d new file mode 100644 index 0000000..d402015 --- /dev/null +++ b/gas/testsuite/gas/rx/mvfc.d @@ -0,0 +1,26 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 6a 00 mvfc psw, r0 + 3: fd 6a 0f mvfc psw, r15 + 6: fd 6a 30 mvfc fpsw, r0 + 9: fd 6a 3f mvfc fpsw, r15 + c: fd 6a 20 mvfc usp, r0 + f: fd 6a 2f mvfc usp, r15 + 12: fd 6a a0 mvfc isp, r0 + 15: fd 6a af mvfc isp, r15 + 18: fd 6a c0 mvfc intb, r0 + 1b: fd 6a cf mvfc intb, r15 + 1e: fd 6a 80 mvfc bpsw, r0 + 21: fd 6a 8f mvfc bpsw, r15 + 24: fd 6a 90 mvfc bpc, r0 + 27: fd 6a 9f mvfc bpc, r15 + 2a: fd 6a b0 mvfc fintv, r0 + 2d: fd 6a bf mvfc fintv, r15 + 30: fd 6a 40 mvfc cpen, r0 + 33: fd 6a 4f mvfc cpen, r15 diff --git a/gas/testsuite/gas/rx/mvfc.sm b/gas/testsuite/gas/rx/mvfc.sm new file mode 100644 index 0000000..3e23cdb --- /dev/null +++ b/gas/testsuite/gas/rx/mvfc.sm @@ -0,0 +1 @@ + mvfc {creg},{reg} diff --git a/gas/testsuite/gas/rx/mvfcp.d b/gas/testsuite/gas/rx/mvfcp.d new file mode 100644 index 0000000..ec47520 --- /dev/null +++ b/gas/testsuite/gas/rx/mvfcp.d @@ -0,0 +1,4 @@ +#objdump: -dr + +dump\.o: file format .* + diff --git a/gas/testsuite/gas/rx/mvfcp.sm b/gas/testsuite/gas/rx/mvfcp.sm new file mode 100644 index 0000000..e30b8b2 --- /dev/null +++ b/gas/testsuite/gas/rx/mvfcp.sm @@ -0,0 +1 @@ +# mvfcp #{uimm2},{reg},{uimm16} diff --git a/gas/testsuite/gas/rx/mvtachi.d b/gas/testsuite/gas/rx/mvtachi.d new file mode 100644 index 0000000..c9f02ee --- /dev/null +++ b/gas/testsuite/gas/rx/mvtachi.d @@ -0,0 +1,10 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 17 00 mvtachi r0 + 3: fd 17 0f mvtachi r15 diff --git a/gas/testsuite/gas/rx/mvtachi.sm b/gas/testsuite/gas/rx/mvtachi.sm new file mode 100644 index 0000000..53dad05 --- /dev/null +++ b/gas/testsuite/gas/rx/mvtachi.sm @@ -0,0 +1 @@ + mvtachi {reg} diff --git a/gas/testsuite/gas/rx/mvtaclo.d b/gas/testsuite/gas/rx/mvtaclo.d new file mode 100644 index 0000000..09c7ca6 --- /dev/null +++ b/gas/testsuite/gas/rx/mvtaclo.d @@ -0,0 +1,10 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 17 10 mvtaclo r0 + 3: fd 17 1f mvtaclo r15 diff --git a/gas/testsuite/gas/rx/mvtaclo.sm b/gas/testsuite/gas/rx/mvtaclo.sm new file mode 100644 index 0000000..840bd88 --- /dev/null +++ b/gas/testsuite/gas/rx/mvtaclo.sm @@ -0,0 +1 @@ + mvtaclo {reg} diff --git a/gas/testsuite/gas/rx/mvtc.d b/gas/testsuite/gas/rx/mvtc.d new file mode 100644 index 0000000..851ba27 --- /dev/null +++ b/gas/testsuite/gas/rx/mvtc.d @@ -0,0 +1,98 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 77 00 80 mvtc #-128, psw + 4: fd 77 03 80 mvtc #-128, fpsw + 8: fd 77 02 80 mvtc #-128, usp + c: fd 77 0a 80 mvtc #-128, isp + 10: fd 77 0c 80 mvtc #-128, intb + 14: fd 77 08 80 mvtc #-128, bpsw + 18: fd 77 09 80 mvtc #-128, bpc + 1c: fd 77 0b 80 mvtc #-128, fintv + 20: fd 77 04 80 mvtc #-128, cpen + 24: fd 77 00 7f mvtc #127, psw + 28: fd 77 03 7f mvtc #127, fpsw + 2c: fd 77 02 7f mvtc #127, usp + 30: fd 77 0a 7f mvtc #127, isp + 34: fd 77 0c 7f mvtc #127, intb + 38: fd 77 08 7f mvtc #127, bpsw + 3c: fd 77 09 7f mvtc #127, bpc + 40: fd 77 0b 7f mvtc #127, fintv + 44: fd 77 04 7f mvtc #127, cpen + 48: fd 7b 00 00 80 mvtc #0xffff8000, psw + 4d: fd 7b 03 00 80 mvtc #0xffff8000, fpsw + 52: fd 7b 02 00 80 mvtc #0xffff8000, usp + 57: fd 7b 0a 00 80 mvtc #0xffff8000, isp + 5c: fd 7b 0c 00 80 mvtc #0xffff8000, intb + 61: fd 7b 08 00 80 mvtc #0xffff8000, bpsw + 66: fd 7b 09 00 80 mvtc #0xffff8000, bpc + 6b: fd 7b 0b 00 80 mvtc #0xffff8000, fintv + 70: fd 7b 04 00 80 mvtc #0xffff8000, cpen + 75: fd 7f 00 00 80 00 mvtc #0x8000, psw + 7b: fd 7f 03 00 80 00 mvtc #0x8000, fpsw + 81: fd 7f 02 00 80 00 mvtc #0x8000, usp + 87: fd 7f 0a 00 80 00 mvtc #0x8000, isp + 8d: fd 7f 0c 00 80 00 mvtc #0x8000, intb + 93: fd 7f 08 00 80 00 mvtc #0x8000, bpsw + 99: fd 7f 09 00 80 00 mvtc #0x8000, bpc + 9f: fd 7f 0b 00 80 00 mvtc #0x8000, fintv + a5: fd 7f 04 00 80 00 mvtc #0x8000, cpen + ab: fd 7f 00 00 00 80 mvtc #0xff800000, psw + b1: fd 7f 03 00 00 80 mvtc #0xff800000, fpsw + b7: fd 7f 02 00 00 80 mvtc #0xff800000, usp + bd: fd 7f 0a 00 00 80 mvtc #0xff800000, isp + c3: fd 7f 0c 00 00 80 mvtc #0xff800000, intb + c9: fd 7f 08 00 00 80 mvtc #0xff800000, bpsw + cf: fd 7f 09 00 00 80 mvtc #0xff800000, bpc + d5: fd 7f 0b 00 00 80 mvtc #0xff800000, fintv + db: fd 7f 04 00 00 80 mvtc #0xff800000, cpen + e1: fd 7f 00 ff ff 7f mvtc #0x7fffff, psw + e7: fd 7f 03 ff ff 7f mvtc #0x7fffff, fpsw + ed: fd 7f 02 ff ff 7f mvtc #0x7fffff, usp + f3: fd 7f 0a ff ff 7f mvtc #0x7fffff, isp + f9: fd 7f 0c ff ff 7f mvtc #0x7fffff, intb + ff: fd 7f 08 ff ff 7f mvtc #0x7fffff, bpsw + 105: fd 7f 09 ff ff 7f mvtc #0x7fffff, bpc + 10b: fd 7f 0b ff ff 7f mvtc #0x7fffff, fintv + 111: fd 7f 04 ff ff 7f mvtc #0x7fffff, cpen + 117: fd 73 00 00 00 00 80 mvtc #0x80000000, psw + 11e: fd 73 03 00 00 00 80 mvtc #0x80000000, fpsw + 125: fd 73 02 00 00 00 80 mvtc #0x80000000, usp + 12c: fd 73 0a 00 00 00 80 mvtc #0x80000000, isp + 133: fd 73 0c 00 00 00 80 mvtc #0x80000000, intb + 13a: fd 73 08 00 00 00 80 mvtc #0x80000000, bpsw + 141: fd 73 09 00 00 00 80 mvtc #0x80000000, bpc + 148: fd 73 0b 00 00 00 80 mvtc #0x80000000, fintv + 14f: fd 73 04 00 00 00 80 mvtc #0x80000000, cpen + 156: fd 73 00 ff ff ff 7f mvtc #0x7fffffff, psw + 15d: fd 73 03 ff ff ff 7f mvtc #0x7fffffff, fpsw + 164: fd 73 02 ff ff ff 7f mvtc #0x7fffffff, usp + 16b: fd 73 0a ff ff ff 7f mvtc #0x7fffffff, isp + 172: fd 73 0c ff ff ff 7f mvtc #0x7fffffff, intb + 179: fd 73 08 ff ff ff 7f mvtc #0x7fffffff, bpsw + 180: fd 73 09 ff ff ff 7f mvtc #0x7fffffff, bpc + 187: fd 73 0b ff ff ff 7f mvtc #0x7fffffff, fintv + 18e: fd 73 04 ff ff ff 7f mvtc #0x7fffffff, cpen + 195: fd 68 00 mvtc r0, psw + 198: fd 68 03 mvtc r0, fpsw + 19b: fd 68 02 mvtc r0, usp + 19e: fd 68 0a mvtc r0, isp + 1a1: fd 68 0c mvtc r0, intb + 1a4: fd 68 08 mvtc r0, bpsw + 1a7: fd 68 09 mvtc r0, bpc + 1aa: fd 68 0b mvtc r0, fintv + 1ad: fd 68 04 mvtc r0, cpen + 1b0: fd 68 f0 mvtc r15, psw + 1b3: fd 68 f3 mvtc r15, fpsw + 1b6: fd 68 f2 mvtc r15, usp + 1b9: fd 68 fa mvtc r15, isp + 1bc: fd 68 fc mvtc r15, intb + 1bf: fd 68 f8 mvtc r15, bpsw + 1c2: fd 68 f9 mvtc r15, bpc + 1c5: fd 68 fb mvtc r15, fintv + 1c8: fd 68 f4 mvtc r15, cpen diff --git a/gas/testsuite/gas/rx/mvtc.sm b/gas/testsuite/gas/rx/mvtc.sm new file mode 100644 index 0000000..2e16c72 --- /dev/null +++ b/gas/testsuite/gas/rx/mvtc.sm @@ -0,0 +1,2 @@ + mvtc #{imm},{creg} + mvtc {reg},{creg} diff --git a/gas/testsuite/gas/rx/mvtcp.d b/gas/testsuite/gas/rx/mvtcp.d new file mode 100644 index 0000000..ec47520 --- /dev/null +++ b/gas/testsuite/gas/rx/mvtcp.d @@ -0,0 +1,4 @@ +#objdump: -dr + +dump\.o: file format .* + diff --git a/gas/testsuite/gas/rx/mvtcp.sm b/gas/testsuite/gas/rx/mvtcp.sm new file mode 100644 index 0000000..12ef644 --- /dev/null +++ b/gas/testsuite/gas/rx/mvtcp.sm @@ -0,0 +1,2 @@ +# mvtcp #{uimm2},#{simm16},${uimm16} +# mvtcp #{uimm2},{reg},${uimm16} diff --git a/gas/testsuite/gas/rx/neg.d b/gas/testsuite/gas/rx/neg.d new file mode 100644 index 0000000..593649c --- /dev/null +++ b/gas/testsuite/gas/rx/neg.d @@ -0,0 +1,14 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7e 10 neg r0 + 2: 7e 1f neg r15 + 4: fc 07 00 neg r0, r0 + 7: fc 07 0f neg r0, r15 + a: fc 07 f0 neg r15, r0 + d: fc 07 ff neg r15, r15 diff --git a/gas/testsuite/gas/rx/neg.sm b/gas/testsuite/gas/rx/neg.sm new file mode 100644 index 0000000..3eeb43c --- /dev/null +++ b/gas/testsuite/gas/rx/neg.sm @@ -0,0 +1,2 @@ + neg {reg} + neg {reg},{reg} diff --git a/gas/testsuite/gas/rx/nop.d b/gas/testsuite/gas/rx/nop.d new file mode 100644 index 0000000..ca00f42 --- /dev/null +++ b/gas/testsuite/gas/rx/nop.d @@ -0,0 +1,9 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 03 nop diff --git a/gas/testsuite/gas/rx/nop.sm b/gas/testsuite/gas/rx/nop.sm new file mode 100644 index 0000000..4e7fe2f --- /dev/null +++ b/gas/testsuite/gas/rx/nop.sm @@ -0,0 +1 @@ + nop diff --git a/gas/testsuite/gas/rx/not.d b/gas/testsuite/gas/rx/not.d new file mode 100644 index 0000000..59fe54b --- /dev/null +++ b/gas/testsuite/gas/rx/not.d @@ -0,0 +1,14 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7e 00 not r0 + 2: 7e 0f not r15 + 4: fc 3b 00 not r0, r0 + 7: fc 3b 0f not r0, r15 + a: fc 3b f0 not r15, r0 + d: fc 3b ff not r15, r15 diff --git a/gas/testsuite/gas/rx/not.sm b/gas/testsuite/gas/rx/not.sm new file mode 100644 index 0000000..9e7a32d --- /dev/null +++ b/gas/testsuite/gas/rx/not.sm @@ -0,0 +1,2 @@ + not {reg} + not {reg},{reg} diff --git a/gas/testsuite/gas/rx/opecp.d b/gas/testsuite/gas/rx/opecp.d new file mode 100644 index 0000000..ec47520 --- /dev/null +++ b/gas/testsuite/gas/rx/opecp.d @@ -0,0 +1,4 @@ +#objdump: -dr + +dump\.o: file format .* + diff --git a/gas/testsuite/gas/rx/opecp.sm b/gas/testsuite/gas/rx/opecp.sm new file mode 100644 index 0000000..78ecd53 --- /dev/null +++ b/gas/testsuite/gas/rx/opecp.sm @@ -0,0 +1 @@ +# opecp #{uimm2},#{uimm16} diff --git a/gas/testsuite/gas/rx/or.d b/gas/testsuite/gas/rx/or.d new file mode 100644 index 0000000..d3da5cf --- /dev/null +++ b/gas/testsuite/gas/rx/or.d @@ -0,0 +1,100 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 65 00 or #0, r0 + 2: 65 0f or #0, r15 + 4: 65 f0 or #15, r0 + 6: 65 ff or #15, r15 + 8: 75 30 80 or #-128, r0 + b: 75 3f 80 or #-128, r15 + e: 75 30 7f or #127, r0 + 11: 75 3f 7f or #127, r15 + 14: 76 30 00 80 or #0xffff8000, r0 + 18: 76 3f 00 80 or #0xffff8000, r15 + 1c: 77 30 00 80 00 or #0x8000, r0 + 21: 77 3f 00 80 00 or #0x8000, r15 + 26: 77 30 00 00 80 or #0xff800000, r0 + 2b: 77 3f 00 00 80 or #0xff800000, r15 + 30: 77 30 ff ff 7f or #0x7fffff, r0 + 35: 77 3f ff ff 7f or #0x7fffff, r15 + 3a: 74 30 00 00 00 80 or #0x80000000, r0 + 40: 74 3f 00 00 00 80 or #0x80000000, r15 + 46: 74 30 ff ff ff 7f or #0x7fffffff, r0 + 4c: 74 3f ff ff ff 7f or #0x7fffffff, r15 + 52: 57 00 or r0, r0 + 54: 57 0f or r0, r15 + 56: 57 f0 or r15, r0 + 58: 57 ff or r15, r15 + 5a: 54 00 or \[r0\]\.ub, r0 + 5c: 54 0f or \[r0\]\.ub, r15 + 5e: 06 14 00 or \[r0\]\.b, r0 + 61: 06 14 0f or \[r0\]\.b, r15 + 64: 06 d4 00 or \[r0\]\.uw, r0 + 67: 06 d4 0f or \[r0\]\.uw, r15 + 6a: 06 54 00 or \[r0\]\.w, r0 + 6d: 06 54 0f or \[r0\]\.w, r15 + 70: 06 94 00 or \[r0\]\.l, r0 + 73: 06 94 0f or \[r0\]\.l, r15 + 76: 54 f0 or \[r15\]\.ub, r0 + 78: 54 ff or \[r15\]\.ub, r15 + 7a: 06 14 f0 or \[r15\]\.b, r0 + 7d: 06 14 ff or \[r15\]\.b, r15 + 80: 06 d4 f0 or \[r15\]\.uw, r0 + 83: 06 d4 ff or \[r15\]\.uw, r15 + 86: 06 54 f0 or \[r15\]\.w, r0 + 89: 06 54 ff or \[r15\]\.w, r15 + 8c: 06 94 f0 or \[r15\]\.l, r0 + 8f: 06 94 ff or \[r15\]\.l, r15 + 92: 55 00 fc or 252\[r0\]\.ub, r0 + 95: 55 0f fc or 252\[r0\]\.ub, r15 + 98: 06 15 00 fc or 252\[r0\]\.b, r0 + 9c: 06 15 0f fc or 252\[r0\]\.b, r15 + a0: 06 d5 00 7e or 252\[r0\]\.uw, r0 + a4: 06 d5 0f 7e or 252\[r0\]\.uw, r15 + a8: 06 55 00 7e or 252\[r0\]\.w, r0 + ac: 06 55 0f 7e or 252\[r0\]\.w, r15 + b0: 06 95 00 3f or 252\[r0\]\.l, r0 + b4: 06 95 0f 3f or 252\[r0\]\.l, r15 + b8: 55 f0 fc or 252\[r15\]\.ub, r0 + bb: 55 ff fc or 252\[r15\]\.ub, r15 + be: 06 15 f0 fc or 252\[r15\]\.b, r0 + c2: 06 15 ff fc or 252\[r15\]\.b, r15 + c6: 06 d5 f0 7e or 252\[r15\]\.uw, r0 + ca: 06 d5 ff 7e or 252\[r15\]\.uw, r15 + ce: 06 55 f0 7e or 252\[r15\]\.w, r0 + d2: 06 55 ff 7e or 252\[r15\]\.w, r15 + d6: 06 95 f0 3f or 252\[r15\]\.l, r0 + da: 06 95 ff 3f or 252\[r15\]\.l, r15 + de: 56 00 fc ff or 65532\[r0\]\.ub, r0 + e2: 56 0f fc ff or 65532\[r0\]\.ub, r15 + e6: 06 16 00 fc ff or 65532\[r0\]\.b, r0 + eb: 06 16 0f fc ff or 65532\[r0\]\.b, r15 + f0: 06 d6 00 fe 7f or 65532\[r0\]\.uw, r0 + f5: 06 d6 0f fe 7f or 65532\[r0\]\.uw, r15 + fa: 06 56 00 fe 7f or 65532\[r0\]\.w, r0 + ff: 06 56 0f fe 7f or 65532\[r0\]\.w, r15 + 104: 06 96 00 ff 3f or 65532\[r0\]\.l, r0 + 109: 06 96 0f ff 3f or 65532\[r0\]\.l, r15 + 10e: 56 f0 fc ff or 65532\[r15\]\.ub, r0 + 112: 56 ff fc ff or 65532\[r15\]\.ub, r15 + 116: 06 16 f0 fc ff or 65532\[r15\]\.b, r0 + 11b: 06 16 ff fc ff or 65532\[r15\]\.b, r15 + 120: 06 d6 f0 fe 7f or 65532\[r15\]\.uw, r0 + 125: 06 d6 ff fe 7f or 65532\[r15\]\.uw, r15 + 12a: 06 56 f0 fe 7f or 65532\[r15\]\.w, r0 + 12f: 06 56 ff fe 7f or 65532\[r15\]\.w, r15 + 134: 06 96 f0 ff 3f or 65532\[r15\]\.l, r0 + 139: 06 96 ff ff 3f or 65532\[r15\]\.l, r15 + 13e: ff 50 00 or r0, r0, r0 + 141: ff 5f 00 or r0, r0, r15 + 144: ff 50 0f or r0, r15, r0 + 147: ff 5f 0f or r0, r15, r15 + 14a: ff 50 f0 or r15, r0, r0 + 14d: ff 5f f0 or r15, r0, r15 + 150: ff 50 ff or r15, r15, r0 + 153: ff 5f ff or r15, r15, r15 diff --git a/gas/testsuite/gas/rx/or.sm b/gas/testsuite/gas/rx/or.sm new file mode 100644 index 0000000..2df6556 --- /dev/null +++ b/gas/testsuite/gas/rx/or.sm @@ -0,0 +1,7 @@ + or #{uimm4},{reg} + or #{imm},{reg} + + or {reg},{reg} + or {memx},{reg} + + or {reg},{reg},{reg} diff --git a/gas/testsuite/gas/rx/pop.d b/gas/testsuite/gas/rx/pop.d new file mode 100644 index 0000000..febeeb2 --- /dev/null +++ b/gas/testsuite/gas/rx/pop.d @@ -0,0 +1,10 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7e b0 pop r0 + 2: 7e bf pop r15 diff --git a/gas/testsuite/gas/rx/pop.sm b/gas/testsuite/gas/rx/pop.sm new file mode 100644 index 0000000..a505097 --- /dev/null +++ b/gas/testsuite/gas/rx/pop.sm @@ -0,0 +1 @@ + pop {reg} diff --git a/gas/testsuite/gas/rx/popc.d b/gas/testsuite/gas/rx/popc.d new file mode 100644 index 0000000..e5eea80 --- /dev/null +++ b/gas/testsuite/gas/rx/popc.d @@ -0,0 +1,17 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7e e0 popc psw + 2: 7e e3 popc fpsw + 4: 7e e2 popc usp + 6: 7e ea popc isp + 8: 7e ec popc intb + a: 7e e8 popc bpsw + c: 7e e9 popc bpc + e: 7e eb popc fintv + 10: 7e e4 popc cpen diff --git a/gas/testsuite/gas/rx/popc.sm b/gas/testsuite/gas/rx/popc.sm new file mode 100644 index 0000000..c273f52 --- /dev/null +++ b/gas/testsuite/gas/rx/popc.sm @@ -0,0 +1 @@ + popc {creg} diff --git a/gas/testsuite/gas/rx/popm.d b/gas/testsuite/gas/rx/popm.d new file mode 100644 index 0000000..e06d8e4 --- /dev/null +++ b/gas/testsuite/gas/rx/popm.d @@ -0,0 +1,13 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 6f 18 popm r1-r8 + 2: 6f 1e popm r1-r14 + 4: 6f 78 popm r7-r8 + 6: 6f 7e popm r7-r14 + 8: 7e b4 pop r4 diff --git a/gas/testsuite/gas/rx/popm.sm b/gas/testsuite/gas/rx/popm.sm new file mode 100644 index 0000000..e63e602 --- /dev/null +++ b/gas/testsuite/gas/rx/popm.sm @@ -0,0 +1,2 @@ + popm {regPlo}-{regPhi} + popm r4-r4 diff --git a/gas/testsuite/gas/rx/push.d b/gas/testsuite/gas/rx/push.d new file mode 100644 index 0000000..cc799c7 --- /dev/null +++ b/gas/testsuite/gas/rx/push.d @@ -0,0 +1,32 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7e 80 push\.b r0 + 2: 7e 8f push\.b r15 + 4: 7e 90 push\.w r0 + 6: 7e 9f push\.w r15 + 8: 7e a0 push\.l r0 + a: 7e af push\.l r15 + c: f4 08 push\.b \[r0\] + e: f4 f8 push\.b \[r15\] + 10: f5 08 fc push\.b 252\[r0\] + 13: f5 f8 fc push\.b 252\[r15\] + 16: f6 08 fc ff push\.b 65532\[r0\] + 1a: f6 f8 fc ff push\.b 65532\[r15\] + 1e: f4 09 push\.w \[r0\] + 20: f4 f9 push\.w \[r15\] + 22: f5 09 7e push\.w 252\[r0\] + 25: f5 f9 7e push\.w 252\[r15\] + 28: f6 09 fe 7f push\.w 65532\[r0\] + 2c: f6 f9 fe 7f push\.w 65532\[r15\] + 30: f4 0a push\.l \[r0\] + 32: f4 fa push\.l \[r15\] + 34: f5 0a 3f push\.l 252\[r0\] + 37: f5 fa 3f push\.l 252\[r15\] + 3a: f6 0a ff 3f push\.l 65532\[r0\] + 3e: f6 fa ff 3f push\.l 65532\[r15\] diff --git a/gas/testsuite/gas/rx/push.sm b/gas/testsuite/gas/rx/push.sm new file mode 100644 index 0000000..8532d36 --- /dev/null +++ b/gas/testsuite/gas/rx/push.sm @@ -0,0 +1,2 @@ + push{bwl} {reg} + push{bwl} {mem} diff --git a/gas/testsuite/gas/rx/pushc.d b/gas/testsuite/gas/rx/pushc.d new file mode 100644 index 0000000..f97a06a --- /dev/null +++ b/gas/testsuite/gas/rx/pushc.d @@ -0,0 +1,17 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7e c0 pushc psw + 2: 7e c3 pushc fpsw + 4: 7e c2 pushc usp + 6: 7e ca pushc isp + 8: 7e cc pushc intb + a: 7e c8 pushc bpsw + c: 7e c9 pushc bpc + e: 7e cb pushc fintv + 10: 7e c4 pushc cpen diff --git a/gas/testsuite/gas/rx/pushc.sm b/gas/testsuite/gas/rx/pushc.sm new file mode 100644 index 0000000..fcdb118 --- /dev/null +++ b/gas/testsuite/gas/rx/pushc.sm @@ -0,0 +1 @@ + pushc {creg} diff --git a/gas/testsuite/gas/rx/pushm.d b/gas/testsuite/gas/rx/pushm.d new file mode 100644 index 0000000..fd2ffa6 --- /dev/null +++ b/gas/testsuite/gas/rx/pushm.d @@ -0,0 +1,13 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 6e 18 pushm r1-r8 + 2: 6e 1e pushm r1-r14 + 4: 6e 78 pushm r7-r8 + 6: 6e 7e pushm r7-r14 + 8: 7e a4 push.l r4 diff --git a/gas/testsuite/gas/rx/pushm.sm b/gas/testsuite/gas/rx/pushm.sm new file mode 100644 index 0000000..6df443f --- /dev/null +++ b/gas/testsuite/gas/rx/pushm.sm @@ -0,0 +1,2 @@ + pushm {regPlo}-{regPhi} + pushm r4-r4 diff --git a/gas/testsuite/gas/rx/r-bcc.d b/gas/testsuite/gas/rx/r-bcc.d new file mode 100644 index 0000000..672a52a --- /dev/null +++ b/gas/testsuite/gas/rx/r-bcc.d @@ -0,0 +1,43 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 : + 0: 20 32 beq\.b 32 + 2: 3a 86 13 beq\.w 1388 + 5: 1e bne\.s b + 6: 04 1a a1 07 bra\.a 7a120 + +0000000a : + a: 21 28 bne\.b 32 + c: 3b 7c 13 bne\.w 1388 + f: 15 beq\.s 14 + 10: 04 10 a1 07 bra\.a 7a120 + +00000014 : + 14: 2a 1e bgt\.b 32 + 16: 2b 05 ble\.b 1b + 18: 38 70 13 bra\.w 1388 + 1b: 2b 06 ble\.b 21 + 1d: 04 03 a1 07 bra\.a 7a120 + +00000021 : + 21: 23 11 bnc\.b 32 + 23: 22 05 bc\.b 28 + 25: 38 63 13 bra\.w 1388 + 28: 22 06 bc\.b 2e + 2a: 04 f6 a0 07 bra\.a 7a120 + +0000002e : + 2e: 03 nop + 2f: 00 brk + \.\.\. + +00000032 : + \.\.\. + +00001388 : + \.\.\. diff --git a/gas/testsuite/gas/rx/r-bcc.sm b/gas/testsuite/gas/rx/r-bcc.sm new file mode 100644 index 0000000..9cfece0 --- /dev/null +++ b/gas/testsuite/gas/rx/r-bcc.sm @@ -0,0 +1,29 @@ +beq: + beq dsp8 + beq dsp16 + beq dsp24 + +bne: + bne dsp8 + bne dsp16 + bne dsp24 + +bgt: + bgt dsp8 + bgt dsp16 + bgt dsp24 + +bltu: + bltu dsp8 + bltu dsp16 + bltu dsp24 + +done: + nop + + .space 3 +dsp8: + .space 4950 +dsp16: + .space 495000 +dsp24: diff --git a/gas/testsuite/gas/rx/r-bra.d b/gas/testsuite/gas/rx/r-bra.d new file mode 100644 index 0000000..9bdef52 --- /dev/null +++ b/gas/testsuite/gas/rx/r-bra.d @@ -0,0 +1,34 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 : + 0: 03 nop + +00000001 : + 1: 03 nop + 2: 03 nop + 3: 04 .. .. .. bra\.a .* + 4: R_RX_DIR24S_PCREL fred + 7: 04 7b 81 00 bra\.a 8182 + b: 38 8e 00 bra\.w 99 + e: 2e f3 bra\.b 1 + 10: 0e bra\.s 16 + 11: 03 nop + 12: 2e ef bra\.b 1 + 14: 03 nop + 15: 03 nop + +00000016 : + 16: 03 nop + \.\.\. + +00000099 : + 99: 03 nop + \.\.\. + +00008182 : + 8182: 03 nop diff --git a/gas/testsuite/gas/rx/r-bra.sm b/gas/testsuite/gas/rx/r-bra.sm new file mode 100644 index 0000000..0800b94 --- /dev/null +++ b/gas/testsuite/gas/rx/r-bra.sm @@ -0,0 +1,22 @@ + nop +bar: + nop + nop + bra fred + bra barney + bra grill + bra bar + bra foo + nop + bra bar + nop + nop +foo: + nop + + .space 130 +grill: + nop + .space 33000 +barney: + nop diff --git a/gas/testsuite/gas/rx/racw.d b/gas/testsuite/gas/rx/racw.d new file mode 100644 index 0000000..6735254 --- /dev/null +++ b/gas/testsuite/gas/rx/racw.d @@ -0,0 +1,10 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 18 00 racw #1 + 3: fd 18 10 racw #2 diff --git a/gas/testsuite/gas/rx/racw.sm b/gas/testsuite/gas/rx/racw.sm new file mode 100644 index 0000000..f7dfd5b --- /dev/null +++ b/gas/testsuite/gas/rx/racw.sm @@ -0,0 +1,2 @@ + racw #1 + racw #2 diff --git a/gas/testsuite/gas/rx/revl.d b/gas/testsuite/gas/rx/revl.d new file mode 100644 index 0000000..0b4de61 --- /dev/null +++ b/gas/testsuite/gas/rx/revl.d @@ -0,0 +1,12 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 67 00 revl r0, r0 + 3: fd 67 0f revl r0, r15 + 6: fd 67 f0 revl r15, r0 + 9: fd 67 ff revl r15, r15 diff --git a/gas/testsuite/gas/rx/revl.sm b/gas/testsuite/gas/rx/revl.sm new file mode 100644 index 0000000..516f039 --- /dev/null +++ b/gas/testsuite/gas/rx/revl.sm @@ -0,0 +1 @@ + revl {reg},{reg} diff --git a/gas/testsuite/gas/rx/revw.d b/gas/testsuite/gas/rx/revw.d new file mode 100644 index 0000000..429b113 --- /dev/null +++ b/gas/testsuite/gas/rx/revw.d @@ -0,0 +1,12 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 65 00 revw r0, r0 + 3: fd 65 0f revw r0, r15 + 6: fd 65 f0 revw r15, r0 + 9: fd 65 ff revw r15, r15 diff --git a/gas/testsuite/gas/rx/revw.sm b/gas/testsuite/gas/rx/revw.sm new file mode 100644 index 0000000..bcff808 --- /dev/null +++ b/gas/testsuite/gas/rx/revw.sm @@ -0,0 +1 @@ + revw {reg},{reg} diff --git a/gas/testsuite/gas/rx/rmpa.d b/gas/testsuite/gas/rx/rmpa.d new file mode 100644 index 0000000..0a325fc --- /dev/null +++ b/gas/testsuite/gas/rx/rmpa.d @@ -0,0 +1,11 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f 8c rmpa\.b + 2: 7f 8d rmpa\.w + 4: 7f 8e rmpa\.l diff --git a/gas/testsuite/gas/rx/rmpa.sm b/gas/testsuite/gas/rx/rmpa.sm new file mode 100644 index 0000000..38710e0 --- /dev/null +++ b/gas/testsuite/gas/rx/rmpa.sm @@ -0,0 +1 @@ + rmpa{bwl} diff --git a/gas/testsuite/gas/rx/rolc.d b/gas/testsuite/gas/rx/rolc.d new file mode 100644 index 0000000..d7b678f --- /dev/null +++ b/gas/testsuite/gas/rx/rolc.d @@ -0,0 +1,10 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7e 50 rolc r0 + 2: 7e 5f rolc r15 diff --git a/gas/testsuite/gas/rx/rolc.sm b/gas/testsuite/gas/rx/rolc.sm new file mode 100644 index 0000000..edc041d --- /dev/null +++ b/gas/testsuite/gas/rx/rolc.sm @@ -0,0 +1 @@ + rolc {reg} diff --git a/gas/testsuite/gas/rx/rorc.d b/gas/testsuite/gas/rx/rorc.d new file mode 100644 index 0000000..3f10658 --- /dev/null +++ b/gas/testsuite/gas/rx/rorc.d @@ -0,0 +1,10 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7e 40 rorc r0 + 2: 7e 4f rorc r15 diff --git a/gas/testsuite/gas/rx/rorc.sm b/gas/testsuite/gas/rx/rorc.sm new file mode 100644 index 0000000..ffd9a44 --- /dev/null +++ b/gas/testsuite/gas/rx/rorc.sm @@ -0,0 +1 @@ + rorc {reg} diff --git a/gas/testsuite/gas/rx/rotl.d b/gas/testsuite/gas/rx/rotl.d new file mode 100644 index 0000000..f1cdd05 --- /dev/null +++ b/gas/testsuite/gas/rx/rotl.d @@ -0,0 +1,16 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 6e 00 rotl #0, r0 + 3: fd 6e 0f rotl #0, r15 + 6: fd 6f f0 rotl #31, r0 + 9: fd 6f ff rotl #31, r15 + c: fd 66 00 rotl r0, r0 + f: fd 66 0f rotl r0, r15 + 12: fd 66 f0 rotl r15, r0 + 15: fd 66 ff rotl r15, r15 diff --git a/gas/testsuite/gas/rx/rotl.sm b/gas/testsuite/gas/rx/rotl.sm new file mode 100644 index 0000000..2774455 --- /dev/null +++ b/gas/testsuite/gas/rx/rotl.sm @@ -0,0 +1,2 @@ + rotl #{uimm5},{reg} + rotl {reg},{reg} diff --git a/gas/testsuite/gas/rx/rotr.d b/gas/testsuite/gas/rx/rotr.d new file mode 100644 index 0000000..dfde640 --- /dev/null +++ b/gas/testsuite/gas/rx/rotr.d @@ -0,0 +1,16 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 6c 00 rotr #0, r0 + 3: fd 6c 0f rotr #0, r15 + 6: fd 6d f0 rotr #31, r0 + 9: fd 6d ff rotr #31, r15 + c: fd 64 00 rotr r0, r0 + f: fd 64 0f rotr r0, r15 + 12: fd 64 f0 rotr r15, r0 + 15: fd 64 ff rotr r15, r15 diff --git a/gas/testsuite/gas/rx/rotr.sm b/gas/testsuite/gas/rx/rotr.sm new file mode 100644 index 0000000..a67d41d --- /dev/null +++ b/gas/testsuite/gas/rx/rotr.sm @@ -0,0 +1,2 @@ + rotr #{uimm5},{reg} + rotr {reg},{reg} diff --git a/gas/testsuite/gas/rx/round.d b/gas/testsuite/gas/rx/round.d new file mode 100644 index 0000000..6927f1c --- /dev/null +++ b/gas/testsuite/gas/rx/round.d @@ -0,0 +1,24 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fc 9b 00 round r0, r0 + 3: fc 9b 0f round r0, r15 + 6: fc 9b f0 round r15, r0 + 9: fc 9b ff round r15, r15 + c: fc 98 00 round \[r0\]\.l, r0 + f: fc 98 0f round \[r0\]\.l, r15 + 12: fc 98 f0 round \[r15\]\.l, r0 + 15: fc 98 ff round \[r15\]\.l, r15 + 18: fc 99 00 3f round 252\[r0\]\.l, r0 + 1c: fc 99 0f 3f round 252\[r0\]\.l, r15 + 20: fc 99 f0 3f round 252\[r15\]\.l, r0 + 24: fc 99 ff 3f round 252\[r15\]\.l, r15 + 28: fc 9a 00 ff 3f round 65532\[r0\]\.l, r0 + 2d: fc 9a 0f ff 3f round 65532\[r0\]\.l, r15 + 32: fc 9a f0 ff 3f round 65532\[r15\]\.l, r0 + 37: fc 9a ff ff 3f round 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/round.sm b/gas/testsuite/gas/rx/round.sm new file mode 100644 index 0000000..4d2f197 --- /dev/null +++ b/gas/testsuite/gas/rx/round.sm @@ -0,0 +1,2 @@ + round {reg},{reg} + round {mem}.L,{reg} diff --git a/gas/testsuite/gas/rx/rte.d b/gas/testsuite/gas/rx/rte.d new file mode 100644 index 0000000..aab166e --- /dev/null +++ b/gas/testsuite/gas/rx/rte.d @@ -0,0 +1,9 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f 95 rte diff --git a/gas/testsuite/gas/rx/rte.sm b/gas/testsuite/gas/rx/rte.sm new file mode 100644 index 0000000..1c16e67 --- /dev/null +++ b/gas/testsuite/gas/rx/rte.sm @@ -0,0 +1 @@ + rte diff --git a/gas/testsuite/gas/rx/rtfi.d b/gas/testsuite/gas/rx/rtfi.d new file mode 100644 index 0000000..39a36de --- /dev/null +++ b/gas/testsuite/gas/rx/rtfi.d @@ -0,0 +1,9 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f 94 rtfi diff --git a/gas/testsuite/gas/rx/rtfi.sm b/gas/testsuite/gas/rx/rtfi.sm new file mode 100644 index 0000000..433c9cb --- /dev/null +++ b/gas/testsuite/gas/rx/rtfi.sm @@ -0,0 +1 @@ + rtfi diff --git a/gas/testsuite/gas/rx/rts.d b/gas/testsuite/gas/rx/rts.d new file mode 100644 index 0000000..23ae0be --- /dev/null +++ b/gas/testsuite/gas/rx/rts.d @@ -0,0 +1,9 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 02 rts diff --git a/gas/testsuite/gas/rx/rts.sm b/gas/testsuite/gas/rx/rts.sm new file mode 100644 index 0000000..ee48942 --- /dev/null +++ b/gas/testsuite/gas/rx/rts.sm @@ -0,0 +1 @@ + rts diff --git a/gas/testsuite/gas/rx/rtsd.d b/gas/testsuite/gas/rx/rtsd.d new file mode 100644 index 0000000..864f30c --- /dev/null +++ b/gas/testsuite/gas/rx/rtsd.d @@ -0,0 +1,18 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 67 00 rtsd #0 + 2: 67 ff rtsd #0x3fc + 4: 3f 18 00 rtsd #0, r1-r8 + 7: 3f 1e 00 rtsd #0, r1-r14 + a: 3f 78 00 rtsd #0, r7-r8 + d: 3f 7e 00 rtsd #0, r7-r14 + 10: 3f 18 ff rtsd #0x3fc, r1-r8 + 13: 3f 1e ff rtsd #0x3fc, r1-r14 + 16: 3f 78 ff rtsd #0x3fc, r7-r8 + 19: 3f 7e ff rtsd #0x3fc, r7-r14 diff --git a/gas/testsuite/gas/rx/rtsd.sm b/gas/testsuite/gas/rx/rtsd.sm new file mode 100644 index 0000000..d24bb61 --- /dev/null +++ b/gas/testsuite/gas/rx/rtsd.sm @@ -0,0 +1,2 @@ + rtsd #{0;1020} + rtsd #{0;1020},{regPlo}-{regPhi} diff --git a/gas/testsuite/gas/rx/rx-asm-bad.l b/gas/testsuite/gas/rx/rx-asm-bad.l new file mode 100644 index 0000000..cd58922 --- /dev/null +++ b/gas/testsuite/gas/rx/rx-asm-bad.l @@ -0,0 +1 @@ +jim diff --git a/gas/testsuite/gas/rx/rx-asm-bad.s b/gas/testsuite/gas/rx/rx-asm-bad.s new file mode 100644 index 0000000..8a78e04 --- /dev/null +++ b/gas/testsuite/gas/rx/rx-asm-bad.s @@ -0,0 +1,58 @@ + .text + + .ID "id-is-jane" + + .INITSCT a_section,data, align + .OPTJ OFF,JMPW,JSRW + .INSF glbfunc, G, 0 + .CALL glbsub, G + .CALL localsub, S + .EINSF + .FB 80H + ldc #80H,FB + .FBSYM george + + .LBBA 1000h + ldr #1000h,LBBA + lda 1000h,0,1200h,1 + + .SB 80H + ldc #80,SB + + .SBBIT lance + bclr lance + + .SBSYM sym + mov.B #0, sym + + .SBSYM16 sym2 + mov.B #0.sym2 + + .RVECTOR 12,timer + + .BTGLB bit1 + + fred .DEFINE "#01H,mem" + + bit1 .BTEQU 1,dmem + + three .equ .INSTR {"albert","bert",1} + seven .equ .LEN {"albert"} + .byte .SUBSTR {"albert",3,3} + + .ASSERT "assertion message" + + .FORM 20,80 + + .LIST ON + + nop + + .PAGE "new page" + + .VER "ver" + + + .END + + This text should just be emitted and not assembled \ No newline at end of file diff --git a/gas/testsuite/gas/rx/rx-asm-good.d b/gas/testsuite/gas/rx/rx-asm-good.d new file mode 100644 index 0000000..d515f24 --- /dev/null +++ b/gas/testsuite/gas/rx/rx-asm-good.d @@ -0,0 +1,41 @@ +# name: Compatibility with Renesas's own assembler +# objdump: -D --prefix-addresses --show-raw-insn + +.*: +file format elf32-rx-.* + + +Disassembly of section .text: +.* +.* +0+0108 66 20[ ]+mov.l[ ]+#2, r0 +0+010a 66 10[ ]+mov.l[ ]+#1, r0 +0+010c 66 00[ ]+mov.l[ ]+#0, r0 +0+010e 05 f2 fe ff[ ]+bsr.a[ ]+0+0000 +0+0112 05 ee fe ff[ ]+bsr.a[ ]+0+0000 +0+0116 62 65[ ]+add[ ]+#6, r5 +0+0118 72 74 0b 2e[ ]+add[ ]+#0x2e0b, r7, r4 +0+011c ff 2e 00[ ]+add[ ]+r0, r0, r14 +.* + +Disassembly of section .data: +0+0000 01.* +0+0001 00.* +0+0002 00.* +0+0003 64 61.* +0+0005 74 00 00 00 00 00.* +.* +0+004f 01.* +0+0050 64 61.* +0+0052 74 61.* +0+0054 00.* +0+0055 00.* +0+0056 00.* +0+0057 fa 43 b6 f3 9d 3f 00 00.* +0+005f fa 43 01 00 00 00 74 77.* +0+0067 6f 07.* +0+0069 00.* +0+006a 00.* +0+006b 00.* +0+006c 03.* +0+006d 00.* +.* diff --git a/gas/testsuite/gas/rx/rx-asm-good.inc b/gas/testsuite/gas/rx/rx-asm-good.inc new file mode 100644 index 0000000..a352905 --- /dev/null +++ b/gas/testsuite/gas/rx/rx-asm-good.inc @@ -0,0 +1,20 @@ + ; mac1 .MACRO f1,f2 + ; .IF ..MACPARA == 2 + ; add f1,f2 + ; .ELSE + ; add r0,f1 + ; .EXITM + ; .ENDIF + ; .ENDM + ; + ; mac2 .MACRO + ; .LOCAL f1 + ; f1: + ; nop + ; bra f1 + ; .ENDM + ; + ; + ; mac3 .MACRO p1,src,p2,dest + ; MOV@p1@p2 src, dest + ; .ENDM diff --git a/gas/testsuite/gas/rx/rx-asm-good.s b/gas/testsuite/gas/rx/rx-asm-good.s new file mode 100644 index 0000000..c9567c3 --- /dev/null +++ b/gas/testsuite/gas/rx/rx-asm-good.s @@ -0,0 +1,86 @@ + + .INCLUDE ..FILE@.inc + + .SECTION .text,CODE,ALIGN + + .ORG 100H + + .GLB mem +mem: + .word three, seven + + ; mac1 r2 + ; mac1 r3,r4 + ; + ; mac2 + ; + ; mac3 L,r0,H,[a0] + + .MREPEAT 3 + mov.l #..MACREP,r0 + .ENDR + + .ALIGN + + .STK 2 + bsr glbsub + bsr localsub + .STK -2 + + .IF TYPE==0 + .byte "harry" + .ELIF TYPE>0 + .byte "jim" + .ELSE + .byte "bert" + .ENDIF + +?: + bra ?+ + bra ?- +?: + bra ?- + + + .SECTION .data,DATA + .GLB dmem +dmem: + size .EQU 2 + + .ADDR 1 + .ADDR "dat" + .ADDR dmem+1 + + .BLKA 1 + .BLKA size + + .BLKB 1 + .BLKB size + + .BLKD 1 + .BLKD size + + .BLKF 1 + .BLKF size + + .BLKL 1 + .BLKL size+1 + + .BLKW 1 + .BLKW size + + .BYTE 1 + .BYTE "data" + .BYTE dmem+1 + + .DOUBLE 5e2 + .FIXED 1.234 + .FLOAT 5e2 + + .LWORD 1 + .LWORD "two" + .LWORD 3+4 + + .WORD 3 + + \ No newline at end of file diff --git a/gas/testsuite/gas/rx/rx.exp b/gas/testsuite/gas/rx/rx.exp new file mode 100644 index 0000000..1809af4 --- /dev/null +++ b/gas/testsuite/gas/rx/rx.exp @@ -0,0 +1,17 @@ +# RX assembler testsuite +# -*- tcl -*- + +if { ! [istarget rx-*-*] } { + return +} + +foreach test [lsort [glob $srcdir/$subdir/*.sm]] { + regexp ".*/(.*)\.sm" $test rxjunk rxbase + exec "$srcdir/$subdir/explode" "-I" "$srcdir/$subdir" "$test" "$srcdir/$subdir/$rxbase.s" + run_dump_test "$rxbase" + # Commment out the next line if you want to retain the generated assembler source files. + remote_file host delete "$srcdir/$subdir/$rxbase.s" +} + +run_dump_test "rx-asm-good" +# run_list_test "rx-asm-bad" "" "Generation of error messages with bogus Renesas assembler directives" diff --git a/gas/testsuite/gas/rx/sat.d b/gas/testsuite/gas/rx/sat.d new file mode 100644 index 0000000..568b83b --- /dev/null +++ b/gas/testsuite/gas/rx/sat.d @@ -0,0 +1,10 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7e 30 sat r0 + 2: 7e 3f sat r15 diff --git a/gas/testsuite/gas/rx/sat.sm b/gas/testsuite/gas/rx/sat.sm new file mode 100644 index 0000000..be2cda7 --- /dev/null +++ b/gas/testsuite/gas/rx/sat.sm @@ -0,0 +1 @@ + sat {reg} diff --git a/gas/testsuite/gas/rx/satr.d b/gas/testsuite/gas/rx/satr.d new file mode 100644 index 0000000..1444265 --- /dev/null +++ b/gas/testsuite/gas/rx/satr.d @@ -0,0 +1,9 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f 93 satr diff --git a/gas/testsuite/gas/rx/satr.sm b/gas/testsuite/gas/rx/satr.sm new file mode 100644 index 0000000..3f63ddf --- /dev/null +++ b/gas/testsuite/gas/rx/satr.sm @@ -0,0 +1 @@ + satr diff --git a/gas/testsuite/gas/rx/sbb.d b/gas/testsuite/gas/rx/sbb.d new file mode 100644 index 0000000..2fe71e1 --- /dev/null +++ b/gas/testsuite/gas/rx/sbb.d @@ -0,0 +1,40 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fc 03 00 sbb r0, r0 + 3: fc 03 0f sbb r0, r15 + 6: fc 03 f0 sbb r15, r0 + 9: fc 03 ff sbb r15, r15 + c: 06 a0 00 00 sbb \[r0\]\.l, r0 + 10: 06 a0 00 0f sbb \[r0\]\.l, r15 + 14: 06 a0 00 f0 sbb \[r15\]\.l, r0 + 18: 06 a0 00 ff sbb \[r15\]\.l, r15 + 1c: 06 a1 00 00 3f sbb 252\[r0\]\.l, r0 + 21: 06 a1 00 0f 3f sbb 252\[r0\]\.l, r15 + 26: 06 a1 00 f0 3f sbb 252\[r15\]\.l, r0 + 2b: 06 a1 00 ff 3f sbb 252\[r15\]\.l, r15 + 30: 06 a2 00 00 ff 3f sbb 65532\[r0\]\.l, r0 + 36: 06 a2 00 0f ff 3f sbb 65532\[r0\]\.l, r15 + 3c: 06 a2 00 f0 ff 3f sbb 65532\[r15\]\.l, r0 + 42: 06 a2 00 ff ff 3f sbb 65532\[r15\]\.l, r15 + 48: fd 74 20 7f adc #127, r0 + 4c: fd 74 2f 7f adc #127, r15 + 50: fd 74 20 80 adc #-128, r0 + 54: fd 74 2f 80 adc #-128, r15 + 58: fd 78 20 ff 7f adc #0x7fff, r0 + 5d: fd 78 2f ff 7f adc #0x7fff, r15 + 62: fd 7c 20 ff 7f ff adc #0xffff7fff, r0 + 68: fd 7c 2f ff 7f ff adc #0xffff7fff, r15 + 6e: fd 7c 20 ff ff 7f adc #0x7fffff, r0 + 74: fd 7c 2f ff ff 7f adc #0x7fffff, r15 + 7a: fd 7c 20 00 00 80 adc #0xff800000, r0 + 80: fd 7c 2f 00 00 80 adc #0xff800000, r15 + 86: fd 70 20 ff ff ff 7f adc #0x7fffffff, r0 + 8d: fd 70 2f ff ff ff 7f adc #0x7fffffff, r15 + 94: fd 70 20 00 00 00 80 adc #0x80000000, r0 + 9b: fd 70 2f 00 00 00 80 adc #0x80000000, r15 diff --git a/gas/testsuite/gas/rx/sbb.sm b/gas/testsuite/gas/rx/sbb.sm new file mode 100644 index 0000000..b4939d9 --- /dev/null +++ b/gas/testsuite/gas/rx/sbb.sm @@ -0,0 +1,5 @@ + sbb {reg},{reg} + sbb {dsp}[{reg}].L,{reg} + + sbb #{imm},{reg} +# gas-specific macro for adc diff --git a/gas/testsuite/gas/rx/sccnd.d b/gas/testsuite/gas/rx/sccnd.d new file mode 100644 index 0000000..a748588 --- /dev/null +++ b/gas/testsuite/gas/rx/sccnd.d @@ -0,0 +1,368 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fc db 02 scc\.l r0 + 3: fc db f2 scc\.l r15 + 6: fc db 02 scc\.l r0 + 9: fc db f2 scc\.l r15 + c: fc db 00 sceq\.l r0 + f: fc db f0 sceq\.l r15 + 12: fc db 00 sceq\.l r0 + 15: fc db f0 sceq\.l r15 + 18: fc db 04 scgtu\.l r0 + 1b: fc db f4 scgtu\.l r15 + 1e: fc db 06 scpz\.l r0 + 21: fc db f6 scpz\.l r15 + 24: fc db 08 scge\.l r0 + 27: fc db f8 scge\.l r15 + 2a: fc db 0a scgt\.l r0 + 2d: fc db fa scgt\.l r15 + 30: fc db 0c sco\.l r0 + 33: fc db fc sco\.l r15 + 36: fc db 03 scnc\.l r0 + 39: fc db f3 scnc\.l r15 + 3c: fc db 03 scnc\.l r0 + 3f: fc db f3 scnc\.l r15 + 42: fc db 01 scne\.l r0 + 45: fc db f1 scne\.l r15 + 48: fc db 01 scne\.l r0 + 4b: fc db f1 scne\.l r15 + 4e: fc db 05 scleu\.l r0 + 51: fc db f5 scleu\.l r15 + 54: fc db 07 scn\.l r0 + 57: fc db f7 scn\.l r15 + 5a: fc db 09 sclt\.l r0 + 5d: fc db f9 sclt\.l r15 + 60: fc db 0b scle\.l r0 + 63: fc db fb scle\.l r15 + 66: fc db 0d scno\.l r0 + 69: fc db fd scno\.l r15 + 6c: fc d0 02 scc\.b \[r0\] + 6f: fc d0 f2 scc\.b \[r15\] + 72: fc d1 02 fc scc\.b 252\[r0\] + 76: fc d1 f2 fc scc\.b 252\[r15\] + 7a: fc d2 02 fc ff scc\.b 65532\[r0\] + 7f: fc d2 f2 fc ff scc\.b 65532\[r15\] + 84: fc d4 02 scc\.w \[r0\] + 87: fc d4 f2 scc\.w \[r15\] + 8a: fc d5 02 7e scc\.w 252\[r0\] + 8e: fc d5 f2 7e scc\.w 252\[r15\] + 92: fc d6 02 fe 7f scc\.w 65532\[r0\] + 97: fc d6 f2 fe 7f scc\.w 65532\[r15\] + 9c: fc d8 02 scc\.l \[r0\] + 9f: fc d8 f2 scc\.l \[r15\] + a2: fc d9 02 3f scc\.l 252\[r0\] + a6: fc d9 f2 3f scc\.l 252\[r15\] + aa: fc da 02 ff 3f scc\.l 65532\[r0\] + af: fc da f2 ff 3f scc\.l 65532\[r15\] + b4: fc d0 02 scc\.b \[r0\] + b7: fc d0 f2 scc\.b \[r15\] + ba: fc d1 02 fc scc\.b 252\[r0\] + be: fc d1 f2 fc scc\.b 252\[r15\] + c2: fc d2 02 fc ff scc\.b 65532\[r0\] + c7: fc d2 f2 fc ff scc\.b 65532\[r15\] + cc: fc d4 02 scc\.w \[r0\] + cf: fc d4 f2 scc\.w \[r15\] + d2: fc d5 02 7e scc\.w 252\[r0\] + d6: fc d5 f2 7e scc\.w 252\[r15\] + da: fc d6 02 fe 7f scc\.w 65532\[r0\] + df: fc d6 f2 fe 7f scc\.w 65532\[r15\] + e4: fc d8 02 scc\.l \[r0\] + e7: fc d8 f2 scc\.l \[r15\] + ea: fc d9 02 3f scc\.l 252\[r0\] + ee: fc d9 f2 3f scc\.l 252\[r15\] + f2: fc da 02 ff 3f scc\.l 65532\[r0\] + f7: fc da f2 ff 3f scc\.l 65532\[r15\] + fc: fc d0 00 sceq\.b \[r0\] + ff: fc d0 f0 sceq\.b \[r15\] + 102: fc d1 00 fc sceq\.b 252\[r0\] + 106: fc d1 f0 fc sceq\.b 252\[r15\] + 10a: fc d2 00 fc ff sceq\.b 65532\[r0\] + 10f: fc d2 f0 fc ff sceq\.b 65532\[r15\] + 114: fc d4 00 sceq\.w \[r0\] + 117: fc d4 f0 sceq\.w \[r15\] + 11a: fc d5 00 7e sceq\.w 252\[r0\] + 11e: fc d5 f0 7e sceq\.w 252\[r15\] + 122: fc d6 00 fe 7f sceq\.w 65532\[r0\] + 127: fc d6 f0 fe 7f sceq\.w 65532\[r15\] + 12c: fc d8 00 sceq\.l \[r0\] + 12f: fc d8 f0 sceq\.l \[r15\] + 132: fc d9 00 3f sceq\.l 252\[r0\] + 136: fc d9 f0 3f sceq\.l 252\[r15\] + 13a: fc da 00 ff 3f sceq\.l 65532\[r0\] + 13f: fc da f0 ff 3f sceq\.l 65532\[r15\] + 144: fc d0 00 sceq\.b \[r0\] + 147: fc d0 f0 sceq\.b \[r15\] + 14a: fc d1 00 fc sceq\.b 252\[r0\] + 14e: fc d1 f0 fc sceq\.b 252\[r15\] + 152: fc d2 00 fc ff sceq\.b 65532\[r0\] + 157: fc d2 f0 fc ff sceq\.b 65532\[r15\] + 15c: fc d4 00 sceq\.w \[r0\] + 15f: fc d4 f0 sceq\.w \[r15\] + 162: fc d5 00 7e sceq\.w 252\[r0\] + 166: fc d5 f0 7e sceq\.w 252\[r15\] + 16a: fc d6 00 fe 7f sceq\.w 65532\[r0\] + 16f: fc d6 f0 fe 7f sceq\.w 65532\[r15\] + 174: fc d8 00 sceq\.l \[r0\] + 177: fc d8 f0 sceq\.l \[r15\] + 17a: fc d9 00 3f sceq\.l 252\[r0\] + 17e: fc d9 f0 3f sceq\.l 252\[r15\] + 182: fc da 00 ff 3f sceq\.l 65532\[r0\] + 187: fc da f0 ff 3f sceq\.l 65532\[r15\] + 18c: fc d0 04 scgtu\.b \[r0\] + 18f: fc d0 f4 scgtu\.b \[r15\] + 192: fc d1 04 fc scgtu\.b 252\[r0\] + 196: fc d1 f4 fc scgtu\.b 252\[r15\] + 19a: fc d2 04 fc ff scgtu\.b 65532\[r0\] + 19f: fc d2 f4 fc ff scgtu\.b 65532\[r15\] + 1a4: fc d4 04 scgtu\.w \[r0\] + 1a7: fc d4 f4 scgtu\.w \[r15\] + 1aa: fc d5 04 7e scgtu\.w 252\[r0\] + 1ae: fc d5 f4 7e scgtu\.w 252\[r15\] + 1b2: fc d6 04 fe 7f scgtu\.w 65532\[r0\] + 1b7: fc d6 f4 fe 7f scgtu\.w 65532\[r15\] + 1bc: fc d8 04 scgtu\.l \[r0\] + 1bf: fc d8 f4 scgtu\.l \[r15\] + 1c2: fc d9 04 3f scgtu\.l 252\[r0\] + 1c6: fc d9 f4 3f scgtu\.l 252\[r15\] + 1ca: fc da 04 ff 3f scgtu\.l 65532\[r0\] + 1cf: fc da f4 ff 3f scgtu\.l 65532\[r15\] + 1d4: fc d0 06 scpz\.b \[r0\] + 1d7: fc d0 f6 scpz\.b \[r15\] + 1da: fc d1 06 fc scpz\.b 252\[r0\] + 1de: fc d1 f6 fc scpz\.b 252\[r15\] + 1e2: fc d2 06 fc ff scpz\.b 65532\[r0\] + 1e7: fc d2 f6 fc ff scpz\.b 65532\[r15\] + 1ec: fc d4 06 scpz\.w \[r0\] + 1ef: fc d4 f6 scpz\.w \[r15\] + 1f2: fc d5 06 7e scpz\.w 252\[r0\] + 1f6: fc d5 f6 7e scpz\.w 252\[r15\] + 1fa: fc d6 06 fe 7f scpz\.w 65532\[r0\] + 1ff: fc d6 f6 fe 7f scpz\.w 65532\[r15\] + 204: fc d8 06 scpz\.l \[r0\] + 207: fc d8 f6 scpz\.l \[r15\] + 20a: fc d9 06 3f scpz\.l 252\[r0\] + 20e: fc d9 f6 3f scpz\.l 252\[r15\] + 212: fc da 06 ff 3f scpz\.l 65532\[r0\] + 217: fc da f6 ff 3f scpz\.l 65532\[r15\] + 21c: fc d0 08 scge\.b \[r0\] + 21f: fc d0 f8 scge\.b \[r15\] + 222: fc d1 08 fc scge\.b 252\[r0\] + 226: fc d1 f8 fc scge\.b 252\[r15\] + 22a: fc d2 08 fc ff scge\.b 65532\[r0\] + 22f: fc d2 f8 fc ff scge\.b 65532\[r15\] + 234: fc d4 08 scge\.w \[r0\] + 237: fc d4 f8 scge\.w \[r15\] + 23a: fc d5 08 7e scge\.w 252\[r0\] + 23e: fc d5 f8 7e scge\.w 252\[r15\] + 242: fc d6 08 fe 7f scge\.w 65532\[r0\] + 247: fc d6 f8 fe 7f scge\.w 65532\[r15\] + 24c: fc d8 08 scge\.l \[r0\] + 24f: fc d8 f8 scge\.l \[r15\] + 252: fc d9 08 3f scge\.l 252\[r0\] + 256: fc d9 f8 3f scge\.l 252\[r15\] + 25a: fc da 08 ff 3f scge\.l 65532\[r0\] + 25f: fc da f8 ff 3f scge\.l 65532\[r15\] + 264: fc d0 0a scgt\.b \[r0\] + 267: fc d0 fa scgt\.b \[r15\] + 26a: fc d1 0a fc scgt\.b 252\[r0\] + 26e: fc d1 fa fc scgt\.b 252\[r15\] + 272: fc d2 0a fc ff scgt\.b 65532\[r0\] + 277: fc d2 fa fc ff scgt\.b 65532\[r15\] + 27c: fc d4 0a scgt\.w \[r0\] + 27f: fc d4 fa scgt\.w \[r15\] + 282: fc d5 0a 7e scgt\.w 252\[r0\] + 286: fc d5 fa 7e scgt\.w 252\[r15\] + 28a: fc d6 0a fe 7f scgt\.w 65532\[r0\] + 28f: fc d6 fa fe 7f scgt\.w 65532\[r15\] + 294: fc d8 0a scgt\.l \[r0\] + 297: fc d8 fa scgt\.l \[r15\] + 29a: fc d9 0a 3f scgt\.l 252\[r0\] + 29e: fc d9 fa 3f scgt\.l 252\[r15\] + 2a2: fc da 0a ff 3f scgt\.l 65532\[r0\] + 2a7: fc da fa ff 3f scgt\.l 65532\[r15\] + 2ac: fc d0 0c sco\.b \[r0\] + 2af: fc d0 fc sco\.b \[r15\] + 2b2: fc d1 0c fc sco\.b 252\[r0\] + 2b6: fc d1 fc fc sco\.b 252\[r15\] + 2ba: fc d2 0c fc ff sco\.b 65532\[r0\] + 2bf: fc d2 fc fc ff sco\.b 65532\[r15\] + 2c4: fc d4 0c sco\.w \[r0\] + 2c7: fc d4 fc sco\.w \[r15\] + 2ca: fc d5 0c 7e sco\.w 252\[r0\] + 2ce: fc d5 fc 7e sco\.w 252\[r15\] + 2d2: fc d6 0c fe 7f sco\.w 65532\[r0\] + 2d7: fc d6 fc fe 7f sco\.w 65532\[r15\] + 2dc: fc d8 0c sco\.l \[r0\] + 2df: fc d8 fc sco\.l \[r15\] + 2e2: fc d9 0c 3f sco\.l 252\[r0\] + 2e6: fc d9 fc 3f sco\.l 252\[r15\] + 2ea: fc da 0c ff 3f sco\.l 65532\[r0\] + 2ef: fc da fc ff 3f sco\.l 65532\[r15\] + 2f4: fc d0 03 scnc\.b \[r0\] + 2f7: fc d0 f3 scnc\.b \[r15\] + 2fa: fc d1 03 fc scnc\.b 252\[r0\] + 2fe: fc d1 f3 fc scnc\.b 252\[r15\] + 302: fc d2 03 fc ff scnc\.b 65532\[r0\] + 307: fc d2 f3 fc ff scnc\.b 65532\[r15\] + 30c: fc d4 03 scnc\.w \[r0\] + 30f: fc d4 f3 scnc\.w \[r15\] + 312: fc d5 03 7e scnc\.w 252\[r0\] + 316: fc d5 f3 7e scnc\.w 252\[r15\] + 31a: fc d6 03 fe 7f scnc\.w 65532\[r0\] + 31f: fc d6 f3 fe 7f scnc\.w 65532\[r15\] + 324: fc d8 03 scnc\.l \[r0\] + 327: fc d8 f3 scnc\.l \[r15\] + 32a: fc d9 03 3f scnc\.l 252\[r0\] + 32e: fc d9 f3 3f scnc\.l 252\[r15\] + 332: fc da 03 ff 3f scnc\.l 65532\[r0\] + 337: fc da f3 ff 3f scnc\.l 65532\[r15\] + 33c: fc d0 03 scnc\.b \[r0\] + 33f: fc d0 f3 scnc\.b \[r15\] + 342: fc d1 03 fc scnc\.b 252\[r0\] + 346: fc d1 f3 fc scnc\.b 252\[r15\] + 34a: fc d2 03 fc ff scnc\.b 65532\[r0\] + 34f: fc d2 f3 fc ff scnc\.b 65532\[r15\] + 354: fc d4 03 scnc\.w \[r0\] + 357: fc d4 f3 scnc\.w \[r15\] + 35a: fc d5 03 7e scnc\.w 252\[r0\] + 35e: fc d5 f3 7e scnc\.w 252\[r15\] + 362: fc d6 03 fe 7f scnc\.w 65532\[r0\] + 367: fc d6 f3 fe 7f scnc\.w 65532\[r15\] + 36c: fc d8 03 scnc\.l \[r0\] + 36f: fc d8 f3 scnc\.l \[r15\] + 372: fc d9 03 3f scnc\.l 252\[r0\] + 376: fc d9 f3 3f scnc\.l 252\[r15\] + 37a: fc da 03 ff 3f scnc\.l 65532\[r0\] + 37f: fc da f3 ff 3f scnc\.l 65532\[r15\] + 384: fc d0 01 scne\.b \[r0\] + 387: fc d0 f1 scne\.b \[r15\] + 38a: fc d1 01 fc scne\.b 252\[r0\] + 38e: fc d1 f1 fc scne\.b 252\[r15\] + 392: fc d2 01 fc ff scne\.b 65532\[r0\] + 397: fc d2 f1 fc ff scne\.b 65532\[r15\] + 39c: fc d4 01 scne\.w \[r0\] + 39f: fc d4 f1 scne\.w \[r15\] + 3a2: fc d5 01 7e scne\.w 252\[r0\] + 3a6: fc d5 f1 7e scne\.w 252\[r15\] + 3aa: fc d6 01 fe 7f scne\.w 65532\[r0\] + 3af: fc d6 f1 fe 7f scne\.w 65532\[r15\] + 3b4: fc d8 01 scne\.l \[r0\] + 3b7: fc d8 f1 scne\.l \[r15\] + 3ba: fc d9 01 3f scne\.l 252\[r0\] + 3be: fc d9 f1 3f scne\.l 252\[r15\] + 3c2: fc da 01 ff 3f scne\.l 65532\[r0\] + 3c7: fc da f1 ff 3f scne\.l 65532\[r15\] + 3cc: fc d0 01 scne\.b \[r0\] + 3cf: fc d0 f1 scne\.b \[r15\] + 3d2: fc d1 01 fc scne\.b 252\[r0\] + 3d6: fc d1 f1 fc scne\.b 252\[r15\] + 3da: fc d2 01 fc ff scne\.b 65532\[r0\] + 3df: fc d2 f1 fc ff scne\.b 65532\[r15\] + 3e4: fc d4 01 scne\.w \[r0\] + 3e7: fc d4 f1 scne\.w \[r15\] + 3ea: fc d5 01 7e scne\.w 252\[r0\] + 3ee: fc d5 f1 7e scne\.w 252\[r15\] + 3f2: fc d6 01 fe 7f scne\.w 65532\[r0\] + 3f7: fc d6 f1 fe 7f scne\.w 65532\[r15\] + 3fc: fc d8 01 scne\.l \[r0\] + 3ff: fc d8 f1 scne\.l \[r15\] + 402: fc d9 01 3f scne\.l 252\[r0\] + 406: fc d9 f1 3f scne\.l 252\[r15\] + 40a: fc da 01 ff 3f scne\.l 65532\[r0\] + 40f: fc da f1 ff 3f scne\.l 65532\[r15\] + 414: fc d0 05 scleu\.b \[r0\] + 417: fc d0 f5 scleu\.b \[r15\] + 41a: fc d1 05 fc scleu\.b 252\[r0\] + 41e: fc d1 f5 fc scleu\.b 252\[r15\] + 422: fc d2 05 fc ff scleu\.b 65532\[r0\] + 427: fc d2 f5 fc ff scleu\.b 65532\[r15\] + 42c: fc d4 05 scleu\.w \[r0\] + 42f: fc d4 f5 scleu\.w \[r15\] + 432: fc d5 05 7e scleu\.w 252\[r0\] + 436: fc d5 f5 7e scleu\.w 252\[r15\] + 43a: fc d6 05 fe 7f scleu\.w 65532\[r0\] + 43f: fc d6 f5 fe 7f scleu\.w 65532\[r15\] + 444: fc d8 05 scleu\.l \[r0\] + 447: fc d8 f5 scleu\.l \[r15\] + 44a: fc d9 05 3f scleu\.l 252\[r0\] + 44e: fc d9 f5 3f scleu\.l 252\[r15\] + 452: fc da 05 ff 3f scleu\.l 65532\[r0\] + 457: fc da f5 ff 3f scleu\.l 65532\[r15\] + 45c: fc d0 07 scn\.b \[r0\] + 45f: fc d0 f7 scn\.b \[r15\] + 462: fc d1 07 fc scn\.b 252\[r0\] + 466: fc d1 f7 fc scn\.b 252\[r15\] + 46a: fc d2 07 fc ff scn\.b 65532\[r0\] + 46f: fc d2 f7 fc ff scn\.b 65532\[r15\] + 474: fc d4 07 scn\.w \[r0\] + 477: fc d4 f7 scn\.w \[r15\] + 47a: fc d5 07 7e scn\.w 252\[r0\] + 47e: fc d5 f7 7e scn\.w 252\[r15\] + 482: fc d6 07 fe 7f scn\.w 65532\[r0\] + 487: fc d6 f7 fe 7f scn\.w 65532\[r15\] + 48c: fc d8 07 scn\.l \[r0\] + 48f: fc d8 f7 scn\.l \[r15\] + 492: fc d9 07 3f scn\.l 252\[r0\] + 496: fc d9 f7 3f scn\.l 252\[r15\] + 49a: fc da 07 ff 3f scn\.l 65532\[r0\] + 49f: fc da f7 ff 3f scn\.l 65532\[r15\] + 4a4: fc d0 09 sclt\.b \[r0\] + 4a7: fc d0 f9 sclt\.b \[r15\] + 4aa: fc d1 09 fc sclt\.b 252\[r0\] + 4ae: fc d1 f9 fc sclt\.b 252\[r15\] + 4b2: fc d2 09 fc ff sclt\.b 65532\[r0\] + 4b7: fc d2 f9 fc ff sclt\.b 65532\[r15\] + 4bc: fc d4 09 sclt\.w \[r0\] + 4bf: fc d4 f9 sclt\.w \[r15\] + 4c2: fc d5 09 7e sclt\.w 252\[r0\] + 4c6: fc d5 f9 7e sclt\.w 252\[r15\] + 4ca: fc d6 09 fe 7f sclt\.w 65532\[r0\] + 4cf: fc d6 f9 fe 7f sclt\.w 65532\[r15\] + 4d4: fc d8 09 sclt\.l \[r0\] + 4d7: fc d8 f9 sclt\.l \[r15\] + 4da: fc d9 09 3f sclt\.l 252\[r0\] + 4de: fc d9 f9 3f sclt\.l 252\[r15\] + 4e2: fc da 09 ff 3f sclt\.l 65532\[r0\] + 4e7: fc da f9 ff 3f sclt\.l 65532\[r15\] + 4ec: fc d0 0b scle\.b \[r0\] + 4ef: fc d0 fb scle\.b \[r15\] + 4f2: fc d1 0b fc scle\.b 252\[r0\] + 4f6: fc d1 fb fc scle\.b 252\[r15\] + 4fa: fc d2 0b fc ff scle\.b 65532\[r0\] + 4ff: fc d2 fb fc ff scle\.b 65532\[r15\] + 504: fc d4 0b scle\.w \[r0\] + 507: fc d4 fb scle\.w \[r15\] + 50a: fc d5 0b 7e scle\.w 252\[r0\] + 50e: fc d5 fb 7e scle\.w 252\[r15\] + 512: fc d6 0b fe 7f scle\.w 65532\[r0\] + 517: fc d6 fb fe 7f scle\.w 65532\[r15\] + 51c: fc d8 0b scle\.l \[r0\] + 51f: fc d8 fb scle\.l \[r15\] + 522: fc d9 0b 3f scle\.l 252\[r0\] + 526: fc d9 fb 3f scle\.l 252\[r15\] + 52a: fc da 0b ff 3f scle\.l 65532\[r0\] + 52f: fc da fb ff 3f scle\.l 65532\[r15\] + 534: fc d0 0d scno\.b \[r0\] + 537: fc d0 fd scno\.b \[r15\] + 53a: fc d1 0d fc scno\.b 252\[r0\] + 53e: fc d1 fd fc scno\.b 252\[r15\] + 542: fc d2 0d fc ff scno\.b 65532\[r0\] + 547: fc d2 fd fc ff scno\.b 65532\[r15\] + 54c: fc d4 0d scno\.w \[r0\] + 54f: fc d4 fd scno\.w \[r15\] + 552: fc d5 0d 7e scno\.w 252\[r0\] + 556: fc d5 fd 7e scno\.w 252\[r15\] + 55a: fc d6 0d fe 7f scno\.w 65532\[r0\] + 55f: fc d6 fd fe 7f scno\.w 65532\[r15\] + 564: fc d8 0d scno\.l \[r0\] + 567: fc d8 fd scno\.l \[r15\] + 56a: fc d9 0d 3f scno\.l 252\[r0\] + 56e: fc d9 fd 3f scno\.l 252\[r15\] + 572: fc da 0d ff 3f scno\.l 65532\[r0\] + 577: fc da fd ff 3f scno\.l 65532\[r15\] diff --git a/gas/testsuite/gas/rx/sccnd.sm b/gas/testsuite/gas/rx/sccnd.sm new file mode 100644 index 0000000..7ad08f9 --- /dev/null +++ b/gas/testsuite/gas/rx/sccnd.sm @@ -0,0 +1,3 @@ + sc{cnd}.L {reg} + sc{cnd}{bwl} {mem} + diff --git a/gas/testsuite/gas/rx/scmpu.d b/gas/testsuite/gas/rx/scmpu.d new file mode 100644 index 0000000..b309e67 --- /dev/null +++ b/gas/testsuite/gas/rx/scmpu.d @@ -0,0 +1,9 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f 83 scmpu diff --git a/gas/testsuite/gas/rx/scmpu.sm b/gas/testsuite/gas/rx/scmpu.sm new file mode 100644 index 0000000..b00d177 --- /dev/null +++ b/gas/testsuite/gas/rx/scmpu.sm @@ -0,0 +1 @@ + scmpu diff --git a/gas/testsuite/gas/rx/setpsw.d b/gas/testsuite/gas/rx/setpsw.d new file mode 100644 index 0000000..a666758 --- /dev/null +++ b/gas/testsuite/gas/rx/setpsw.d @@ -0,0 +1,14 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f a9 setpsw u + 2: 7f a8 setpsw i + 4: 7f a3 setpsw o + 6: 7f a2 setpsw s + 8: 7f a1 setpsw z + a: 7f a0 setpsw c diff --git a/gas/testsuite/gas/rx/setpsw.sm b/gas/testsuite/gas/rx/setpsw.sm new file mode 100644 index 0000000..9c5445b --- /dev/null +++ b/gas/testsuite/gas/rx/setpsw.sm @@ -0,0 +1 @@ + setpsw {pswf} diff --git a/gas/testsuite/gas/rx/shar.d b/gas/testsuite/gas/rx/shar.d new file mode 100644 index 0000000..8398cc7 --- /dev/null +++ b/gas/testsuite/gas/rx/shar.d @@ -0,0 +1,24 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 6a 00 shar #0, r0 + 2: 6a 0f shar #0, r15 + 4: 6b f0 shar #31, r0 + 6: 6b ff shar #31, r15 + 8: fd 61 00 shar r0, r0 + b: fd 61 0f shar r0, r15 + e: fd 61 f0 shar r15, r0 + 11: fd 61 ff shar r15, r15 + 14: fd a0 00 shar #0, r0, r0 + 17: fd a0 0f shar #0, r0, r15 + 1a: fd a0 f0 shar #0, r15, r0 + 1d: fd a0 ff shar #0, r15, r15 + 20: fd bf 00 shar #31, r0, r0 + 23: fd bf 0f shar #31, r0, r15 + 26: fd bf f0 shar #31, r15, r0 + 29: fd bf ff shar #31, r15, r15 diff --git a/gas/testsuite/gas/rx/shar.sm b/gas/testsuite/gas/rx/shar.sm new file mode 100644 index 0000000..e2d2189 --- /dev/null +++ b/gas/testsuite/gas/rx/shar.sm @@ -0,0 +1,3 @@ + shar #{uimm5},{reg} + shar {reg},{reg} + shar #{uimm5},{reg},{reg} diff --git a/gas/testsuite/gas/rx/shll.d b/gas/testsuite/gas/rx/shll.d new file mode 100644 index 0000000..642c6fd --- /dev/null +++ b/gas/testsuite/gas/rx/shll.d @@ -0,0 +1,24 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 6c 00 shll #0, r0 + 2: 6c 0f shll #0, r15 + 4: 6d f0 shll #31, r0 + 6: 6d ff shll #31, r15 + 8: fd 62 00 shll r0, r0 + b: fd 62 0f shll r0, r15 + e: fd 62 f0 shll r15, r0 + 11: fd 62 ff shll r15, r15 + 14: fd c0 00 shll #0, r0, r0 + 17: fd c0 0f shll #0, r0, r15 + 1a: fd c0 f0 shll #0, r15, r0 + 1d: fd c0 ff shll #0, r15, r15 + 20: fd df 00 shll #31, r0, r0 + 23: fd df 0f shll #31, r0, r15 + 26: fd df f0 shll #31, r15, r0 + 29: fd df ff shll #31, r15, r15 diff --git a/gas/testsuite/gas/rx/shll.sm b/gas/testsuite/gas/rx/shll.sm new file mode 100644 index 0000000..e4544b1 --- /dev/null +++ b/gas/testsuite/gas/rx/shll.sm @@ -0,0 +1,3 @@ + shll #{uimm5},{reg} + shll {reg},{reg} + shll #{uimm5},{reg},{reg} diff --git a/gas/testsuite/gas/rx/shlr.d b/gas/testsuite/gas/rx/shlr.d new file mode 100644 index 0000000..1f4628c --- /dev/null +++ b/gas/testsuite/gas/rx/shlr.d @@ -0,0 +1,24 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 68 00 shlr #0, r0 + 2: 68 0f shlr #0, r15 + 4: 69 f0 shlr #31, r0 + 6: 69 ff shlr #31, r15 + 8: fd 60 00 shlr r0, r0 + b: fd 60 0f shlr r0, r15 + e: fd 60 f0 shlr r15, r0 + 11: fd 60 ff shlr r15, r15 + 14: fd 80 00 shlr #0, r0, r0 + 17: fd 80 0f shlr #0, r0, r15 + 1a: fd 80 f0 shlr #0, r15, r0 + 1d: fd 80 ff shlr #0, r15, r15 + 20: fd 9f 00 shlr #31, r0, r0 + 23: fd 9f 0f shlr #31, r0, r15 + 26: fd 9f f0 shlr #31, r15, r0 + 29: fd 9f ff shlr #31, r15, r15 diff --git a/gas/testsuite/gas/rx/shlr.sm b/gas/testsuite/gas/rx/shlr.sm new file mode 100644 index 0000000..1ce434f --- /dev/null +++ b/gas/testsuite/gas/rx/shlr.sm @@ -0,0 +1,3 @@ + shlr #{uimm5},{reg} + shlr {reg},{reg} + shlr #{uimm5},{reg},{reg} diff --git a/gas/testsuite/gas/rx/smovb.d b/gas/testsuite/gas/rx/smovb.d new file mode 100644 index 0000000..1a1d6f7 --- /dev/null +++ b/gas/testsuite/gas/rx/smovb.d @@ -0,0 +1,9 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f 8b smovb diff --git a/gas/testsuite/gas/rx/smovb.sm b/gas/testsuite/gas/rx/smovb.sm new file mode 100644 index 0000000..5197e8d --- /dev/null +++ b/gas/testsuite/gas/rx/smovb.sm @@ -0,0 +1 @@ + smovb diff --git a/gas/testsuite/gas/rx/smovf.d b/gas/testsuite/gas/rx/smovf.d new file mode 100644 index 0000000..160d7c2 --- /dev/null +++ b/gas/testsuite/gas/rx/smovf.d @@ -0,0 +1,9 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f 8f smovf diff --git a/gas/testsuite/gas/rx/smovf.sm b/gas/testsuite/gas/rx/smovf.sm new file mode 100644 index 0000000..0f36b84 --- /dev/null +++ b/gas/testsuite/gas/rx/smovf.sm @@ -0,0 +1 @@ + smovf diff --git a/gas/testsuite/gas/rx/smovu.d b/gas/testsuite/gas/rx/smovu.d new file mode 100644 index 0000000..029aeb9 --- /dev/null +++ b/gas/testsuite/gas/rx/smovu.d @@ -0,0 +1,9 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f 87 smovu diff --git a/gas/testsuite/gas/rx/smovu.sm b/gas/testsuite/gas/rx/smovu.sm new file mode 100644 index 0000000..a0c53e7 --- /dev/null +++ b/gas/testsuite/gas/rx/smovu.sm @@ -0,0 +1 @@ + smovu diff --git a/gas/testsuite/gas/rx/sstr.d b/gas/testsuite/gas/rx/sstr.d new file mode 100644 index 0000000..c6994b5 --- /dev/null +++ b/gas/testsuite/gas/rx/sstr.d @@ -0,0 +1,11 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f 88 sstr\.b + 2: 7f 89 sstr\.w + 4: 7f 8a sstr\.l diff --git a/gas/testsuite/gas/rx/sstr.sm b/gas/testsuite/gas/rx/sstr.sm new file mode 100644 index 0000000..e687395 --- /dev/null +++ b/gas/testsuite/gas/rx/sstr.sm @@ -0,0 +1 @@ + sstr{bwl} diff --git a/gas/testsuite/gas/rx/stnz.d b/gas/testsuite/gas/rx/stnz.d new file mode 100644 index 0000000..8dfb0c3 --- /dev/null +++ b/gas/testsuite/gas/rx/stnz.d @@ -0,0 +1,24 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 74 f0 80 stnz #-128, r0 + 4: fd 74 ff 80 stnz #-128, r15 + 8: fd 74 f0 7f stnz #127, r0 + c: fd 74 ff 7f stnz #127, r15 + 10: fd 78 f0 00 80 stnz #0xffff8000, r0 + 15: fd 78 ff 00 80 stnz #0xffff8000, r15 + 1a: fd 7c f0 00 80 00 stnz #0x8000, r0 + 20: fd 7c ff 00 80 00 stnz #0x8000, r15 + 26: fd 7c f0 00 00 80 stnz #0xff800000, r0 + 2c: fd 7c ff 00 00 80 stnz #0xff800000, r15 + 32: fd 7c f0 ff ff 7f stnz #0x7fffff, r0 + 38: fd 7c ff ff ff 7f stnz #0x7fffff, r15 + 3e: fd 70 f0 00 00 00 80 stnz #0x80000000, r0 + 45: fd 70 ff 00 00 00 80 stnz #0x80000000, r15 + 4c: fd 70 f0 ff ff ff 7f stnz #0x7fffffff, r0 + 53: fd 70 ff ff ff ff 7f stnz #0x7fffffff, r15 diff --git a/gas/testsuite/gas/rx/stnz.sm b/gas/testsuite/gas/rx/stnz.sm new file mode 100644 index 0000000..853f1ce --- /dev/null +++ b/gas/testsuite/gas/rx/stnz.sm @@ -0,0 +1 @@ + stnz #{imm},{reg} diff --git a/gas/testsuite/gas/rx/stz.d b/gas/testsuite/gas/rx/stz.d new file mode 100644 index 0000000..f9c6b77 --- /dev/null +++ b/gas/testsuite/gas/rx/stz.d @@ -0,0 +1,24 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 74 e0 80 stz #-128, r0 + 4: fd 74 ef 80 stz #-128, r15 + 8: fd 74 e0 7f stz #127, r0 + c: fd 74 ef 7f stz #127, r15 + 10: fd 78 e0 00 80 stz #0xffff8000, r0 + 15: fd 78 ef 00 80 stz #0xffff8000, r15 + 1a: fd 7c e0 00 80 00 stz #0x8000, r0 + 20: fd 7c ef 00 80 00 stz #0x8000, r15 + 26: fd 7c e0 00 00 80 stz #0xff800000, r0 + 2c: fd 7c ef 00 00 80 stz #0xff800000, r15 + 32: fd 7c e0 ff ff 7f stz #0x7fffff, r0 + 38: fd 7c ef ff ff 7f stz #0x7fffff, r15 + 3e: fd 70 e0 00 00 00 80 stz #0x80000000, r0 + 45: fd 70 ef 00 00 00 80 stz #0x80000000, r15 + 4c: fd 70 e0 ff ff ff 7f stz #0x7fffffff, r0 + 53: fd 70 ef ff ff ff 7f stz #0x7fffffff, r15 diff --git a/gas/testsuite/gas/rx/stz.sm b/gas/testsuite/gas/rx/stz.sm new file mode 100644 index 0000000..e366213 --- /dev/null +++ b/gas/testsuite/gas/rx/stz.sm @@ -0,0 +1 @@ + stz #{imm},{reg} diff --git a/gas/testsuite/gas/rx/sub.d b/gas/testsuite/gas/rx/sub.d new file mode 100644 index 0000000..af9ad29 --- /dev/null +++ b/gas/testsuite/gas/rx/sub.d @@ -0,0 +1,84 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 60 00 sub #0, r0 + 2: 60 0f sub #0, r15 + 4: 60 f0 sub #15, r0 + 6: 60 ff sub #15, r15 + 8: 43 00 sub r0, r0 + a: 43 0f sub r0, r15 + c: 43 f0 sub r15, r0 + e: 43 ff sub r15, r15 + 10: 40 00 sub \[r0\]\.ub, r0 + 12: 40 0f sub \[r0\]\.ub, r15 + 14: 06 00 00 sub \[r0\]\.b, r0 + 17: 06 00 0f sub \[r0\]\.b, r15 + 1a: 06 c0 00 sub \[r0\]\.uw, r0 + 1d: 06 c0 0f sub \[r0\]\.uw, r15 + 20: 06 40 00 sub \[r0\]\.w, r0 + 23: 06 40 0f sub \[r0\]\.w, r15 + 26: 06 80 00 sub \[r0\]\.l, r0 + 29: 06 80 0f sub \[r0\]\.l, r15 + 2c: 40 f0 sub \[r15\]\.ub, r0 + 2e: 40 ff sub \[r15\]\.ub, r15 + 30: 06 00 f0 sub \[r15\]\.b, r0 + 33: 06 00 ff sub \[r15\]\.b, r15 + 36: 06 c0 f0 sub \[r15\]\.uw, r0 + 39: 06 c0 ff sub \[r15\]\.uw, r15 + 3c: 06 40 f0 sub \[r15\]\.w, r0 + 3f: 06 40 ff sub \[r15\]\.w, r15 + 42: 06 80 f0 sub \[r15\]\.l, r0 + 45: 06 80 ff sub \[r15\]\.l, r15 + 48: 41 00 fc sub 252\[r0\]\.ub, r0 + 4b: 41 0f fc sub 252\[r0\]\.ub, r15 + 4e: 06 01 00 fc sub 252\[r0\]\.b, r0 + 52: 06 01 0f fc sub 252\[r0\]\.b, r15 + 56: 06 c1 00 7e sub 252\[r0\]\.uw, r0 + 5a: 06 c1 0f 7e sub 252\[r0\]\.uw, r15 + 5e: 06 41 00 7e sub 252\[r0\]\.w, r0 + 62: 06 41 0f 7e sub 252\[r0\]\.w, r15 + 66: 06 81 00 3f sub 252\[r0\]\.l, r0 + 6a: 06 81 0f 3f sub 252\[r0\]\.l, r15 + 6e: 41 f0 fc sub 252\[r15\]\.ub, r0 + 71: 41 ff fc sub 252\[r15\]\.ub, r15 + 74: 06 01 f0 fc sub 252\[r15\]\.b, r0 + 78: 06 01 ff fc sub 252\[r15\]\.b, r15 + 7c: 06 c1 f0 7e sub 252\[r15\]\.uw, r0 + 80: 06 c1 ff 7e sub 252\[r15\]\.uw, r15 + 84: 06 41 f0 7e sub 252\[r15\]\.w, r0 + 88: 06 41 ff 7e sub 252\[r15\]\.w, r15 + 8c: 06 81 f0 3f sub 252\[r15\]\.l, r0 + 90: 06 81 ff 3f sub 252\[r15\]\.l, r15 + 94: 42 00 fc ff sub 65532\[r0\]\.ub, r0 + 98: 42 0f fc ff sub 65532\[r0\]\.ub, r15 + 9c: 06 02 00 fc ff sub 65532\[r0\]\.b, r0 + a1: 06 02 0f fc ff sub 65532\[r0\]\.b, r15 + a6: 06 c2 00 fe 7f sub 65532\[r0\]\.uw, r0 + ab: 06 c2 0f fe 7f sub 65532\[r0\]\.uw, r15 + b0: 06 42 00 fe 7f sub 65532\[r0\]\.w, r0 + b5: 06 42 0f fe 7f sub 65532\[r0\]\.w, r15 + ba: 06 82 00 ff 3f sub 65532\[r0\]\.l, r0 + bf: 06 82 0f ff 3f sub 65532\[r0\]\.l, r15 + c4: 42 f0 fc ff sub 65532\[r15\]\.ub, r0 + c8: 42 ff fc ff sub 65532\[r15\]\.ub, r15 + cc: 06 02 f0 fc ff sub 65532\[r15\]\.b, r0 + d1: 06 02 ff fc ff sub 65532\[r15\]\.b, r15 + d6: 06 c2 f0 fe 7f sub 65532\[r15\]\.uw, r0 + db: 06 c2 ff fe 7f sub 65532\[r15\]\.uw, r15 + e0: 06 42 f0 fe 7f sub 65532\[r15\]\.w, r0 + e5: 06 42 ff fe 7f sub 65532\[r15\]\.w, r15 + ea: 06 82 f0 ff 3f sub 65532\[r15\]\.l, r0 + ef: 06 82 ff ff 3f sub 65532\[r15\]\.l, r15 + f4: ff 00 00 sub r0, r0, r0 + f7: ff 0f 00 sub r0, r0, r15 + fa: ff 00 0f sub r0, r15, r0 + fd: ff 0f 0f sub r0, r15, r15 + 100: ff 00 f0 sub r15, r0, r0 + 103: ff 0f f0 sub r15, r0, r15 + 106: ff 00 ff sub r15, r15, r0 + 109: ff 0f ff sub r15, r15, r15 diff --git a/gas/testsuite/gas/rx/sub.sm b/gas/testsuite/gas/rx/sub.sm new file mode 100644 index 0000000..f21d9d5 --- /dev/null +++ b/gas/testsuite/gas/rx/sub.sm @@ -0,0 +1,6 @@ + sub #{uimm4},{reg} + + sub {reg},{reg} + sub {memx},{reg} + + sub {reg},{reg},{reg} diff --git a/gas/testsuite/gas/rx/suntil.d b/gas/testsuite/gas/rx/suntil.d new file mode 100644 index 0000000..c7f4538 --- /dev/null +++ b/gas/testsuite/gas/rx/suntil.d @@ -0,0 +1,11 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f 80 suntil\.b + 2: 7f 81 suntil\.w + 4: 7f 82 suntil\.l diff --git a/gas/testsuite/gas/rx/suntil.sm b/gas/testsuite/gas/rx/suntil.sm new file mode 100644 index 0000000..5d849ea --- /dev/null +++ b/gas/testsuite/gas/rx/suntil.sm @@ -0,0 +1 @@ + suntil{bwl} diff --git a/gas/testsuite/gas/rx/swhile.d b/gas/testsuite/gas/rx/swhile.d new file mode 100644 index 0000000..2c3ea0d --- /dev/null +++ b/gas/testsuite/gas/rx/swhile.d @@ -0,0 +1,11 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f 84 swhile\.b + 2: 7f 85 swhile\.w + 4: 7f 86 swhile\.l diff --git a/gas/testsuite/gas/rx/swhile.sm b/gas/testsuite/gas/rx/swhile.sm new file mode 100644 index 0000000..bb5c742 --- /dev/null +++ b/gas/testsuite/gas/rx/swhile.sm @@ -0,0 +1 @@ + swhile{bwl} diff --git a/gas/testsuite/gas/rx/tst.d b/gas/testsuite/gas/rx/tst.d new file mode 100644 index 0000000..1aca363 --- /dev/null +++ b/gas/testsuite/gas/rx/tst.d @@ -0,0 +1,88 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 74 c0 80 tst #-128, r0 + 4: fd 74 cf 80 tst #-128, r15 + 8: fd 74 c0 7f tst #127, r0 + c: fd 74 cf 7f tst #127, r15 + 10: fd 78 c0 00 80 tst #0xffff8000, r0 + 15: fd 78 cf 00 80 tst #0xffff8000, r15 + 1a: fd 7c c0 00 80 00 tst #0x8000, r0 + 20: fd 7c cf 00 80 00 tst #0x8000, r15 + 26: fd 7c c0 00 00 80 tst #0xff800000, r0 + 2c: fd 7c cf 00 00 80 tst #0xff800000, r15 + 32: fd 7c c0 ff ff 7f tst #0x7fffff, r0 + 38: fd 7c cf ff ff 7f tst #0x7fffff, r15 + 3e: fd 70 c0 00 00 00 80 tst #0x80000000, r0 + 45: fd 70 cf 00 00 00 80 tst #0x80000000, r15 + 4c: fd 70 c0 ff ff ff 7f tst #0x7fffffff, r0 + 53: fd 70 cf ff ff ff 7f tst #0x7fffffff, r15 + 5a: fc 33 00 tst r0, r0 + 5d: fc 33 0f tst r0, r15 + 60: fc 33 f0 tst r15, r0 + 63: fc 33 ff tst r15, r15 + 66: fc 30 00 tst \[r0\]\.ub, r0 + 69: fc 30 0f tst \[r0\]\.ub, r15 + 6c: 06 20 0c 00 tst \[r0\]\.b, r0 + 70: 06 20 0c 0f tst \[r0\]\.b, r15 + 74: 06 e0 0c 00 tst \[r0\]\.uw, r0 + 78: 06 e0 0c 0f tst \[r0\]\.uw, r15 + 7c: 06 60 0c 00 tst \[r0\]\.w, r0 + 80: 06 60 0c 0f tst \[r0\]\.w, r15 + 84: 06 a0 0c 00 tst \[r0\]\.l, r0 + 88: 06 a0 0c 0f tst \[r0\]\.l, r15 + 8c: fc 30 f0 tst \[r15\]\.ub, r0 + 8f: fc 30 ff tst \[r15\]\.ub, r15 + 92: 06 20 0c f0 tst \[r15\]\.b, r0 + 96: 06 20 0c ff tst \[r15\]\.b, r15 + 9a: 06 e0 0c f0 tst \[r15\]\.uw, r0 + 9e: 06 e0 0c ff tst \[r15\]\.uw, r15 + a2: 06 60 0c f0 tst \[r15\]\.w, r0 + a6: 06 60 0c ff tst \[r15\]\.w, r15 + aa: 06 a0 0c f0 tst \[r15\]\.l, r0 + ae: 06 a0 0c ff tst \[r15\]\.l, r15 + b2: fc 31 00 fc tst 252\[r0\]\.ub, r0 + b6: fc 31 0f fc tst 252\[r0\]\.ub, r15 + ba: 06 21 0c 00 fc tst 252\[r0\]\.b, r0 + bf: 06 21 0c 0f fc tst 252\[r0\]\.b, r15 + c4: 06 e1 0c 00 7e tst 252\[r0\]\.uw, r0 + c9: 06 e1 0c 0f 7e tst 252\[r0\]\.uw, r15 + ce: 06 61 0c 00 7e tst 252\[r0\]\.w, r0 + d3: 06 61 0c 0f 7e tst 252\[r0\]\.w, r15 + d8: 06 a1 0c 00 3f tst 252\[r0\]\.l, r0 + dd: 06 a1 0c 0f 3f tst 252\[r0\]\.l, r15 + e2: fc 31 f0 fc tst 252\[r15\]\.ub, r0 + e6: fc 31 ff fc tst 252\[r15\]\.ub, r15 + ea: 06 21 0c f0 fc tst 252\[r15\]\.b, r0 + ef: 06 21 0c ff fc tst 252\[r15\]\.b, r15 + f4: 06 e1 0c f0 7e tst 252\[r15\]\.uw, r0 + f9: 06 e1 0c ff 7e tst 252\[r15\]\.uw, r15 + fe: 06 61 0c f0 7e tst 252\[r15\]\.w, r0 + 103: 06 61 0c ff 7e tst 252\[r15\]\.w, r15 + 108: 06 a1 0c f0 3f tst 252\[r15\]\.l, r0 + 10d: 06 a1 0c ff 3f tst 252\[r15\]\.l, r15 + 112: fc 32 00 fc ff tst 65532\[r0\]\.ub, r0 + 117: fc 32 0f fc ff tst 65532\[r0\]\.ub, r15 + 11c: 06 22 0c 00 fc ff tst 65532\[r0\]\.b, r0 + 122: 06 22 0c 0f fc ff tst 65532\[r0\]\.b, r15 + 128: 06 e2 0c 00 fe 7f tst 65532\[r0\]\.uw, r0 + 12e: 06 e2 0c 0f fe 7f tst 65532\[r0\]\.uw, r15 + 134: 06 62 0c 00 fe 7f tst 65532\[r0\]\.w, r0 + 13a: 06 62 0c 0f fe 7f tst 65532\[r0\]\.w, r15 + 140: 06 a2 0c 00 ff 3f tst 65532\[r0\]\.l, r0 + 146: 06 a2 0c 0f ff 3f tst 65532\[r0\]\.l, r15 + 14c: fc 32 f0 fc ff tst 65532\[r15\]\.ub, r0 + 151: fc 32 ff fc ff tst 65532\[r15\]\.ub, r15 + 156: 06 22 0c f0 fc ff tst 65532\[r15\]\.b, r0 + 15c: 06 22 0c ff fc ff tst 65532\[r15\]\.b, r15 + 162: 06 e2 0c f0 fe 7f tst 65532\[r15\]\.uw, r0 + 168: 06 e2 0c ff fe 7f tst 65532\[r15\]\.uw, r15 + 16e: 06 62 0c f0 fe 7f tst 65532\[r15\]\.w, r0 + 174: 06 62 0c ff fe 7f tst 65532\[r15\]\.w, r15 + 17a: 06 a2 0c f0 ff 3f tst 65532\[r15\]\.l, r0 + 180: 06 a2 0c ff ff 3f tst 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/tst.sm b/gas/testsuite/gas/rx/tst.sm new file mode 100644 index 0000000..ab194fd --- /dev/null +++ b/gas/testsuite/gas/rx/tst.sm @@ -0,0 +1,4 @@ + tst #{imm},{reg} + + tst {reg},{reg} + tst {memx},{reg} diff --git a/gas/testsuite/gas/rx/wait.d b/gas/testsuite/gas/rx/wait.d new file mode 100644 index 0000000..7dc8254 --- /dev/null +++ b/gas/testsuite/gas/rx/wait.d @@ -0,0 +1,9 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: 7f 96 wait diff --git a/gas/testsuite/gas/rx/wait.sm b/gas/testsuite/gas/rx/wait.sm new file mode 100644 index 0000000..4795dee --- /dev/null +++ b/gas/testsuite/gas/rx/wait.sm @@ -0,0 +1 @@ + wait diff --git a/gas/testsuite/gas/rx/xchg.d b/gas/testsuite/gas/rx/xchg.d new file mode 100644 index 0000000..5364078 --- /dev/null +++ b/gas/testsuite/gas/rx/xchg.d @@ -0,0 +1,72 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fc 43 00 xchg r0, r0 + 3: fc 43 0f xchg r0, r15 + 6: fc 43 f0 xchg r15, r0 + 9: fc 43 ff xchg r15, r15 + c: fc 40 00 xchg \[r0\]\.ub, r0 + f: fc 40 0f xchg \[r0\]\.ub, r15 + 12: 06 20 10 00 xchg \[r0\]\.b, r0 + 16: 06 20 10 0f xchg \[r0\]\.b, r15 + 1a: 06 e0 10 00 xchg \[r0\]\.uw, r0 + 1e: 06 e0 10 0f xchg \[r0\]\.uw, r15 + 22: 06 60 10 00 xchg \[r0\]\.w, r0 + 26: 06 60 10 0f xchg \[r0\]\.w, r15 + 2a: 06 a0 10 00 xchg \[r0\]\.l, r0 + 2e: 06 a0 10 0f xchg \[r0\]\.l, r15 + 32: fc 40 f0 xchg \[r15\]\.ub, r0 + 35: fc 40 ff xchg \[r15\]\.ub, r15 + 38: 06 20 10 f0 xchg \[r15\]\.b, r0 + 3c: 06 20 10 ff xchg \[r15\]\.b, r15 + 40: 06 e0 10 f0 xchg \[r15\]\.uw, r0 + 44: 06 e0 10 ff xchg \[r15\]\.uw, r15 + 48: 06 60 10 f0 xchg \[r15\]\.w, r0 + 4c: 06 60 10 ff xchg \[r15\]\.w, r15 + 50: 06 a0 10 f0 xchg \[r15\]\.l, r0 + 54: 06 a0 10 ff xchg \[r15\]\.l, r15 + 58: fc 41 00 fc xchg 252\[r0\]\.ub, r0 + 5c: fc 41 0f fc xchg 252\[r0\]\.ub, r15 + 60: 06 21 10 00 fc xchg 252\[r0\]\.b, r0 + 65: 06 21 10 0f fc xchg 252\[r0\]\.b, r15 + 6a: 06 e1 10 00 7e xchg 252\[r0\]\.uw, r0 + 6f: 06 e1 10 0f 7e xchg 252\[r0\]\.uw, r15 + 74: 06 61 10 00 7e xchg 252\[r0\]\.w, r0 + 79: 06 61 10 0f 7e xchg 252\[r0\]\.w, r15 + 7e: 06 a1 10 00 3f xchg 252\[r0\]\.l, r0 + 83: 06 a1 10 0f 3f xchg 252\[r0\]\.l, r15 + 88: fc 41 f0 fc xchg 252\[r15\]\.ub, r0 + 8c: fc 41 ff fc xchg 252\[r15\]\.ub, r15 + 90: 06 21 10 f0 fc xchg 252\[r15\]\.b, r0 + 95: 06 21 10 ff fc xchg 252\[r15\]\.b, r15 + 9a: 06 e1 10 f0 7e xchg 252\[r15\]\.uw, r0 + 9f: 06 e1 10 ff 7e xchg 252\[r15\]\.uw, r15 + a4: 06 61 10 f0 7e xchg 252\[r15\]\.w, r0 + a9: 06 61 10 ff 7e xchg 252\[r15\]\.w, r15 + ae: 06 a1 10 f0 3f xchg 252\[r15\]\.l, r0 + b3: 06 a1 10 ff 3f xchg 252\[r15\]\.l, r15 + b8: fc 42 00 fc ff xchg 65532\[r0\]\.ub, r0 + bd: fc 42 0f fc ff xchg 65532\[r0\]\.ub, r15 + c2: 06 22 10 00 fc ff xchg 65532\[r0\]\.b, r0 + c8: 06 22 10 0f fc ff xchg 65532\[r0\]\.b, r15 + ce: 06 e2 10 00 fe 7f xchg 65532\[r0\]\.uw, r0 + d4: 06 e2 10 0f fe 7f xchg 65532\[r0\]\.uw, r15 + da: 06 62 10 00 fe 7f xchg 65532\[r0\]\.w, r0 + e0: 06 62 10 0f fe 7f xchg 65532\[r0\]\.w, r15 + e6: 06 a2 10 00 ff 3f xchg 65532\[r0\]\.l, r0 + ec: 06 a2 10 0f ff 3f xchg 65532\[r0\]\.l, r15 + f2: fc 42 f0 fc ff xchg 65532\[r15\]\.ub, r0 + f7: fc 42 ff fc ff xchg 65532\[r15\]\.ub, r15 + fc: 06 22 10 f0 fc ff xchg 65532\[r15\]\.b, r0 + 102: 06 22 10 ff fc ff xchg 65532\[r15\]\.b, r15 + 108: 06 e2 10 f0 fe 7f xchg 65532\[r15\]\.uw, r0 + 10e: 06 e2 10 ff fe 7f xchg 65532\[r15\]\.uw, r15 + 114: 06 62 10 f0 fe 7f xchg 65532\[r15\]\.w, r0 + 11a: 06 62 10 ff fe 7f xchg 65532\[r15\]\.w, r15 + 120: 06 a2 10 f0 ff 3f xchg 65532\[r15\]\.l, r0 + 126: 06 a2 10 ff ff 3f xchg 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/xchg.sm b/gas/testsuite/gas/rx/xchg.sm new file mode 100644 index 0000000..8eb12b2 --- /dev/null +++ b/gas/testsuite/gas/rx/xchg.sm @@ -0,0 +1,2 @@ + xchg {reg},{reg} + xchg {memx},{reg} diff --git a/gas/testsuite/gas/rx/xor.d b/gas/testsuite/gas/rx/xor.d new file mode 100644 index 0000000..fb99bce --- /dev/null +++ b/gas/testsuite/gas/rx/xor.d @@ -0,0 +1,88 @@ +#objdump: -dr + +dump\.o: file format .* + + +Disassembly of section \.text: + +00000000 <\.text>: + 0: fd 74 d0 80 xor #-128, r0 + 4: fd 74 df 80 xor #-128, r15 + 8: fd 74 d0 7f xor #127, r0 + c: fd 74 df 7f xor #127, r15 + 10: fd 78 d0 00 80 xor #0xffff8000, r0 + 15: fd 78 df 00 80 xor #0xffff8000, r15 + 1a: fd 7c d0 00 80 00 xor #0x8000, r0 + 20: fd 7c df 00 80 00 xor #0x8000, r15 + 26: fd 7c d0 00 00 80 xor #0xff800000, r0 + 2c: fd 7c df 00 00 80 xor #0xff800000, r15 + 32: fd 7c d0 ff ff 7f xor #0x7fffff, r0 + 38: fd 7c df ff ff 7f xor #0x7fffff, r15 + 3e: fd 70 d0 00 00 00 80 xor #0x80000000, r0 + 45: fd 70 df 00 00 00 80 xor #0x80000000, r15 + 4c: fd 70 d0 ff ff ff 7f xor #0x7fffffff, r0 + 53: fd 70 df ff ff ff 7f xor #0x7fffffff, r15 + 5a: fc 37 00 xor r0, r0 + 5d: fc 37 0f xor r0, r15 + 60: fc 37 f0 xor r15, r0 + 63: fc 37 ff xor r15, r15 + 66: fc 34 00 xor \[r0\]\.ub, r0 + 69: fc 34 0f xor \[r0\]\.ub, r15 + 6c: 06 20 0d 00 xor \[r0\]\.b, r0 + 70: 06 20 0d 0f xor \[r0\]\.b, r15 + 74: 06 e0 0d 00 xor \[r0\]\.uw, r0 + 78: 06 e0 0d 0f xor \[r0\]\.uw, r15 + 7c: 06 60 0d 00 xor \[r0\]\.w, r0 + 80: 06 60 0d 0f xor \[r0\]\.w, r15 + 84: 06 a0 0d 00 xor \[r0\]\.l, r0 + 88: 06 a0 0d 0f xor \[r0\]\.l, r15 + 8c: fc 34 f0 xor \[r15\]\.ub, r0 + 8f: fc 34 ff xor \[r15\]\.ub, r15 + 92: 06 20 0d f0 xor \[r15\]\.b, r0 + 96: 06 20 0d ff xor \[r15\]\.b, r15 + 9a: 06 e0 0d f0 xor \[r15\]\.uw, r0 + 9e: 06 e0 0d ff xor \[r15\]\.uw, r15 + a2: 06 60 0d f0 xor \[r15\]\.w, r0 + a6: 06 60 0d ff xor \[r15\]\.w, r15 + aa: 06 a0 0d f0 xor \[r15\]\.l, r0 + ae: 06 a0 0d ff xor \[r15\]\.l, r15 + b2: fc 35 00 fc xor 252\[r0\]\.ub, r0 + b6: fc 35 0f fc xor 252\[r0\]\.ub, r15 + ba: 06 21 0d 00 fc xor 252\[r0\]\.b, r0 + bf: 06 21 0d 0f fc xor 252\[r0\]\.b, r15 + c4: 06 e1 0d 00 7e xor 252\[r0\]\.uw, r0 + c9: 06 e1 0d 0f 7e xor 252\[r0\]\.uw, r15 + ce: 06 61 0d 00 7e xor 252\[r0\]\.w, r0 + d3: 06 61 0d 0f 7e xor 252\[r0\]\.w, r15 + d8: 06 a1 0d 00 3f xor 252\[r0\]\.l, r0 + dd: 06 a1 0d 0f 3f xor 252\[r0\]\.l, r15 + e2: fc 35 f0 fc xor 252\[r15\]\.ub, r0 + e6: fc 35 ff fc xor 252\[r15\]\.ub, r15 + ea: 06 21 0d f0 fc xor 252\[r15\]\.b, r0 + ef: 06 21 0d ff fc xor 252\[r15\]\.b, r15 + f4: 06 e1 0d f0 7e xor 252\[r15\]\.uw, r0 + f9: 06 e1 0d ff 7e xor 252\[r15\]\.uw, r15 + fe: 06 61 0d f0 7e xor 252\[r15\]\.w, r0 + 103: 06 61 0d ff 7e xor 252\[r15\]\.w, r15 + 108: 06 a1 0d f0 3f xor 252\[r15\]\.l, r0 + 10d: 06 a1 0d ff 3f xor 252\[r15\]\.l, r15 + 112: fc 36 00 fc ff xor 65532\[r0\]\.ub, r0 + 117: fc 36 0f fc ff xor 65532\[r0\]\.ub, r15 + 11c: 06 22 0d 00 fc ff xor 65532\[r0\]\.b, r0 + 122: 06 22 0d 0f fc ff xor 65532\[r0\]\.b, r15 + 128: 06 e2 0d 00 fe 7f xor 65532\[r0\]\.uw, r0 + 12e: 06 e2 0d 0f fe 7f xor 65532\[r0\]\.uw, r15 + 134: 06 62 0d 00 fe 7f xor 65532\[r0\]\.w, r0 + 13a: 06 62 0d 0f fe 7f xor 65532\[r0\]\.w, r15 + 140: 06 a2 0d 00 ff 3f xor 65532\[r0\]\.l, r0 + 146: 06 a2 0d 0f ff 3f xor 65532\[r0\]\.l, r15 + 14c: fc 36 f0 fc ff xor 65532\[r15\]\.ub, r0 + 151: fc 36 ff fc ff xor 65532\[r15\]\.ub, r15 + 156: 06 22 0d f0 fc ff xor 65532\[r15\]\.b, r0 + 15c: 06 22 0d ff fc ff xor 65532\[r15\]\.b, r15 + 162: 06 e2 0d f0 fe 7f xor 65532\[r15\]\.uw, r0 + 168: 06 e2 0d ff fe 7f xor 65532\[r15\]\.uw, r15 + 16e: 06 62 0d f0 fe 7f xor 65532\[r15\]\.w, r0 + 174: 06 62 0d ff fe 7f xor 65532\[r15\]\.w, r15 + 17a: 06 a2 0d f0 ff 3f xor 65532\[r15\]\.l, r0 + 180: 06 a2 0d ff ff 3f xor 65532\[r15\]\.l, r15 diff --git a/gas/testsuite/gas/rx/xor.sm b/gas/testsuite/gas/rx/xor.sm new file mode 100644 index 0000000..591d352 --- /dev/null +++ b/gas/testsuite/gas/rx/xor.sm @@ -0,0 +1,4 @@ + xor #{imm},{reg} + + xor {reg},{reg} + xor {memx},{reg} diff --git a/include/ChangeLog b/include/ChangeLog index db95d46..7e8f345 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2009-09-29 DJ Delorie + + * dis-asm.h: Add prototype for print_insn_rx. + 2009-09-25 Dodji Seketeli * dwarf2.h (enum dwarf_tag): Rename DW_TAG_template_parameter_pack and diff --git a/include/dis-asm.h b/include/dis-asm.h index 47236a0..3d126be 100644 --- a/include/dis-asm.h +++ b/include/dis-asm.h @@ -296,6 +296,7 @@ extern int print_insn_xtensa (bfd_vma, disassemble_info *); extern int print_insn_z80 (bfd_vma, disassemble_info *); extern int print_insn_z8001 (bfd_vma, disassemble_info *); extern int print_insn_z8002 (bfd_vma, disassemble_info *); +extern int print_insn_rx (bfd_vma, disassemble_info *); extern disassembler_ftype arc_get_disassembler (void *); extern disassembler_ftype cris_get_disassembler (bfd *); diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog index a33fb84..3841f35 100644 --- a/include/elf/ChangeLog +++ b/include/elf/ChangeLog @@ -1,3 +1,7 @@ +2009-09-29 DJ Delorie + + * rx.h: New file. + 2009-09-21 Alan Modra * ppc.h (DT_PPC_TLSOPT): Define. diff --git a/include/elf/rx.h b/include/elf/rx.h new file mode 100644 index 0000000..1e04f3f --- /dev/null +++ b/include/elf/rx.h @@ -0,0 +1,134 @@ +/* RX ELF support for BFD. + Copyright (C) 2008, 2009 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, Inc., + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _ELF_RX_H +#define _ELF_RX_H + +#include "elf/reloc-macros.h" + +/* Note that there are a few internal relocation types used by the + linker to do link-time relaxation. If you update this file, please + check elf32-rx.c to see if any of the internal relocations need to + be, er, relocated. */ + +/* Preliminary relocations. */ +START_RELOC_NUMBERS (elf_rx_reloc_type) + + RELOC_NUMBER (R_RX_NONE, 0x00) + /* These are for data, and are bi-endian. */ + RELOC_NUMBER (R_RX_DIR32, 0x01) /* Was: R_RX_32. */ + RELOC_NUMBER (R_RX_DIR24S, 0x02) /* Was: R_RX_24. */ + RELOC_NUMBER (R_RX_DIR16, 0x03) + RELOC_NUMBER (R_RX_DIR16U, 0x04) /* Was: R_RX_16_UNS. */ + RELOC_NUMBER (R_RX_DIR16S, 0x05) /* Was: R_RX_16. */ + RELOC_NUMBER (R_RX_DIR8, 0x06) + RELOC_NUMBER (R_RX_DIR8U, 0x07) /* Was: R_RX_8_UNS. */ + RELOC_NUMBER (R_RX_DIR8S, 0x08) /* Was: R_RX_8. */ + + /* Signed pc-relative values. */ + RELOC_NUMBER (R_RX_DIR24S_PCREL, 0x09) /* Was: R_RX_24_PCREL. */ + RELOC_NUMBER (R_RX_DIR16S_PCREL, 0x0a) /* Was: R_RX_16_PCREL. */ + RELOC_NUMBER (R_RX_DIR8S_PCREL, 0x0b) /* Was: R_RX_8_PCREL. */ + + /* These are for fields in the instructions. */ + RELOC_NUMBER (R_RX_DIR16UL, 0x0c) + RELOC_NUMBER (R_RX_DIR16UW, 0x0d) + RELOC_NUMBER (R_RX_DIR8UL, 0x0e) + RELOC_NUMBER (R_RX_DIR8UW, 0x0f) + RELOC_NUMBER (R_RX_DIR32_REV, 0x10) + RELOC_NUMBER (R_RX_DIR16_REV, 0x11) + RELOC_NUMBER (R_RX_DIR3U_PCREL, 0x12) + + /* These are extensions added by Red Hat. */ + RELOC_NUMBER (R_RX_RH_3_PCREL, 0x20) /* Like R_RX_DIR8S_PCREL but only 3-bits. */ + RELOC_NUMBER (R_RX_RH_16_OP, 0x21) /* Like R_RX_DIR16 but for opcodes - always big endian. */ + RELOC_NUMBER (R_RX_RH_24_OP, 0x22) /* Like R_RX_DIR24S but for opcodes - always big endian. */ + RELOC_NUMBER (R_RX_RH_32_OP, 0x23) /* Like R_RX_DIR32 but for opcodes - always big endian. */ + RELOC_NUMBER (R_RX_RH_24_UNS, 0x24) /* Like R_RX_DIR24S but for unsigned values. */ + RELOC_NUMBER (R_RX_RH_8_NEG, 0x25) /* Like R_RX_DIR8 but -x is stored. */ + RELOC_NUMBER (R_RX_RH_16_NEG, 0x26) /* Like R_RX_DIR16 but -x is stored. */ + RELOC_NUMBER (R_RX_RH_24_NEG, 0x27) /* Like R_RX_DIR24S but -x is stored. */ + RELOC_NUMBER (R_RX_RH_32_NEG, 0x28) /* Like R_RX_DIR32 but -x is stored. */ + RELOC_NUMBER (R_RX_RH_DIFF, 0x29) /* Subtract from a previous relocation. */ + RELOC_NUMBER (R_RX_RH_GPRELB, 0x2a) /* Byte value, relative to __gp. */ + RELOC_NUMBER (R_RX_RH_GPRELW, 0x2b) /* Word value, relative to __gp. */ + RELOC_NUMBER (R_RX_RH_GPRELL, 0x2c) /* Long value, relative to __gp. */ + RELOC_NUMBER (R_RX_RH_RELAX, 0x2d) /* Marks opcodes suitable for linker relaxation. */ + + /* These are for complex relocs. */ + RELOC_NUMBER (R_RX_ABS32, 0x41) + RELOC_NUMBER (R_RX_ABS24S, 0x42) + RELOC_NUMBER (R_RX_ABS16, 0x43) + RELOC_NUMBER (R_RX_ABS16U, 0x44) + RELOC_NUMBER (R_RX_ABS16S, 0x45) + RELOC_NUMBER (R_RX_ABS8, 0x46) + RELOC_NUMBER (R_RX_ABS8U, 0x47) + RELOC_NUMBER (R_RX_ABS8S, 0x48) + RELOC_NUMBER (R_RX_ABS24S_PCREL, 0x49) + RELOC_NUMBER (R_RX_ABS16S_PCREL, 0x4a) + RELOC_NUMBER (R_RX_ABS8S_PCREL, 0x4b) + RELOC_NUMBER (R_RX_ABS16UL, 0x4c) + RELOC_NUMBER (R_RX_ABS16UW, 0x4d) + RELOC_NUMBER (R_RX_ABS8UL, 0x4e) + RELOC_NUMBER (R_RX_ABS8UW, 0x4f) + RELOC_NUMBER (R_RX_ABS32_REV, 0x50) + RELOC_NUMBER (R_RX_ABS16_REV, 0x51) + + RELOC_NUMBER (R_RX_SYM, 0x80) + RELOC_NUMBER (R_RX_OPneg, 0x81) + RELOC_NUMBER (R_RX_OPadd, 0x82) + RELOC_NUMBER (R_RX_OPsub, 0x83) + RELOC_NUMBER (R_RX_OPmul, 0x84) + RELOC_NUMBER (R_RX_OPdiv, 0x85) + RELOC_NUMBER (R_RX_OPshla, 0x86) + RELOC_NUMBER (R_RX_OPshra, 0x87) + RELOC_NUMBER (R_RX_OPsctsize, 0x88) + RELOC_NUMBER (R_RX_OPscttop, 0x8d) + RELOC_NUMBER (R_RX_OPand, 0x90) + RELOC_NUMBER (R_RX_OPor, 0x91) + RELOC_NUMBER (R_RX_OPxor, 0x92) + RELOC_NUMBER (R_RX_OPnot, 0x93) + RELOC_NUMBER (R_RX_OPmod, 0x94) + RELOC_NUMBER (R_RX_OPromtop, 0x95) + RELOC_NUMBER (R_RX_OPramtop, 0x96) + +END_RELOC_NUMBERS (R_RX_max) + +#define EF_RX_CPU_RX 0x00000079 /* FIXME: correct value? */ +#define EF_RX_CPU_MASK 0x0000007F /* specific cpu bits. */ +#define EF_RX_ALL_FLAGS (EF_RX_CPU_MASK) + +/* Values for the e_flags field in the ELF header. */ +#define E_FLAG_RX_64BIT_DOUBLES (1 << 0) +#define E_FLAG_RX_DSP (1 << 1) /* Defined in the RX CPU Object file specification, but not explained. */ + +/* These define the addend field of R_RX_RH_RELAX relocations. */ +#define RX_RELAXA_IMM6 0x00000010 /* Imm8/16/24/32 at bit offset 6. */ +#define RX_RELAXA_IMM12 0x00000020 /* Imm8/16/24/32 at bit offset 12. */ +#define RX_RELAXA_DSP4 0x00000040 /* Dsp0/8/16 at bit offset 4. */ +#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. */ +/* 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. */ +#define RX_RELAXA_ANUM 0x00ffffff /* Alignment amount, in bytes (i.e. .balign). */ + +#endif /* _ELF_RX_H */ diff --git a/include/opcode/ChangeLog b/include/opcode/ChangeLog index 29f717b..2fddcdf 100644 --- a/include/opcode/ChangeLog +++ b/include/opcode/ChangeLog @@ -1,3 +1,7 @@ +2009-09-29 DJ Delorie + + * rx.h: New file. + 2009-09-22 Peter Bergner * ppc.h (ppc_cpu_t): Typedef to uint64_t. diff --git a/include/opcode/rx.h b/include/opcode/rx.h new file mode 100644 index 0000000..7081ccc --- /dev/null +++ b/include/opcode/rx.h @@ -0,0 +1,218 @@ +/* Opcode decoder for the Renesas RX + Copyright 2008, 2009 + Free Software Foundation, Inc. + Written by DJ Delorie + + This file is part of GDB, the GNU Debugger and GAS, the GNU Assembler. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +/* 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. */ + +typedef enum +{ + RX_AnySize = 0, + RX_Byte, /* undefined extension */ + RX_UByte, + RX_SByte, + RX_Word, /* undefined extension */ + RX_UWord, + RX_SWord, + RX_3Byte, + RX_Long, +} RX_Size; + +typedef enum +{ + RX_Operand_None, + RX_Operand_Immediate, /* #addend */ + RX_Operand_Register, /* Rn */ + RX_Operand_Indirect, /* [Rn + addend] */ + RX_Operand_Postinc, /* [Rn+] */ + RX_Operand_Predec, /* [-Rn] */ + RX_Operand_Condition, /* eq, gtu, etc */ + RX_Operand_Flag, /* [UIOSZC] */ +} RX_Operand_Type; + +typedef enum +{ + RXO_unknown, + RXO_mov, /* d = s (signed) */ + RXO_movbi, /* d = [s,s2] (signed) */ + RXO_movbir, /* [s,s2] = d (signed) */ + RXO_pushm, /* s..s2 */ + RXO_popm, /* s..s2 */ + RXO_pusha, /* &s */ + RXO_xchg, /* s <-> d */ + RXO_stcc, /* d = s if cond(s2) */ + RXO_rtsd, /* rtsd, 1=imm, 2-0 = reg if reg type */ + + /* These are all either d OP= s or, if s2 is set, d = s OP s2. Note + that d may be "None". */ + RXO_and, + RXO_or, + RXO_xor, + RXO_add, + RXO_sub, + RXO_mul, + RXO_div, + RXO_divu, + RXO_shll, + RXO_shar, + RXO_shlr, + + RXO_adc, /* d = d + s + carry */ + RXO_sbb, /* d = d - s - ~carry */ + RXO_abs, /* d = |s| */ + RXO_max, /* d = max(d,s) */ + RXO_min, /* d = min(d,s) */ + RXO_emul, /* d:64 = d:32 * s */ + RXO_emulu, /* d:64 = d:32 * s (unsigned) */ + RXO_ediv, /* d:64 / s; d = quot, d+1 = rem */ + RXO_edivu, /* d:64 / s; d = quot, d+1 = rem */ + + RXO_rolc, /* d <<= 1 through carry */ + RXO_rorc, /* d >>= 1 through carry*/ + RXO_rotl, /* d <<= #s without carry */ + RXO_rotr, /* d >>= #s without carry*/ + RXO_revw, /* d = revw(s) */ + RXO_revl, /* d = revl(s) */ + RXO_branch, /* pc = d if cond(s) */ + RXO_branchrel,/* pc += d if cond(s) */ + RXO_jsr, /* pc = d */ + RXO_jsrrel, /* pc += d */ + RXO_rts, + RXO_nop, + + RXO_scmpu, + RXO_smovu, + RXO_smovb, + RXO_suntil, + RXO_swhile, + RXO_smovf, + RXO_sstr, + + RXO_rmpa, + RXO_mulhi, + RXO_mullo, + RXO_machi, + RXO_maclo, + RXO_mvtachi, + RXO_mvtaclo, + RXO_mvfachi, + RXO_mvfacmi, + RXO_mvfaclo, + RXO_racw, + + RXO_sat, /* sat(d) */ + RXO_satr, + + RXO_fadd, /* d op= s */ + RXO_fcmp, + RXO_fsub, + RXO_ftoi, + RXO_fmul, + RXO_fdiv, + RXO_round, + RXO_itof, + + RXO_bset, /* d |= (1< = cond(s2) */ + + RXO_clrpsw, /* flag index in d */ + RXO_setpsw, /* flag index in d */ + + RXO_mvtcp, /* cop# in s2, cop[d] = s */ + RXO_mvfcp, /* cop# in s2, d = cop[s] */ + RXO_opecp, /* cop# in s2, do cop[s] */ + + RXO_rtfi, + RXO_rte, + RXO_rtd, /* undocumented */ + RXO_brk, + RXO_dbt, /* undocumented */ + RXO_int, /* vector id in s */ + RXO_stop, + RXO_wait, + + RXO_sccnd, /* d = cond(s) ? 1 : 0 */ +} RX_Opcode_ID; + +/* Condition bitpatterns, as registers. */ +#define RXC_eq 0 +#define RXC_z 0 +#define RXC_ne 1 +#define RXC_nz 1 +#define RXC_c 2 +#define RXC_nc 3 +#define RXC_gtu 4 +#define RXC_leu 5 +#define RXC_pz 6 +#define RXC_n 7 +#define RXC_ge 8 +#define RXC_lt 9 +#define RXC_gt 10 +#define RXC_le 11 +#define RXC_o 12 +#define RXC_no 13 +#define RXC_always 14 +#define RXC_never 15 + +typedef struct +{ + RX_Operand_Type type; + int reg; + int addend; + RX_Size size; +} RX_Opcode_Operand; + +typedef struct +{ + RX_Opcode_ID id; + int n_bytes; + int prefix; + char * syntax; + RX_Size size; + /* By convention, these are destination, source1, source2. */ + RX_Opcode_Operand op[3]; + + /* The logic here is: + newflags = (oldflags & ~(int)flags_0) | flags_1 | (op_flags & flags_s) + Only the O, S, Z, and C flags are affected. */ + char flags_0; /* This also clears out flags-to-be-set. */ + char flags_1; + char flags_s; +} RX_Opcode_Decoded; + +/* Within the syntax, %c-style format specifiers are as follows: + + %% = '%' character + %0 = operand[0] (destination) + %1 = operand[1] (source) + %2 = operand[2] (2nd source) + %s = operation size (b/w/l) + %SN = operand size [N] (N=0,1,2) + %aN = op[N] as an address (N=0,1,2) + + 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 *); diff --git a/ld/ChangeLog b/ld/ChangeLog index 6658a7d..a35039b 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2009-09-29 DJ Delorie + + * Makefile.am: Add rules to build RX emulation. + * configure.tgt: Likewise. + * NEWS: Mention support for RX architecture. + * Makefile.in: Regenerate. + * emulparams/elf32rx.sh: New file. + * emultempl/rxelf.em: New file. + 2009-09-29 Alan Modra * ldlang.c (lang_size_sections_1): Allow scripts to specify a diff --git a/ld/Makefile.am b/ld/Makefile.am index 7c4444b..5feebf3 100644 --- a/ld/Makefile.am +++ b/ld/Makefile.am @@ -209,6 +209,7 @@ ALL_EMULATIONS = \ eelf32ppcsim.o \ eelf32ppcwindiss.o \ eelf32ppcvxworks.o \ + eelf32rx.o \ eelf32vax.o \ eelf32xc16x.o \ eelf32xc16xl.o \ @@ -787,6 +788,10 @@ eelf32xstormy16.c: $(srcdir)/emulparams/elf32xstormy16.sh \ eelf32am33lin.c: $(srcdir)/emulparams/elf32am33lin.sh \ $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf32am33lin "$(tdir_mn10300)" +eelf32rx.c: $(srcdir)/emulparams/elf32rx.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf32rx "$(tdir_elf32rx)" + @true end-sanitize-rx eelf32vax.c: $(srcdir)/emulparams/elf32vax.sh \ $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf32vax "$(tdir_elf32vax)" diff --git a/ld/Makefile.in b/ld/Makefile.in index 8aabafb..cba31ee 100644 --- a/ld/Makefile.in +++ b/ld/Makefile.in @@ -495,6 +495,7 @@ ALL_EMULATIONS = \ eelf32ppcsim.o \ eelf32ppcwindiss.o \ eelf32ppcvxworks.o \ + eelf32rx.o \ eelf32vax.o \ eelf32xc16x.o \ eelf32xc16xl.o \ @@ -1007,6 +1008,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32ppcsim.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32ppcvxworks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32ppcwindiss.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32rx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32vax.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32xc16x.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32xc16xl.Po@am__quote@ @@ -2128,6 +2130,10 @@ eelf32xstormy16.c: $(srcdir)/emulparams/elf32xstormy16.sh \ eelf32am33lin.c: $(srcdir)/emulparams/elf32am33lin.sh \ $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf32am33lin "$(tdir_mn10300)" +eelf32rx.c: $(srcdir)/emulparams/elf32rx.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf32rx "$(tdir_elf32rx)" + @true end-sanitize-rx eelf32vax.c: $(srcdir)/emulparams/elf32vax.sh \ $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf32vax "$(tdir_elf32vax)" diff --git a/ld/NEWS b/ld/NEWS index 7b57a0c..86b74cf 100644 --- a/ld/NEWS +++ b/ld/NEWS @@ -1,5 +1,7 @@ -*- text -*- +* Add support for the Renesas RX processor. + Changes in 2.20: * GNU/Linux targets now support the STB_GNU_UNIQUE symbol binding. This is a diff --git a/ld/configure.tgt b/ld/configure.tgt index d6d86ab..5cced83 100644 --- a/ld/configure.tgt +++ b/ld/configure.tgt @@ -503,6 +503,7 @@ powerpc-*-lynxos*) targ_emul=ppclynx ;; rs6000-*-aix[5-9]*) targ_emul=aix5rs6 ;; rs6000-*-aix*) targ_emul=aixrs6 ;; +rx-*-*) targ_emul=elf32rx ;; s390x-*-linux*) targ_emul=elf64_s390 targ_extra_emuls=elf_s390 targ_extra_libpath=$targ_extra_emuls diff --git a/ld/emulparams/elf32rx.sh b/ld/emulparams/elf32rx.sh new file mode 100644 index 0000000..729b4b3 --- /dev/null +++ b/ld/emulparams/elf32rx.sh @@ -0,0 +1,32 @@ +MACHINE= +SCRIPT_NAME=elf +OUTPUT_FORMAT="elf32-rx-le" +# See also `include/elf/rx.h' +TEXT_START_ADDR=0x10000000 +ARCH=rx +ENTRY=_start +EMBEDDED=yes +TEMPLATE_NAME=elf32 +EXTRA_EM_FILE=rxelf +# EXTRA_EM_FILE=needrelax +ELFSIZE=32 +MAXPAGESIZE=256 +# This is like setting STACK_ADDR to 0xbffffffc, except that the setting can +# be overridden, e.g. --defsym _stack=0x0f00, and that we put an extra +# sentinal value at the bottom. +# N.B. We can't use PROVIDE to set the default value in a symbol because +# the address is needed to place the .stack section, which in turn is needed +# to hold the sentinel value(s). +test -z "$CREATE_SHLIB" && OTHER_SECTIONS=" .stack ${RELOCATING-0}${RELOCATING+(DEFINED(__stack) ? __stack : 0xbffffffc)} : + { + ${RELOCATING+__stack = .;} + *(.stack) + LONG(0xdeaddead) + }" +# We do not need .stack for shared library. +test -n "$CREATE_SHLIB" && OTHER_SECTIONS="" + +OTHER_TEXT_SECTIONS='*(P)' +OTHER_READONLY_SECTIONS='C_1 : { *(C_1) } C_2 : { *(C_2) } C : { *(C) }' +OTHER_READWRITE_SECTIONS='D_1 : { *(D_1) } D_2 : { *(D_2) } D : { *(D) }' +OTHER_BSS_SECTIONS='B_1 : { *(B_1) } B_2 : { *(B_2) } B : { *(B) }' diff --git a/ld/emultempl/rxelf.em b/ld/emultempl/rxelf.em new file mode 100644 index 0000000..c4a2dac --- /dev/null +++ b/ld/emultempl/rxelf.em @@ -0,0 +1,64 @@ +# This shell script emits a C file. -*- C -*- +# Copyright 2009 Free Software Foundation, Inc. +# +# This file is part of the GNU Binutils. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +# MA 02110-1301, USA. +# + +# This file is sourced from elf32.em, and defines extra rx-elf +# specific routines. +# +test -z "$TARGET2_TYPE" && TARGET2_TYPE="rel" +fragment < + + * Makefile.am: Add RX files. + * configure.in: Add support for RX target. + * disassemble.c: Likewise. + * Makefile.in: Regenerate. + * configure: Regenerate. + * opc2c.c: New file. + * rx-decode.c: New file. + * rx-decode.opc: New file. + * rx-dis.c: New file. + 2009-09-29 Peter Bergner * ppc-opc.c (powerpc_opcodes): Remove support for the the "lxsdux", diff --git a/opcodes/Makefile.am b/opcodes/Makefile.am index 43db72a..735a7ab 100644 --- a/opcodes/Makefile.am +++ b/opcodes/Makefile.am @@ -188,6 +188,8 @@ TARGET_LIBOPCODES_CFILES = \ pj-opc.c \ ppc-dis.c \ ppc-opc.c \ + rx-decode.c \ + rx-dis.c \ s390-dis.c \ s390-opc.c \ score-dis.c \ @@ -435,6 +437,14 @@ stamp-iq2000: $(CGENDEPS) $(srcdir)/../cpu/iq2000.cpu \ archfile=$(srcdir)/../cpu/iq2000.cpu \ opcfile=$(srcdir)/../cpu/iq2000.opc extrafiles= +$(srcdir)/rx-decode.c : $(srcdir)/rx-decode.opc opc2c$(EXEEXT) + ./opc2c$(EXEEXT) $(srcdir)/rx-decode.opc > $(srcdir)/rx-decode.c + +rx-dis.lo : rx-dis.c sysdep.h config.h $(BFD_H) $(INCDIR)/opcode/rx.h + +opc2c$(EXEEXT) : $(srcdir)/opc2c.c + gcc $(srcdir)/opc2c.c -o opc2c$(EXEEXT) + $(srcdir)/xstormy16-desc.h $(srcdir)/xstormy16-desc.c $(srcdir)/xstormy16-opc.h $(srcdir)/xstormy16-opc.c $(srcdir)/xstormy16-ibld.c $(srcdir)/xstormy16-asm.c $(srcdir)/xstormy16-dis.c: $(XSTORMY16_DEPS) @true stamp-xstormy16: $(CGENDEPS) $(CPUDIR)/xstormy16.cpu $(CPUDIR)/xstormy16.opc diff --git a/opcodes/Makefile.in b/opcodes/Makefile.in index 5b4721a..07c9495 100644 --- a/opcodes/Makefile.in +++ b/opcodes/Makefile.in @@ -458,6 +458,8 @@ TARGET_LIBOPCODES_CFILES = \ pj-opc.c \ ppc-dis.c \ ppc-opc.c \ + rx-decode.c \ + rx-dis.c \ s390-dis.c \ s390-opc.c \ score-dis.c \ @@ -824,6 +826,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pj-opc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc-dis.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc-opc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rx-decode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rx-dis.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s390-dis.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s390-opc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/score-dis.Plo@am__quote@ @@ -1280,6 +1284,14 @@ stamp-iq2000: $(CGENDEPS) $(srcdir)/../cpu/iq2000.cpu \ archfile=$(srcdir)/../cpu/iq2000.cpu \ opcfile=$(srcdir)/../cpu/iq2000.opc extrafiles= +$(srcdir)/rx-decode.c : $(srcdir)/rx-decode.opc opc2c$(EXEEXT) + ./opc2c$(EXEEXT) $(srcdir)/rx-decode.opc > $(srcdir)/rx-decode.c + +rx-dis.lo : rx-dis.c sysdep.h config.h $(BFD_H) $(INCDIR)/opcode/rx.h + +opc2c$(EXEEXT) : $(srcdir)/opc2c.c + gcc $(srcdir)/opc2c.c -o opc2c$(EXEEXT) + $(srcdir)/xstormy16-desc.h $(srcdir)/xstormy16-desc.c $(srcdir)/xstormy16-opc.h $(srcdir)/xstormy16-opc.c $(srcdir)/xstormy16-ibld.c $(srcdir)/xstormy16-asm.c $(srcdir)/xstormy16-dis.c: $(XSTORMY16_DEPS) @true stamp-xstormy16: $(CGENDEPS) $(CPUDIR)/xstormy16.cpu $(CPUDIR)/xstormy16.opc diff --git a/opcodes/configure b/opcodes/configure index 52da1c4..83b973c 100755 --- a/opcodes/configure +++ b/opcodes/configure @@ -12332,6 +12332,7 @@ if test x${all_targets} = xfalse ; then bfd_pyramid_arch) ;; bfd_romp_arch) ;; bfd_rs6000_arch) ta="$ta ppc-dis.lo ppc-opc.lo" ;; + bfd_rx_arch) ta="$ta rx-dis.lo rx-decode.lo";; bfd_s390_arch) ta="$ta s390-dis.lo s390-opc.lo" ;; bfd_score_arch) ta="$ta score-dis.lo score7-dis.lo" ;; bfd_sh_arch) diff --git a/opcodes/configure.in b/opcodes/configure.in index 75414d7..dd9dabf 100644 --- a/opcodes/configure.in +++ b/opcodes/configure.in @@ -271,6 +271,7 @@ if test x${all_targets} = xfalse ; then bfd_pyramid_arch) ;; bfd_romp_arch) ;; bfd_rs6000_arch) ta="$ta ppc-dis.lo ppc-opc.lo" ;; + bfd_rx_arch) ta="$ta rx-dis.lo rx-decode.lo";; bfd_s390_arch) ta="$ta s390-dis.lo s390-opc.lo" ;; bfd_score_arch) ta="$ta score-dis.lo score7-dis.lo" ;; bfd_sh_arch) diff --git a/opcodes/disassemble.c b/opcodes/disassemble.c index 04d5d0c..267fcf5 100644 --- a/opcodes/disassemble.c +++ b/opcodes/disassemble.c @@ -71,6 +71,7 @@ #define ARCH_pj #define ARCH_powerpc #define ARCH_rs6000 +#define ARCH_rx #define ARCH_s390 #define ARCH_score #define ARCH_sh @@ -352,6 +353,11 @@ disassembler (abfd) disassemble = print_insn_rs6000; break; #endif +#ifdef ARCH_rx + case bfd_arch_rx: + disassemble = print_insn_rx; + break; +#endif #ifdef ARCH_s390 case bfd_arch_s390: disassemble = print_insn_s390; diff --git a/opcodes/opc2c.c b/opcodes/opc2c.c new file mode 100644 index 0000000..bec361f --- /dev/null +++ b/opcodes/opc2c.c @@ -0,0 +1,810 @@ +/* opc2c.c --- generate C opcode decoder code from from .opc file + + Copyright (C) 2005, 2007, 2008, 2009 Free Software Foundation, Inc. + Contributed by Red Hat, Inc. + + This file is part of the GNU opcode library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + +#include +#include +#include +#include + +static char * line_buf = NULL; +static int line_buf_size = 0; + +#define LBUFINCR 100 + +char * +safe_fgets (FILE * f) +{ + char * line_ptr; + + if (line_buf == NULL) + { + line_buf = (char *) malloc (LBUFINCR); + line_buf_size = LBUFINCR; + } + + /* Points to last byte. */ + line_ptr = line_buf + line_buf_size - 1; + + /* So we can see if fgets put a 0 there. */ + *line_ptr = 1; + if (fgets (line_buf, line_buf_size, f) == 0) + return NULL; + + /* We filled the buffer? */ + while (line_ptr[0] == 0 && line_ptr[-1] != '\n') + { + /* Make the buffer bigger and read more of the line. */ + line_buf_size += LBUFINCR; + line_buf = (char *) realloc (line_buf, line_buf_size); + + /* Points to last byte again. */ + line_ptr = line_buf + line_buf_size - 1; + /* So we can see if fgets put a 0 there. */ + *line_ptr = 1; + + if (fgets (line_buf + line_buf_size - LBUFINCR - 1, LBUFINCR + 1, f) == 0) + return NULL; + } + + return line_buf; +} + + +static int errors = 0; + +#define MAX_BYTES 10 + +typedef struct +{ + int varyno:16; + int byte:8; + int shift:8; +} VaryRef; + +typedef struct +{ + char nbytes; + char dbytes; + char id[MAX_BYTES * 8 + 1]; + unsigned char var_start[MAX_BYTES * 8 + 1]; + struct + { + unsigned char decodable_mask; + unsigned char decodable_bits; + } b[MAX_BYTES]; + char * comment; + char * syntax; + int lineno; + int nlines; + char ** lines; + struct Indirect * last_ind; + int semantics_label; + int nvaries; + VaryRef * vary; +} opcode; + +int n_opcodes; +opcode ** opcodes; +opcode * op; + +typedef struct +{ + char * name; + int nlen; + unsigned char mask; + int n_patterns; + unsigned char * patterns; +} Vary; + +Vary ** vary = 0; +int n_varies = 0; + +unsigned char cur_bits[MAX_BYTES + 1]; + +char * orig_filename; + +FILE * sim_log = NULL; +#define lprintf if (sim_log) fprintf + +opcode prefix_text, suffix_text; + +typedef enum +{ + T_unused, + T_op, + T_indirect, + T_done +} OpType; + +typedef struct Indirect +{ + OpType type; + union + { + struct Indirect * ind; + opcode * op; + } u; +} Indirect; + +Indirect indirect[256]; + +static int +next_varybits (int bits, opcode * op, int byte) +{ + int mask = op->b[byte].decodable_mask; + int i; + + for (i = 0; i < 8; i++) + if (!(mask & (1 << i))) + { + if (bits & (1 << i)) + { + bits &= ~(1 << i); + } + else + { + bits |= (1 << i); + return bits; + } + } + return 0; +} + +static int +valid_varybits (int bits, opcode * op, int byte) +{ + if (op->nvaries) + { + int vn; + + for (vn = 0; vn < op->nvaries; vn++) + { + Vary * v; + int found = 0; + int i; + int ob; + + if (byte != op->vary[vn].byte) + continue; + v = vary[op->vary[vn].varyno]; + ob = (bits >> op->vary[vn].shift) & v->mask; + lprintf (sim_log, "varybits: vary %s ob %x\n", v->name, ob); + + for (i = 0; i < v->n_patterns; i++) + if (ob == v->patterns[i]) + { + lprintf (sim_log, " found at %d\n", i); + found = 1; + break; + } + if (!found) + return 0; + } + } + return 1; +} + +char * +prmb (int mask, int bits) +{ + static char buf[8][30]; + static int bn = 0; + char * bp; + + bn = (bn + 1) % 8; + bp = buf[bn]; + int i; + for (i = 0; i < 8; i++) + { + int bit = 0x80 >> i; + + if (!(mask & bit)) + *bp++ = '-'; + else if (bits & bit) + *bp++ = '1'; + else + *bp++ = '0'; + if (i % 4 == 3) + *bp++ = ' '; + } + *--bp = 0; + return buf[bn]; +} + +static int +op_cmp (const void *va, const void *vb) +{ + const opcode * a = *(const opcode **) va; + const opcode * b = *(const opcode **) vb; + + if (a->nbytes != b->nbytes) + return a->nbytes - b->nbytes; + + return strcmp (a->id, b->id); +} + +void +dump_lines (opcode * op, int level, Indirect * ind) +{ + char * varnames[40]; + int i, vn = 0; + + if (op->semantics_label) + { + printf ("%*sgoto op_semantics_%d;\n", level, "", op->semantics_label); + return; + } + + if (ind != op->last_ind) + { + static int labelno = 0; + labelno++; + printf ("%*sop_semantics_%d:\n", level, "", labelno); + op->semantics_label = labelno; + } + + if (op->comment) + { + level += 2; + printf ("%*s{\n", level, ""); + printf ("%*s %s\n", level, "", op->comment); + } + + for (i = 0; i < op->nbytes * 8;) + { + if (isalpha (op->id[i])) + { + int byte = i >> 3; + int mask = 0; + int shift = 0; + char name[33]; + char * np = name; + + while (op->id[i] && isalpha (op->id[i])) + { + mask = (mask << 1) | 1; + shift = 7 - (i & 7); + *np++ = op->id[i++]; + if (op->var_start[i]) + break; + } + *np = 0; + varnames[vn++] = strdup (name); + printf ("#line %d \"%s\"\n", op->lineno, orig_filename); + if (mask & ~0xff) + { + fprintf (stderr, "Error: variable %s spans bytes: %s\n", + name, op->comment); + errors++; + } + else if (shift && (mask != 0xff)) + printf ("%*s int %s AU = (op[%d] >> %d) & 0x%02x;\n", + level, "", name, byte, shift, mask); + else if (mask != 0xff) + printf ("%*s int %s AU = op[%d] & 0x%02x;\n", + level, "", name, byte, mask); + else + printf ("%*s int %s AU = op[%d];\n", level, "", name, byte); + } + else + i++; + } + + if (op->comment) + { + printf ("%*s if (trace)\n", level, ""); + printf ("%*s {\n", level, ""); + printf ("%*s printf (\"\\033[33m%%s\\033[0m ", level, ""); + for (i = 0; i < op->nbytes; i++) + printf (" %%02x"); + printf ("\\n\""); + printf (",\n%*s \"%s\"", level, "", op->comment); + for (i = 0; i < op->nbytes; i++) + { + if (i == 0) + printf (",\n%*s op[%d]", level, "", i); + else + printf (", op[%d]", i); + } + printf (");\n"); + for (i = 0; i < vn; i++) + printf ("%*s printf (\" %s = 0x%%x%s\", %s);\n", level, "", + varnames[i], (i < vn - 1) ? "," : "\\n", varnames[i]); + printf ("%*s }\n", level, ""); + } + + if (op->syntax) + printf ("%*s SYNTAX(\"%s\");\n", level, "", op->syntax); + + printf ("#line %d \"%s\"\n", op->lineno + 1, orig_filename); + + for (i = 0; i < op->nlines; i++) + printf ("%*s%s", level, "", op->lines[i]); + + if (op->comment) + printf ("%*s}\n", level, ""); +} + +void +store_opcode_bits (opcode * op, int byte, Indirect * ind) +{ + int bits = op->b[byte].decodable_bits; + + do + { + if (!valid_varybits (bits, op, byte)) + continue; + + switch (ind[bits].type) + { + case T_unused: + if (byte == op->dbytes - 1) + { + ind[bits].type = T_op; + ind[bits].u.op = op; + op->last_ind = ind; + break; + } + else + { + int i2; + + ind[bits].type = T_indirect; + ind[bits].u.ind = (Indirect *) malloc (256 * sizeof (Indirect)); + for (i2 = 0; i2 < 256; i2++) + ind[bits].u.ind[i2].type = T_unused; + store_opcode_bits (op, byte + 1, ind[bits].u.ind); + } + break; + + case T_indirect: + if (byte < op->dbytes - 1) + store_opcode_bits (op, byte + 1, ind[bits].u.ind); + break; + + case T_op: + break; + + case T_done: + break; + } + } + while ((bits = next_varybits (bits, op, byte)) != 0); +} + +void +emit_indirect (Indirect * ind, int byte) +{ + int unsup = 0; + int j, n, mask; + + mask = 0; + for (j = 0; j < 256; j++) + { + switch (ind[j].type) + { + case T_indirect: + mask = 0xff; + break; + case T_op: + mask |= ind[j].u.op->b[byte].decodable_mask; + break; + case T_done: + case T_unused: + break; + } + } + + printf ("%*s GETBYTE ();\n", byte * 6, ""); + printf ("%*s switch (op[%d] & 0x%02x)\n", byte * 6, "", byte, mask); + printf ("%*s {\n", byte * 6, ""); + + for (j = 0; j < 256; j++) + if ((j & ~mask) == 0) + { + switch (ind[j].type) + { + case T_done: + break; + case T_unused: + unsup = 1; + break; + case T_op: + for (n = j; n < 256; n++) + if ((n & ~mask) == 0 + && ind[n].type == T_op && ind[n].u.op == ind[j].u.op) + { + ind[n].type = T_done; + printf ("%*s case 0x%02x:\n", byte * 6, "", n); + } + for (n = byte; n < ind[j].u.op->nbytes - 1; n++) + printf ("%*s GETBYTE();\n", byte * 6, ""); + dump_lines (ind[j].u.op, byte * 6 + 6, ind); + printf ("%*s break;\n", byte * 6, ""); + break; + case T_indirect: + printf ("%*s case 0x%02x:\n", byte * 6, "", j); + emit_indirect (ind[j].u.ind, byte + 1); + printf ("%*s break;\n", byte * 6, ""); + break; + } + } + if (unsup) + printf ("%*s default: UNSUPPORTED(); break;\n", byte * 6, ""); + printf ("%*s }\n", byte * 6, ""); +} + +static char * +pv_dup (char * p, char * ep) +{ + int n = ep - p; + char *rv = (char *) malloc (n + 1); + + memcpy (rv, p, n); + rv[n] = 0; + return rv; +} + +static unsigned char +str2mask (char * str, char * ep) +{ + unsigned char rv = 0; + + while (str < ep) + { + rv *= 2; + if (*str == '1') + rv += 1; + str++; + } + return rv; +} + +static void +process_vary (char * line) +{ + char * cp; + char * ep; + Vary * v = (Vary *) malloc (sizeof (Vary)); + + n_varies++; + if (vary) + vary = (Vary **) realloc (vary, n_varies * sizeof (Vary *)); + else + vary = (Vary **) malloc (n_varies * sizeof (Vary *)); + vary[n_varies - 1] = v; + + cp = line; + + for (cp = line; isspace (*cp); cp++); + for (ep = cp; *ep && !isspace (*ep); ep++); + + v->name = pv_dup (cp, ep); + v->nlen = strlen (v->name); + v->mask = (1 << v->nlen) - 1; + + v->n_patterns = 0; + v->patterns = (unsigned char *) malloc (1); + while (1) + { + for (cp = ep; isspace (*cp); cp++); + if (!isdigit (*cp)) + break; + for (ep = cp; *ep && !isspace (*ep); ep++); + v->n_patterns++; + v->patterns = (unsigned char *) realloc (v->patterns, v->n_patterns); + v->patterns[v->n_patterns - 1] = str2mask (cp, ep); + } +} + +static int +fieldcmp (opcode * op, int bit, char *name) +{ + int n = strlen (name); + + if (memcmp (op->id + bit, name, n) == 0 + && (!isalpha (op->id[bit + n]) || op->var_start[bit + n])) + return 1; + return 0; +} + +static void +log_indirect (Indirect * ind, int byte) +{ + int i, j; + char * last_c = 0; + + for (i = 0; i < 256; i++) + { + + for (j = 0; j < byte; j++) + fprintf (sim_log, "%s ", prmb (255, cur_bits[j])); + fprintf (sim_log, "%s ", prmb (255, i)); + + switch (ind[i].type) + { + case T_op: + case T_done: + if (last_c && (ind[i].u.op->comment == last_c)) + fprintf (sim_log, "''\n"); + else + fprintf (sim_log, "%s\n", ind[i].u.op->comment); + last_c = ind[i].u.op->comment; + break; + case T_unused: + fprintf (sim_log, "unused\n"); + break; + case T_indirect: + fprintf (sim_log, "indirect\n"); + cur_bits[byte] = i; + log_indirect (ind[i].u.ind, byte + 1); + last_c = 0; + break; + } + } +} + +int +main (int argc, char ** argv) +{ + char * line; + FILE * in; + int lineno = 0; + int i; + VaryRef * vlist; + int skipping_section = 0; + + if (argc > 2 && strcmp (argv[1], "-l") == 0) + { + sim_log = fopen (argv[2], "w"); + fprintf (stderr, "sim_log: %s\n", argv[2]); + argc -= 2; + argv += 2; + } + + if (argc < 2) + { + fprintf (stderr, "usage: opc2c infile.opc > outfile.opc\n"); + exit (1); + } + + orig_filename = argv[1]; + in = fopen (argv[1], "r"); + if (!in) + { + fprintf (stderr, "Unable to open file %s for reading\n", argv[1]); + perror ("The error was"); + exit (1); + } + + n_opcodes = 0; + opcodes = (opcode **) malloc (sizeof (opcode *)); + op = &prefix_text; + op->lineno = 1; + while ((line = safe_fgets (in)) != 0) + { + lineno++; + if (strncmp (line, "/*?* ", 5) == 0) + { + skipping_section = 1; + continue; + } + if (strncmp (line, " /** ", 6) == 0 + && (isdigit (line[6]) || memcmp (line + 6, "VARY", 4) == 0)) + line += 2; + if (line[0] == '/' && line[1] == '*' && line[2] == '*') + { + skipping_section = 0; + if (strncmp (line, "/** */", 6) == 0) + { + op = &suffix_text; + op->lineno = lineno; + } + else if (strncmp (line, "/** VARY ", 9) == 0) + process_vary (line + 9); + else + { + char * lp; + int i, bit, byte; + int var_start = 1; + + n_opcodes++; + opcodes = + (opcode **) realloc (opcodes, n_opcodes * sizeof (opcode *)); + op = (opcode *) malloc (sizeof (opcode)); + opcodes[n_opcodes - 1] = op; + + op->nbytes = op->dbytes = 0; + memset (op->id, 0, sizeof (op->id)); + memset (op->var_start, 0, sizeof (op->var_start)); + for (i = 0; i < MAX_BYTES; i++) + { + op->b[i].decodable_mask = 0; + op->b[i].decodable_bits = 0; + } + op->comment = strdup (line); + op->comment[strlen (op->comment) - 1] = 0; + while (op->comment[0] && isspace (op->comment[0])) + op->comment++; + op->lineno = lineno; + op->nlines = 0; + op->lines = 0; + op->last_ind = 0; + op->semantics_label = 0; + op->nvaries = 0; + op->vary = 0; + + i = 0; + for (lp = line + 4; *lp; lp++) + { + bit = 7 - (i & 7); + byte = i >> 3; + + if (strncmp (lp, "*/", 2) == 0) + break; + else if ((lp[0] == ' ' && lp[1] == ' ') || (lp[0] == '\t')) + { + while (*lp == ' ' || *lp == '\t') + lp ++; + op->syntax = strdup (lp); + lp = strstr (op->syntax, "*/"); + if (lp) + { + *lp-- = 0; + while ((*lp == ' ' || *lp == '\t') + && lp > op->syntax) + *lp-- = 0; + } + break; + } + else if (*lp == ' ') + var_start = 1; + else + { + if (*lp == '0' || *lp == '1') + { + op->b[byte].decodable_mask |= 1 << bit; + var_start = 1; + if (op->dbytes < byte + 1) + op->dbytes = byte + 1; + } + else if (var_start) + { + op->var_start[i] = 1; + var_start = 0; + if (op->dbytes < byte + 1) + op->dbytes = byte + 1; + } + if (*lp == '1') + op->b[byte].decodable_bits |= 1 << bit; + + op->nbytes = byte + 1; + op->id[i++] = *lp; + } + } + } + } + else if (!skipping_section) + { + op->nlines++; + if (op->lines) + op->lines = + (char **) realloc (op->lines, op->nlines * sizeof (char *)); + else + op->lines = (char **) malloc (op->nlines * sizeof (char *)); + op->lines[op->nlines - 1] = strdup (line); + } + } + + { + int i, j; + for (i = 0; i < n_varies; i++) + { + Vary *v = vary[i]; + lprintf (sim_log, "V[%s] %d\n", v->name, v->nlen); + for (j = 0; j < v->n_patterns; j++) + lprintf (sim_log, " P %02x\n", v->patterns[j]); + } + } + + for (i = n_opcodes - 2; i >= 0; i--) + { + if (opcodes[i]->nlines == 0) + { + opcodes[i]->nlines = opcodes[i + 1]->nlines; + opcodes[i]->lines = opcodes[i + 1]->lines; + } + } + + for (i = 0; i < 256; i++) + indirect[i].type = T_unused; + + qsort (opcodes, n_opcodes, sizeof (opcodes[0]), op_cmp); + + vlist = (VaryRef *) malloc (n_varies * sizeof (VaryRef)); + + for (i = 0; i < n_opcodes; i++) + { + int j, b, v; + + for (j = 0; j < opcodes[i]->nbytes; j++) + lprintf (sim_log, "%s ", + prmb (opcodes[i]->b[j].decodable_mask, + opcodes[i]->b[j].decodable_bits)); + lprintf (sim_log, " %s\n", opcodes[i]->comment); + + for (j = 0; j < opcodes[i]->nbytes; j++) + { + for (b = 0; b < 8; b++) + if (isalpha (opcodes[i]->id[j * 8 + b])) + for (v = 0; v < n_varies; v++) + if (fieldcmp (opcodes[i], j * 8 + b, vary[v]->name)) + { + int nv = opcodes[i]->nvaries++; + if (nv) + opcodes[i]->vary = + (VaryRef *) realloc (opcodes[i]->vary, + (nv + 1) * sizeof (VaryRef)); + else + opcodes[i]->vary = + (VaryRef *) malloc ((nv + 1) * sizeof (VaryRef)); + + opcodes[i]->vary[nv].varyno = v; + opcodes[i]->vary[nv].byte = j; + opcodes[i]->vary[nv].shift = 8 - b - vary[v]->nlen; + lprintf (sim_log, "[vary %s shift %d]\n", + vary[v]->name, opcodes[i]->vary[nv].shift); + } + + } + } + + for (i = 0; i < n_opcodes; i++) + { + int i2; + int bytes = opcodes[i]->dbytes; + + lprintf (sim_log, "\nmask:"); + for (i2 = 0; i2 < opcodes[i]->nbytes; i2++) + lprintf (sim_log, " %02x", opcodes[i]->b[i2].decodable_mask); + lprintf (sim_log, "%*s%s\n", 13 - 3 * opcodes[i]->nbytes, "", + opcodes[i]->comment); + + lprintf (sim_log, "bits:"); + for (i2 = 0; i2 < opcodes[i]->nbytes; i2++) + lprintf (sim_log, " %02x", opcodes[i]->b[i2].decodable_bits); + lprintf (sim_log, "%*s(%s) %d byte%s\n", 13 - 3 * opcodes[i]->nbytes, + "", opcodes[i]->id, bytes, bytes == 1 ? "" : "s"); + + store_opcode_bits (opcodes[i], 0, indirect); + } + + dump_lines (&prefix_text, 0, 0); + + emit_indirect (indirect, 0); + + dump_lines (&suffix_text, 0, 0); + + if (sim_log) + log_indirect (indirect, 0); + + return errors; +} diff --git a/opcodes/rx-decode.c b/opcodes/rx-decode.c new file mode 100644 index 0000000..3de4ba4 --- /dev/null +++ b/opcodes/rx-decode.c @@ -0,0 +1,14814 @@ +#line 2 "/work/sources/binutils/current/opcodes/rx-decode.opc" +/* -*- c -*- */ +#include +#include +#include + +#include "config.h" +#include "ansidecl.h" +#include "opcode/rx.h" + +#define RX_OPCODE_BIG_ENDIAN 0 + +typedef struct +{ + RX_Opcode_Decoded * rx; + int (* getbyte)(void *); + void * ptr; + unsigned char * op; +} LocalData; + +static int trace = 0; + +#define BSIZE 0 +#define WSIZE 1 +#define LSIZE 2 + +/* These are for when the upper bits are "don't care" or "undefined". */ +static int bwl[] = +{ + RX_Byte, + RX_Word, + RX_Long +}; + +static int sbwl[] = +{ + RX_SByte, + RX_SWord, + RX_Long +}; + +static int ubwl[] = +{ + RX_UByte, + RX_UWord, + RX_Long +}; + +static int memex[] = +{ + RX_SByte, + RX_SWord, + RX_Long, + RX_UWord +}; + +#define ID(x) rx->id = RXO_##x +#define OP(n,t,r,a) (rx->op[n].type = t, \ + rx->op[n].reg = r, \ + rx->op[n].addend = a ) +#define OPs(n,t,r,a,s) (OP (n,t,r,a), \ + rx->op[n].size = s ) + +/* This is for the BWL and BW bitfields. */ +static int SCALE[] = { 1, 2, 4 }; +/* This is for the prefix size enum. */ +static int PSCALE[] = { 4, 1, 1, 1, 2, 2, 2, 3, 4 }; + +static int flagmap[] = {0, 1, 2, 3, 0, 0, 0, 0, + 16, 17, 0, 0, 0, 0, 0, 0 }; + +static int dsp3map[] = { 8, 9, 10, 3, 4, 5, 6, 7 }; + +/* + *C a constant (immediate) c + *R A register + *I Register indirect, no offset + *Is Register indirect, with offset + *D standard displacement: type (r,[r],dsp8,dsp16 code), register, BWL code + *P standard displacement: type (r,[r]), reg, assumes UByte + *Pm memex displacement: type (r,[r]), reg, memex code + *cc condition code. */ + +#define DC(c) OP (0, RX_Operand_Immediate, 0, c) +#define DR(r) OP (0, RX_Operand_Register, r, 0) +#define DI(r,a) OP (0, RX_Operand_Indirect, r, a) +#define DIs(r,a,s) OP (0, RX_Operand_Indirect, r, (a) * SCALE[s]) +#define DD(t,r,s) rx_disp (0, t, r, bwl[s], ld); +#define DF(r) OP (0, RX_Operand_Flag, flagmap[r], 0) + +#define SC(i) OP (1, RX_Operand_Immediate, 0, i) +#define SR(r) OP (1, RX_Operand_Register, r, 0) +#define SI(r,a) OP (1, RX_Operand_Indirect, r, a) +#define SIs(r,a,s) OP (1, RX_Operand_Indirect, r, (a) * SCALE[s]) +#define SD(t,r,s) rx_disp (1, t, r, bwl[s], ld); +#define SP(t,r) rx_disp (1, t, r, (t!=3) ? RX_UByte : RX_Long, ld); P(t, 1); +#define SPm(t,r,m) rx_disp (1, t, r, memex[m], ld); rx->op[1].size = memex[m]; +#define Scc(cc) OP (1, RX_Operand_Condition, cc, 0) + +#define S2C(i) OP (2, RX_Operand_Immediate, 0, i) +#define S2R(r) OP (2, RX_Operand_Register, r, 0) +#define S2I(r,a) OP (2, RX_Operand_Indirect, r, a) +#define S2Is(r,a,s) OP (2, RX_Operand_Indirect, r, (a) * SCALE[s]) +#define S2D(t,r,s) rx_disp (2, t, r, bwl[s], ld); +#define S2P(t,r) rx_disp (2, t, r, (t!=3) ? RX_UByte : RX_Long, ld); P(t, 2); +#define S2Pm(t,r,m) rx_disp (2, t, r, memex[m], ld); rx->op[2].size = memex[m]; +#define S2cc(cc) OP (2, RX_Operand_Condition, cc, 0) + +#define BWL(sz) rx->op[0].size = rx->op[1].size = rx->op[2].size = rx->size = bwl[sz] +#define sBWL(sz) rx->op[0].size = rx->op[1].size = rx->op[2].size = rx->size = sbwl[sz] +#define uBWL(sz) rx->op[0].size = rx->op[1].size = rx->op[2].size = rx->size = ubwl[sz] +#define P(t, n) rx->op[n].size = (t!=3) ? RX_UByte : RX_Long; + +#define F(f) store_flags(rx, f) + +#define AU ATTRIBUTE_UNUSED +#define GETBYTE() (ld->op [ld->rx->n_bytes++] = ld->getbyte (ld->ptr)) + +#define SYNTAX(x) rx->syntax = x + +#define UNSUPPORTED() \ + rx->syntax = "*unknown*" + +#define IMM(sf) immediate (sf, 0, ld) +#define IMMex(sf) immediate (sf, 1, ld) + +static int +immediate (int sfield, int ex, LocalData * ld) +{ + unsigned long i = 0, j; + + switch (sfield) + { +#define B ((unsigned long) GETBYTE()) + case 0: +#if RX_OPCODE_BIG_ENDIAN + i = B; + if (ex && (i & 0x80)) + i -= 0x100; + i <<= 24; + i |= B << 16; + i |= B << 8; + i |= B; +#else + i = B; + i |= B << 8; + i |= B << 16; + j = B; + if (ex && (j & 0x80)) + j -= 0x100; + i |= j << 24; +#endif + break; + case 3: +#if RX_OPCODE_BIG_ENDIAN + i = B << 16; + i |= B << 8; + i |= B; +#else + i = B; + i |= B << 8; + i |= B << 16; +#endif + if (ex && (i & 0x800000)) + i -= 0x1000000; + break; + case 2: +#if RX_OPCODE_BIG_ENDIAN + i |= B << 8; + i |= B; +#else + i |= B; + i |= B << 8; +#endif + if (ex && (i & 0x8000)) + i -= 0x10000; + break; + case 1: + i |= B; + if (ex && (i & 0x80)) + i -= 0x100; + break; + default: + abort(); + } + return i; +} + +static void +rx_disp (int n, int type, int reg, int size, LocalData * ld) +{ + int disp; + + ld->rx->op[n].reg = reg; + switch (type) + { + case 3: + ld->rx->op[n].type = RX_Operand_Register; + break; + case 0: + ld->rx->op[n].type = RX_Operand_Indirect; + ld->rx->op[n].addend = 0; + break; + case 1: + ld->rx->op[n].type = RX_Operand_Indirect; + disp = GETBYTE (); + ld->rx->op[n].addend = disp * PSCALE[size]; + break; + case 2: + ld->rx->op[n].type = RX_Operand_Indirect; + disp = GETBYTE (); +#if RX_OPCODE_BIG_ENDIAN + disp = disp * 256 + GETBYTE (); +#else + disp = disp + GETBYTE () * 256; +#endif + ld->rx->op[n].addend = disp * PSCALE[size]; + break; + default: + abort (); + } +} + +/* The syntax is "OSZC" where each character is one of the following: + - = flag unchanged + 0 = flag cleared + 1 = flag set + ? = flag undefined + x = flag set (any letter will do, use it for hints :). */ + +static void +store_flags (RX_Opcode_Decoded * rx, char * str) +{ + int i, mask; + rx->flags_0 = 0; + rx->flags_1 = 0; + rx->flags_s = 0; + + for (i = 0; i < 4; i++) + { + mask = 8 >> i; + switch (str[i]) + { + case 0: + abort (); + case '-': + break; + case '0': + rx->flags_0 |= mask; + break; + case '1': + rx->flags_1 |= mask; + break; + case '?': + break; + default: + rx->flags_0 |= mask; + rx->flags_s |= mask; + break; + } + } +} + +int +rx_decode_opcode (unsigned long pc AU, + RX_Opcode_Decoded * rx, + int (* getbyte)(void *), + void * ptr) +{ + LocalData lds, * ld = &lds; + unsigned char op[20] = {0}; + + lds.rx = rx; + lds.getbyte = getbyte; + lds.ptr = ptr; + lds.op = op; + + memset (rx, 0, sizeof (*rx)); + BWL(LSIZE); + + +/*----------------------------------------------------------------------*/ +/* MOV */ + + GETBYTE (); + switch (op[0] & 0xff) + { + case 0x00: + { + /** 0000 0000 brk */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x\n", + "/** 0000 0000 brk */", + op[0]); + } + SYNTAX("brk"); +#line 957 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(brk); + + } + break; + case 0x01: + { + /** 0000 0001 dbt */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x\n", + "/** 0000 0001 dbt */", + op[0]); + } + SYNTAX("dbt"); +#line 960 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(dbt); + + } + break; + case 0x02: + { + /** 0000 0010 rts */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x\n", + "/** 0000 0010 rts */", + op[0]); + } + SYNTAX("rts"); +#line 740 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(rts); + + /*----------------------------------------------------------------------*/ + /* NOP */ + + } + break; + case 0x03: + { + /** 0000 0011 nop */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x\n", + "/** 0000 0011 nop */", + op[0]); + } + SYNTAX("nop"); +#line 746 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(nop); + + /*----------------------------------------------------------------------*/ + /* STRING FUNCTIONS */ + + } + break; + case 0x04: + { + /** 0000 0100 bra.a %a0 */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x\n", + "/** 0000 0100 bra.a %a0 */", + op[0]); + } + SYNTAX("bra.a %a0"); +#line 718 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(branch); Scc(RXC_always); DC(pc + IMMex(3)); + + } + break; + case 0x05: + { + /** 0000 0101 bsr.a %a0 */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x\n", + "/** 0000 0101 bsr.a %a0 */", + op[0]); + } + SYNTAX("bsr.a %a0"); +#line 734 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(jsr); DC(pc + IMMex(3)); + + } + break; + case 0x06: + GETBYTE (); + switch (op[1] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_1: + { + /** 0000 0110 mx00 00ss rsrc rdst sub %2%S2, %1 */ +#line 521 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 521 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 521 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 521 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 0000 0110 mx00 00ss rsrc rdst sub %2%S2, %1 */", + op[0], op[1], op[2]); + printf (" mx = 0x%x,", mx); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("sub %2%S2, %1"); +#line 522 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sub); S2Pm(ss, rsrc, mx); SR(rdst); DR(rdst); F("OSZC"); + + } + break; + } + break; + case 0x01: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_1; + break; + } + break; + case 0x02: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_1; + break; + } + break; + case 0x03: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_1; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_2: + { + /** 0000 0110 mx00 01ss rsrc rdst cmp %2%S2, %1 */ +#line 509 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 509 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 509 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 509 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 0000 0110 mx00 01ss rsrc rdst cmp %2%S2, %1 */", + op[0], op[1], op[2]); + printf (" mx = 0x%x,", mx); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("cmp %2%S2, %1"); +#line 510 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sub); S2Pm(ss, rsrc, mx); SR(rdst); F("OSZC"); + + /*----------------------------------------------------------------------*/ + /* SUB */ + + } + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_2; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_2; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_2; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_3: + { + /** 0000 0110 mx00 10ss rsrc rdst add %1%S1, %0 */ +#line 485 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 485 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 485 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 485 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 0000 0110 mx00 10ss rsrc rdst add %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" mx = 0x%x,", mx); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("add %1%S1, %0"); +#line 486 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(add); SPm(ss, rsrc, mx); DR(rdst); F("OSZC"); + + } + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_3; + break; + } + break; + case 0x0a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_3; + break; + } + break; + case 0x0b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_3; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_4: + { + /** 0000 0110 mx00 11ss rsrc rdst mul %1%S1, %0 */ +#line 582 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 582 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 582 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 582 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 0000 0110 mx00 11ss rsrc rdst mul %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" mx = 0x%x,", mx); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("mul %1%S1, %0"); +#line 583 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mul); SPm(ss, rsrc, mx); DR(rdst); F("O---"); + + } + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_4; + break; + } + break; + case 0x0e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_4; + break; + } + break; + case 0x0f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_4; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_5: + { + /** 0000 0110 mx01 00ss rsrc rdst and %1%S1, %0 */ +#line 398 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 398 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 398 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 398 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 0000 0110 mx01 00ss rsrc rdst and %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" mx = 0x%x,", mx); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("and %1%S1, %0"); +#line 399 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(and); SPm(ss, rsrc, mx); DR(rdst); F("-SZ-"); + + } + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_5; + break; + } + break; + case 0x12: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_5; + break; + } + break; + case 0x13: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_5; + break; + } + break; + case 0x14: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_6: + { + /** 0000 0110 mx01 01ss rsrc rdst or %1%S1, %0 */ +#line 416 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 416 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 416 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 416 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 0000 0110 mx01 01ss rsrc rdst or %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" mx = 0x%x,", mx); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("or %1%S1, %0"); +#line 417 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(or); SPm(ss, rsrc, mx); DR(rdst); F("-SZ-"); + + } + break; + } + break; + case 0x15: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_6; + break; + } + break; + case 0x16: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_6; + break; + } + break; + case 0x17: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_6; + break; + } + break; + case 0x20: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + op_semantics_7: + { + /** 0000 0110 mx10 00sp 0000 0000 rsrc rdst sbb %1%S1, %0 */ +#line 534 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 534 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sp AU = op[1] & 0x03; +#line 534 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[3] >> 4) & 0x0f; +#line 534 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[3] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x %02x\n", + "/** 0000 0110 mx10 00sp 0000 0000 rsrc rdst sbb %1%S1, %0 */", + op[0], op[1], op[2], op[3]); + printf (" mx = 0x%x,", mx); + printf (" sp = 0x%x,", sp); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("sbb %1%S1, %0"); +#line 535 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sbb); SPm(sp, rsrc, mx); DR(rdst); F("OSZC"); + + /*----------------------------------------------------------------------*/ + /* ABS */ + + } + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + op_semantics_8: + { + /** 0000 0110 mx10 00ss 0000 0100 rsrc rdst max %1%S1, %0 */ +#line 555 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 555 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 555 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[3] >> 4) & 0x0f; +#line 555 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[3] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x %02x\n", + "/** 0000 0110 mx10 00ss 0000 0100 rsrc rdst max %1%S1, %0 */", + op[0], op[1], op[2], op[3]); + printf (" mx = 0x%x,", mx); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("max %1%S1, %0"); +#line 556 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(max); SPm(ss, rsrc, mx); DR(rdst); + + /*----------------------------------------------------------------------*/ + /* MIN */ + + } + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + op_semantics_9: + { + /** 0000 0110 mx10 00ss 0000 0101 rsrc rdst min %1%S1, %0 */ +#line 567 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 567 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 567 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[3] >> 4) & 0x0f; +#line 567 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[3] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x %02x\n", + "/** 0000 0110 mx10 00ss 0000 0101 rsrc rdst min %1%S1, %0 */", + op[0], op[1], op[2], op[3]); + printf (" mx = 0x%x,", mx); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("min %1%S1, %0"); +#line 568 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(min); SPm(ss, rsrc, mx); DR(rdst); + + /*----------------------------------------------------------------------*/ + /* MUL */ + + } + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + op_semantics_10: + { + /** 0000 0110 mx10 00ss 0000 0110 rsrc rdst emul %1%S1, %0 */ +#line 597 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 597 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 597 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[3] >> 4) & 0x0f; +#line 597 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[3] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x %02x\n", + "/** 0000 0110 mx10 00ss 0000 0110 rsrc rdst emul %1%S1, %0 */", + op[0], op[1], op[2], op[3]); + printf (" mx = 0x%x,", mx); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("emul %1%S1, %0"); +#line 598 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(emul); SPm(ss, rsrc, mx); DR(rdst); + + /*----------------------------------------------------------------------*/ + /* EMULU */ + + } + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + op_semantics_11: + { + /** 0000 0110 mx10 00ss 0000 0111 rsrc rdst emulu %1%S1, %0 */ +#line 609 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 609 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 609 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[3] >> 4) & 0x0f; +#line 609 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[3] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x %02x\n", + "/** 0000 0110 mx10 00ss 0000 0111 rsrc rdst emulu %1%S1, %0 */", + op[0], op[1], op[2], op[3]); + printf (" mx = 0x%x,", mx); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("emulu %1%S1, %0"); +#line 610 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(emulu); SPm(ss, rsrc, mx); DR(rdst); + + /*----------------------------------------------------------------------*/ + /* DIV */ + + } + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + op_semantics_12: + { + /** 0000 0110 mx10 00ss 0000 1000 rsrc rdst div %1%S1, %0 */ +#line 621 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 621 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 621 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[3] >> 4) & 0x0f; +#line 621 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[3] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x %02x\n", + "/** 0000 0110 mx10 00ss 0000 1000 rsrc rdst div %1%S1, %0 */", + op[0], op[1], op[2], op[3]); + printf (" mx = 0x%x,", mx); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("div %1%S1, %0"); +#line 622 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(div); SPm(ss, rsrc, mx); DR(rdst); F("O---"); + + /*----------------------------------------------------------------------*/ + /* DIVU */ + + } + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + op_semantics_13: + { + /** 0000 0110 mx10 00ss 0000 1001 rsrc rdst divu %1%S1, %0 */ +#line 633 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 633 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 633 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[3] >> 4) & 0x0f; +#line 633 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[3] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x %02x\n", + "/** 0000 0110 mx10 00ss 0000 1001 rsrc rdst divu %1%S1, %0 */", + op[0], op[1], op[2], op[3]); + printf (" mx = 0x%x,", mx); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("divu %1%S1, %0"); +#line 634 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(divu); SPm(ss, rsrc, mx); DR(rdst); F("O---"); + + /*----------------------------------------------------------------------*/ + /* SHIFT */ + + } + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + op_semantics_14: + { + /** 0000 0110 mx10 00ss 0000 1100 rsrc rdst tst %1%S1, %2 */ +#line 452 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 452 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 452 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[3] >> 4) & 0x0f; +#line 452 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[3] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x %02x\n", + "/** 0000 0110 mx10 00ss 0000 1100 rsrc rdst tst %1%S1, %2 */", + op[0], op[1], op[2], op[3]); + printf (" mx = 0x%x,", mx); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("tst %1%S1, %2"); +#line 453 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(and); SPm(ss, rsrc, mx); S2R(rdst); F("-SZ-"); + + /*----------------------------------------------------------------------*/ + /* NEG */ + + } + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + op_semantics_15: + { + /** 0000 0110 mx10 00ss 0000 1101 rsrc rdst xor %1%S1, %0 */ +#line 431 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 431 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 431 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[3] >> 4) & 0x0f; +#line 431 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[3] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x %02x\n", + "/** 0000 0110 mx10 00ss 0000 1101 rsrc rdst xor %1%S1, %0 */", + op[0], op[1], op[2], op[3]); + printf (" mx = 0x%x,", mx); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("xor %1%S1, %0"); +#line 432 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(xor); SPm(ss, rsrc, mx); DR(rdst); F("-SZ-"); + + /*----------------------------------------------------------------------*/ + /* NOT */ + + } + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + op_semantics_16: + { + /** 0000 0110 mx10 00ss 0001 0000 rsrc rdst xchg %1%S1, %0 */ +#line 365 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 365 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 365 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[3] >> 4) & 0x0f; +#line 365 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[3] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x %02x\n", + "/** 0000 0110 mx10 00ss 0001 0000 rsrc rdst xchg %1%S1, %0 */", + op[0], op[1], op[2], op[3]); + printf (" mx = 0x%x,", mx); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("xchg %1%S1, %0"); +#line 366 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(xchg); DR(rdst); SPm(ss, rsrc, mx); + + /*----------------------------------------------------------------------*/ + /* STZ/STNZ */ + + } + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + op_semantics_17: + { + /** 0000 0110 mx10 00sd 0001 0001 rsrc rdst itof %1%S1, %0 */ +#line 862 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mx AU = (op[1] >> 6) & 0x03; +#line 862 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 862 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[3] >> 4) & 0x0f; +#line 862 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[3] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x %02x\n", + "/** 0000 0110 mx10 00sd 0001 0001 rsrc rdst itof %1%S1, %0 */", + op[0], op[1], op[2], op[3]); + printf (" mx = 0x%x,", mx); + printf (" sd = 0x%x,", sd); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("itof %1%S1, %0"); +#line 863 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(itof); DR (rdst); SPm(sd, rsrc, mx); F("-SZ-"); + + /*----------------------------------------------------------------------*/ + /* BIT OPS */ + + } + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x21: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_7; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_8; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_9; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_10; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_11; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_12; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_13; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_14; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_15; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_16; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_17; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x22: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_7; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_8; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_9; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_10; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_11; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_12; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_13; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_14; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_15; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_16; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_17; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x23: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_7; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_8; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_9; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_10; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_11; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_12; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_13; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_14; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_15; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_16; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_17; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x40: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_1; + break; + } + break; + case 0x41: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_1; + break; + } + break; + case 0x42: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_1; + break; + } + break; + case 0x43: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_1; + break; + } + break; + case 0x44: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_2; + break; + } + break; + case 0x45: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_2; + break; + } + break; + case 0x46: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_2; + break; + } + break; + case 0x47: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_2; + break; + } + break; + case 0x48: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_3; + break; + } + break; + case 0x49: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_3; + break; + } + break; + case 0x4a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_3; + break; + } + break; + case 0x4b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_3; + break; + } + break; + case 0x4c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_4; + break; + } + break; + case 0x4d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_4; + break; + } + break; + case 0x4e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_4; + break; + } + break; + case 0x4f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_4; + break; + } + break; + case 0x50: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_5; + break; + } + break; + case 0x51: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_5; + break; + } + break; + case 0x52: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_5; + break; + } + break; + case 0x53: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_5; + break; + } + break; + case 0x54: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_6; + break; + } + break; + case 0x55: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_6; + break; + } + break; + case 0x56: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_6; + break; + } + break; + case 0x57: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_6; + break; + } + break; + case 0x60: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_7; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_8; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_9; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_10; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_11; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_12; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_13; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_14; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_15; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_16; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_17; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x61: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_7; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_8; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_9; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_10; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_11; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_12; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_13; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_14; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_15; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_16; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_17; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x62: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_7; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_8; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_9; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_10; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_11; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_12; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_13; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_14; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_15; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_16; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_17; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x63: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_7; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_8; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_9; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_10; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_11; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_12; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_13; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_14; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_15; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_16; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_17; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x80: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_1; + break; + } + break; + case 0x81: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_1; + break; + } + break; + case 0x82: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_1; + break; + } + break; + case 0x83: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_1; + break; + } + break; + case 0x84: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_2; + break; + } + break; + case 0x85: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_2; + break; + } + break; + case 0x86: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_2; + break; + } + break; + case 0x87: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_2; + break; + } + break; + case 0x88: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_3; + break; + } + break; + case 0x89: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_3; + break; + } + break; + case 0x8a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_3; + break; + } + break; + case 0x8b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_3; + break; + } + break; + case 0x8c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_4; + break; + } + break; + case 0x8d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_4; + break; + } + break; + case 0x8e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_4; + break; + } + break; + case 0x8f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_4; + break; + } + break; + case 0x90: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_5; + break; + } + break; + case 0x91: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_5; + break; + } + break; + case 0x92: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_5; + break; + } + break; + case 0x93: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_5; + break; + } + break; + case 0x94: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_6; + break; + } + break; + case 0x95: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_6; + break; + } + break; + case 0x96: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_6; + break; + } + break; + case 0x97: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_6; + break; + } + break; + case 0xa0: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_7; + break; + } + break; + case 0x02: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + op_semantics_18: + { + /** 0000 0110 1010 00ss 0000 0010 rsrc rdst adc %1%S1, %0 */ +#line 473 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 473 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[3] >> 4) & 0x0f; +#line 473 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[3] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x %02x\n", + "/** 0000 0110 1010 00ss 0000 0010 rsrc rdst adc %1%S1, %0 */", + op[0], op[1], op[2], op[3]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("adc %1%S1, %0"); +#line 474 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(adc); SPm(ss, rsrc, 2); DR(rdst); F("OSZC"); + + /*----------------------------------------------------------------------*/ + /* ADD */ + + } + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_8; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_9; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_10; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_11; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_12; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_13; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_14; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_15; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_16; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_17; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0xa1: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_7; + break; + } + break; + case 0x02: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_18; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_8; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_9; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_10; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_11; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_12; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_13; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_14; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_15; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_16; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_17; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0xa2: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_7; + break; + } + break; + case 0x02: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_18; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_8; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_9; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_10; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_11; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_12; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_13; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_14; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_15; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_16; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_17; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0xa3: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_7; + break; + } + break; + case 0x02: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_18; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_8; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_9; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_10; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_11; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_12; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_13; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_14; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_15; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_16; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_17; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0xc0: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_1; + break; + } + break; + case 0xc1: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_1; + break; + } + break; + case 0xc2: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_1; + break; + } + break; + case 0xc3: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_1; + break; + } + break; + case 0xc4: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_2; + break; + } + break; + case 0xc5: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_2; + break; + } + break; + case 0xc6: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_2; + break; + } + break; + case 0xc7: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_2; + break; + } + break; + case 0xc8: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_3; + break; + } + break; + case 0xc9: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_3; + break; + } + break; + case 0xca: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_3; + break; + } + break; + case 0xcb: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_3; + break; + } + break; + case 0xcc: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_4; + break; + } + break; + case 0xcd: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_4; + break; + } + break; + case 0xce: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_4; + break; + } + break; + case 0xcf: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_4; + break; + } + break; + case 0xd0: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_5; + break; + } + break; + case 0xd1: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_5; + break; + } + break; + case 0xd2: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_5; + break; + } + break; + case 0xd3: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_5; + break; + } + break; + case 0xd4: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_6; + break; + } + break; + case 0xd5: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_6; + break; + } + break; + case 0xd6: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_6; + break; + } + break; + case 0xd7: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_6; + break; + } + break; + case 0xe0: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_7; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_8; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_9; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_10; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_11; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_12; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_13; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_14; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_15; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_16; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_17; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0xe1: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_7; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_8; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_9; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_10; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_11; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_12; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_13; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_14; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_15; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_16; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_17; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0xe2: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_7; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_8; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_9; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_10; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_11; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_12; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_13; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_14; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_15; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_16; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_17; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0xe3: + GETBYTE (); + switch (op[2] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_7; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_8; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_9; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_10; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_11; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_12; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_13; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_14; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_15; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_16; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[3] & 0x00) + { + case 0x00: + goto op_semantics_17; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: + { + /** 0000 1dsp bra.s %a0 */ +#line 708 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int dsp AU = op[0] & 0x07; + if (trace) + { + printf ("\033[33m%s\033[0m %02x\n", + "/** 0000 1dsp bra.s %a0 */", + op[0]); + printf (" dsp = 0x%x\n", dsp); + } + SYNTAX("bra.s %a0"); +#line 709 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(branch); Scc(RXC_always); DC(pc + dsp3map[dsp]); + + } + break; + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1a: + case 0x1b: + case 0x1c: + case 0x1d: + case 0x1e: + case 0x1f: + { + /** 0001 n dsp b%1.s %a0 */ +#line 698 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int n AU = (op[0] >> 3) & 0x01; +#line 698 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int dsp AU = op[0] & 0x07; + if (trace) + { + printf ("\033[33m%s\033[0m %02x\n", + "/** 0001 n dsp b%1.s %a0 */", + op[0]); + printf (" n = 0x%x,", n); + printf (" dsp = 0x%x\n", dsp); + } + SYNTAX("b%1.s %a0"); +#line 699 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(branch); Scc(n); DC(pc + dsp3map[dsp]); + + } + break; + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2a: + case 0x2b: + case 0x2c: + case 0x2d: + case 0x2f: + { + /** 0010 cond b%1.b %a0 */ +#line 701 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int cond AU = op[0] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x\n", + "/** 0010 cond b%1.b %a0 */", + op[0]); + printf (" cond = 0x%x\n", cond); + } + SYNTAX("b%1.b %a0"); +#line 702 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(branch); Scc(cond); DC(pc + IMMex (1)); + + } + break; + case 0x2e: + { + /** 0010 1110 bra.b %a0 */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x\n", + "/** 0010 1110 bra.b %a0 */", + op[0]); + } + SYNTAX("bra.b %a0"); +#line 712 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(branch); Scc(RXC_always); DC(pc + IMMex(1)); + + } + break; + case 0x38: + { + /** 0011 1000 bra.w %a0 */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x\n", + "/** 0011 1000 bra.w %a0 */", + op[0]); + } + SYNTAX("bra.w %a0"); +#line 715 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(branch); Scc(RXC_always); DC(pc + IMMex(2)); + + } + break; + case 0x39: + { + /** 0011 1001 bsr.w %a0 */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x\n", + "/** 0011 1001 bsr.w %a0 */", + op[0]); + } + SYNTAX("bsr.w %a0"); +#line 731 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(jsr); DC(pc + IMMex(2)); + + } + break; + case 0x3a: + case 0x3b: + { + /** 0011 101c b%1.w %a0 */ +#line 704 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int c AU = op[0] & 0x01; + if (trace) + { + printf ("\033[33m%s\033[0m %02x\n", + "/** 0011 101c b%1.w %a0 */", + op[0]); + printf (" c = 0x%x\n", c); + } + SYNTAX("b%1.w %a0"); +#line 705 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(branch); Scc(c); DC(pc + IMMex (2)); + + + } + break; + case 0x3c: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_19: + { + /** 0011 11sz d dst sppp mov%s #%1, %0 */ +#line 294 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = op[0] & 0x03; +#line 294 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int d AU = (op[1] >> 7) & 0x01; +#line 294 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int dst AU = (op[1] >> 4) & 0x07; +#line 294 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sppp AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0011 11sz d dst sppp mov%s #%1, %0 */", + op[0], op[1]); + printf (" sz = 0x%x,", sz); + printf (" d = 0x%x,", d); + printf (" dst = 0x%x,", dst); + printf (" sppp = 0x%x\n", sppp); + } + SYNTAX("mov%s #%1, %0"); +#line 295 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); sBWL (sz); DIs(dst, d*16+sppp, sz); SC(IMM(1)); F("----"); + + } + break; + } + break; + case 0x3d: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_19; + break; + } + break; + case 0x3e: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_19; + break; + } + break; + case 0x3f: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + { + /** 0011 1111 rega regb rtsd #%1, %2-%0 */ +#line 383 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rega AU = (op[1] >> 4) & 0x0f; +#line 383 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int regb AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0011 1111 rega regb rtsd #%1, %2-%0 */", + op[0], op[1]); + printf (" rega = 0x%x,", rega); + printf (" regb = 0x%x\n", regb); + } + SYNTAX("rtsd #%1, %2-%0"); +#line 384 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(rtsd); SC(IMM(1) * 4); S2R(rega); DR(regb); + + /*----------------------------------------------------------------------*/ + /* AND */ + + } + break; + } + break; + case 0x40: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_20: + { + /** 0100 00ss rsrc rdst sub %2%S2, %1 */ +#line 518 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[0] & 0x03; +#line 518 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[1] >> 4) & 0x0f; +#line 518 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0100 00ss rsrc rdst sub %2%S2, %1 */", + op[0], op[1]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("sub %2%S2, %1"); +#line 519 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sub); S2P(ss, rsrc); SR(rdst); DR(rdst); F("OSZC"); + + } + break; + } + break; + case 0x41: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_20; + break; + } + break; + case 0x42: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_20; + break; + } + break; + case 0x43: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_20; + break; + } + break; + case 0x44: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_21: + { + /** 0100 01ss rsrc rdst cmp %2%S2, %1 */ +#line 506 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[0] & 0x03; +#line 506 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[1] >> 4) & 0x0f; +#line 506 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0100 01ss rsrc rdst cmp %2%S2, %1 */", + op[0], op[1]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("cmp %2%S2, %1"); +#line 507 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sub); S2P(ss, rsrc); SR(rdst); F("OSZC"); + + } + break; + } + break; + case 0x45: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_21; + break; + } + break; + case 0x46: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_21; + break; + } + break; + case 0x47: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_21; + break; + } + break; + case 0x48: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_22: + { + /** 0100 10ss rsrc rdst add %1%S1, %0 */ +#line 482 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[0] & 0x03; +#line 482 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[1] >> 4) & 0x0f; +#line 482 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0100 10ss rsrc rdst add %1%S1, %0 */", + op[0], op[1]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("add %1%S1, %0"); +#line 483 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(add); SP(ss, rsrc); DR(rdst); F("OSZC"); + + } + break; + } + break; + case 0x49: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_22; + break; + } + break; + case 0x4a: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_22; + break; + } + break; + case 0x4b: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_22; + break; + } + break; + case 0x4c: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_23: + { + /** 0100 11ss rsrc rdst mul %1%S1, %0 */ +#line 579 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[0] & 0x03; +#line 579 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[1] >> 4) & 0x0f; +#line 579 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0100 11ss rsrc rdst mul %1%S1, %0 */", + op[0], op[1]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("mul %1%S1, %0"); +#line 580 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mul); SP(ss, rsrc); DR(rdst); F("O---"); + + } + break; + } + break; + case 0x4d: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_23; + break; + } + break; + case 0x4e: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_23; + break; + } + break; + case 0x4f: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_23; + break; + } + break; + case 0x50: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_24: + { + /** 0101 00ss rsrc rdst and %1%S1, %0 */ +#line 395 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[0] & 0x03; +#line 395 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[1] >> 4) & 0x0f; +#line 395 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0101 00ss rsrc rdst and %1%S1, %0 */", + op[0], op[1]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("and %1%S1, %0"); +#line 396 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(and); SP(ss, rsrc); DR(rdst); F("-SZ-"); + + } + break; + } + break; + case 0x51: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_24; + break; + } + break; + case 0x52: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_24; + break; + } + break; + case 0x53: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_24; + break; + } + break; + case 0x54: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_25: + { + /** 0101 01ss rsrc rdst or %1%S1, %0 */ +#line 413 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[0] & 0x03; +#line 413 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[1] >> 4) & 0x0f; +#line 413 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0101 01ss rsrc rdst or %1%S1, %0 */", + op[0], op[1]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("or %1%S1, %0"); +#line 414 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(or); SP(ss, rsrc); DR(rdst); F("-SZ-"); + + } + break; + } + break; + case 0x55: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_25; + break; + } + break; + case 0x56: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_25; + break; + } + break; + case 0x57: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_25; + break; + } + break; + case 0x58: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_26: + { + /** 0101 1 s ss rsrc rdst movu%s %1, %0 */ +#line 334 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int s AU = (op[0] >> 2) & 0x01; +#line 334 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[0] & 0x03; +#line 334 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[1] >> 4) & 0x0f; +#line 334 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0101 1 s ss rsrc rdst movu%s %1, %0 */", + op[0], op[1]); + printf (" s = 0x%x,", s); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("movu%s %1, %0"); +#line 335 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); uBWL(s); SD(ss, rsrc, s); DR(rdst); F("----"); + + } + break; + } + break; + case 0x59: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_26; + break; + } + break; + case 0x5a: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_26; + break; + } + break; + case 0x5b: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_26; + break; + } + break; + case 0x5c: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_26; + break; + } + break; + case 0x5d: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_26; + break; + } + break; + case 0x5e: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_26; + break; + } + break; + case 0x5f: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_26; + break; + } + break; + case 0x60: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + { + /** 0110 0000 immm rdst sub #%2, %0 */ +#line 515 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int immm AU = (op[1] >> 4) & 0x0f; +#line 515 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0110 0000 immm rdst sub #%2, %0 */", + op[0], op[1]); + printf (" immm = 0x%x,", immm); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("sub #%2, %0"); +#line 516 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sub); S2C(immm); SR(rdst); DR(rdst); F("OSZC"); + + } + break; + } + break; + case 0x61: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + { + /** 0110 0001 immm rdst cmp #%2, %1 */ +#line 497 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int immm AU = (op[1] >> 4) & 0x0f; +#line 497 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0110 0001 immm rdst cmp #%2, %1 */", + op[0], op[1]); + printf (" immm = 0x%x,", immm); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("cmp #%2, %1"); +#line 498 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sub); S2C(immm); SR(rdst); F("OSZC"); + + } + break; + } + break; + case 0x62: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + { + /** 0110 0010 immm rdst add #%1, %0 */ +#line 479 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int immm AU = (op[1] >> 4) & 0x0f; +#line 479 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0110 0010 immm rdst add #%1, %0 */", + op[0], op[1]); + printf (" immm = 0x%x,", immm); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("add #%1, %0"); +#line 480 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(add); SC(immm); DR(rdst); F("OSZC"); + + } + break; + } + break; + case 0x63: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + { + /** 0110 0011 immm rdst mul #%1, %0 */ +#line 573 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int immm AU = (op[1] >> 4) & 0x0f; +#line 573 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0110 0011 immm rdst mul #%1, %0 */", + op[0], op[1]); + printf (" immm = 0x%x,", immm); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("mul #%1, %0"); +#line 574 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mul); DR(rdst); SC(immm); F("O---"); + + } + break; + } + break; + case 0x64: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + { + /** 0110 0100 immm rdst and #%1, %0 */ +#line 389 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int immm AU = (op[1] >> 4) & 0x0f; +#line 389 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0110 0100 immm rdst and #%1, %0 */", + op[0], op[1]); + printf (" immm = 0x%x,", immm); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("and #%1, %0"); +#line 390 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(and); SC(immm); DR(rdst); F("-SZ-"); + + } + break; + } + break; + case 0x65: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + { + /** 0110 0101 immm rdst or #%1, %0 */ +#line 407 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int immm AU = (op[1] >> 4) & 0x0f; +#line 407 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0110 0101 immm rdst or #%1, %0 */", + op[0], op[1]); + printf (" immm = 0x%x,", immm); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("or #%1, %0"); +#line 408 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(or); SC(immm); DR(rdst); F("-SZ-"); + + } + break; + } + break; + case 0x66: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + { + /** 0110 0110 immm rdst mov%s #%1, %0 */ +#line 291 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int immm AU = (op[1] >> 4) & 0x0f; +#line 291 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0110 0110 immm rdst mov%s #%1, %0 */", + op[0], op[1]); + printf (" immm = 0x%x,", immm); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("mov%s #%1, %0"); +#line 292 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); DR(rdst); SC(immm); F("----"); + + } + break; + } + break; + case 0x67: + { + /** 0110 0111 rtsd #%1 */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x\n", + "/** 0110 0111 rtsd #%1 */", + op[0]); + } + SYNTAX("rtsd #%1"); +#line 381 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(rtsd); SC(IMM(1) * 4); + + } + break; + case 0x68: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_27: + { + /** 0110 100i mmmm rdst shlr #%2, %0 */ +#line 659 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int i AU = op[0] & 0x01; +#line 659 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mmmm AU = (op[1] >> 4) & 0x0f; +#line 659 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0110 100i mmmm rdst shlr #%2, %0 */", + op[0], op[1]); + printf (" i = 0x%x,", i); + printf (" mmmm = 0x%x,", mmmm); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("shlr #%2, %0"); +#line 660 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(shlr); S2C(i*16+mmmm); SR(rdst); DR(rdst); F("-SZC"); + + } + break; + } + break; + case 0x69: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_27; + break; + } + break; + case 0x6a: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_28: + { + /** 0110 101i mmmm rdst shar #%2, %0 */ +#line 649 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int i AU = op[0] & 0x01; +#line 649 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mmmm AU = (op[1] >> 4) & 0x0f; +#line 649 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0110 101i mmmm rdst shar #%2, %0 */", + op[0], op[1]); + printf (" i = 0x%x,", i); + printf (" mmmm = 0x%x,", mmmm); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("shar #%2, %0"); +#line 650 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(shar); S2C(i*16+mmmm); SR(rdst); DR(rdst); F("0SZC"); + + } + break; + } + break; + case 0x6b: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_28; + break; + } + break; + case 0x6c: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_29: + { + /** 0110 110i mmmm rdst shll #%2, %0 */ +#line 639 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int i AU = op[0] & 0x01; +#line 639 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mmmm AU = (op[1] >> 4) & 0x0f; +#line 639 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0110 110i mmmm rdst shll #%2, %0 */", + op[0], op[1]); + printf (" i = 0x%x,", i); + printf (" mmmm = 0x%x,", mmmm); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("shll #%2, %0"); +#line 640 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(shll); S2C(i*16+mmmm); SR(rdst); DR(rdst); F("OSZC"); + + } + break; + } + break; + case 0x6d: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_29; + break; + } + break; + case 0x6e: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + { + /** 0110 1110 dsta dstb pushm %1-%2 */ +#line 347 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int dsta AU = (op[1] >> 4) & 0x0f; +#line 347 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int dstb AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0110 1110 dsta dstb pushm %1-%2 */", + op[0], op[1]); + printf (" dsta = 0x%x,", dsta); + printf (" dstb = 0x%x\n", dstb); + } + SYNTAX("pushm %1-%2"); +#line 348 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(pushm); SR(dsta); S2R(dstb); F("----"); + + } + break; + } + break; + case 0x6f: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + { + /** 0110 1111 dsta dstb popm %1-%2 */ +#line 344 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int dsta AU = (op[1] >> 4) & 0x0f; +#line 344 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int dstb AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0110 1111 dsta dstb popm %1-%2 */", + op[0], op[1]); + printf (" dsta = 0x%x,", dsta); + printf (" dstb = 0x%x\n", dstb); + } + SYNTAX("popm %1-%2"); +#line 345 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(popm); SR(dsta); S2R(dstb); F("----"); + + } + break; + } + break; + case 0x70: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_30: + { + /** 0111 00im rsrc rdst add #%1, %2, %0 */ +#line 488 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = op[0] & 0x03; +#line 488 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[1] >> 4) & 0x0f; +#line 488 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 00im rsrc rdst add #%1, %2, %0 */", + op[0], op[1]); + printf (" im = 0x%x,", im); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("add #%1, %2, %0"); +#line 489 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(add); SC(IMMex(im)); S2R(rsrc); DR(rdst); F("OSZC"); + + } + break; + } + break; + case 0x71: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_30; + break; + } + break; + case 0x72: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_30; + break; + } + break; + case 0x73: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_30; + break; + } + break; + case 0x74: + GETBYTE (); + switch (op[1] & 0xf0) + { + case 0x00: + op_semantics_31: + { + /** 0111 01im 0000 rsrc cmp #%2, %1%S1 */ +#line 500 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = op[0] & 0x03; +#line 500 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 01im 0000 rsrc cmp #%2, %1%S1 */", + op[0], op[1]); + printf (" im = 0x%x,", im); + printf (" rsrc = 0x%x\n", rsrc); + } + SYNTAX("cmp #%2, %1%S1"); +#line 501 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sub); SR(rsrc); S2C(IMMex(im)); F("OSZC"); + + } + break; + case 0x10: + op_semantics_32: + { + /** 0111 01im 0001rdst mul #%1, %0 */ +#line 576 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = op[0] & 0x03; +#line 576 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 01im 0001rdst mul #%1, %0 */", + op[0], op[1]); + printf (" im = 0x%x,", im); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("mul #%1, %0"); +#line 577 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mul); DR(rdst); SC(IMMex(im)); F("O---"); + + } + break; + case 0x20: + op_semantics_33: + { + /** 0111 01im 0010 rdst and #%1, %0 */ +#line 392 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = op[0] & 0x03; +#line 392 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 01im 0010 rdst and #%1, %0 */", + op[0], op[1]); + printf (" im = 0x%x,", im); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("and #%1, %0"); +#line 393 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(and); SC(IMMex(im)); DR(rdst); F("-SZ-"); + + } + break; + case 0x30: + op_semantics_34: + { + /** 0111 01im 0011 rdst or #%1, %0 */ +#line 410 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = op[0] & 0x03; +#line 410 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 01im 0011 rdst or #%1, %0 */", + op[0], op[1]); + printf (" im = 0x%x,", im); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("or #%1, %0"); +#line 411 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(or); SC(IMMex(im)); DR(rdst); F("-SZ-"); + + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x75: + GETBYTE (); + switch (op[1] & 0xff) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: + goto op_semantics_31; + break; + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1a: + case 0x1b: + case 0x1c: + case 0x1d: + case 0x1e: + case 0x1f: + goto op_semantics_32; + break; + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2a: + case 0x2b: + case 0x2c: + case 0x2d: + case 0x2e: + case 0x2f: + goto op_semantics_33; + break; + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3a: + case 0x3b: + case 0x3c: + case 0x3d: + case 0x3e: + case 0x3f: + goto op_semantics_34; + break; + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: + { + /** 0111 0101 0100 rdst mov%s #%1, %0 */ +#line 285 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 0101 0100 rdst mov%s #%1, %0 */", + op[0], op[1]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("mov%s #%1, %0"); +#line 286 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); DR(rdst); SC(IMM (1)); F("----"); + + } + break; + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5a: + case 0x5b: + case 0x5c: + case 0x5d: + case 0x5e: + case 0x5f: + { + /** 0111 0101 0101 rsrc cmp #%2, %1 */ +#line 503 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 0101 0101 rsrc cmp #%2, %1 */", + op[0], op[1]); + printf (" rsrc = 0x%x\n", rsrc); + } + SYNTAX("cmp #%2, %1"); +#line 504 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sub); SR(rsrc); S2C(IMM(1)); F("OSZC"); + + } + break; + case 0x60: + { + /** 0111 0101 0110 0000 int #%1 */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 0101 0110 0000 int #%1 */", + op[0], op[1]); + } + SYNTAX("int #%1"); +#line 963 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(int); SC(IMM(1)); + + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x76: + GETBYTE (); + switch (op[1] & 0xf0) + { + case 0x00: + goto op_semantics_31; + break; + case 0x10: + goto op_semantics_32; + break; + case 0x20: + goto op_semantics_33; + break; + case 0x30: + goto op_semantics_34; + break; + default: UNSUPPORTED(); break; + } + break; + case 0x77: + GETBYTE (); + switch (op[1] & 0xf0) + { + case 0x00: + goto op_semantics_31; + break; + case 0x10: + goto op_semantics_32; + break; + case 0x20: + goto op_semantics_33; + break; + case 0x30: + goto op_semantics_34; + break; + default: UNSUPPORTED(); break; + } + break; + case 0x78: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_35: + { + /** 0111 100b ittt rdst bset #%1, %0 */ +#line 874 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int b AU = op[0] & 0x01; +#line 874 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ittt AU = (op[1] >> 4) & 0x0f; +#line 874 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 100b ittt rdst bset #%1, %0 */", + op[0], op[1]); + printf (" b = 0x%x,", b); + printf (" ittt = 0x%x,", ittt); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("bset #%1, %0"); +#line 875 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(bset); BWL(LSIZE); SC(b*16+ittt); DR(rdst); F("----"); + + + } + break; + } + break; + case 0x79: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_35; + break; + } + break; + case 0x7a: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_36: + { + /** 0111 101b ittt rdst bclr #%1, %0 */ +#line 884 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int b AU = op[0] & 0x01; +#line 884 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ittt AU = (op[1] >> 4) & 0x0f; +#line 884 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 101b ittt rdst bclr #%1, %0 */", + op[0], op[1]); + printf (" b = 0x%x,", b); + printf (" ittt = 0x%x,", ittt); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("bclr #%1, %0"); +#line 885 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(bclr); BWL(LSIZE); SC(b*16+ittt); DR(rdst); F("----"); + + + } + break; + } + break; + case 0x7b: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_36; + break; + } + break; + case 0x7c: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_37: + { + /** 0111 110b ittt rdst btst #%2, %1 */ +#line 894 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int b AU = op[0] & 0x01; +#line 894 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ittt AU = (op[1] >> 4) & 0x0f; +#line 894 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 110b ittt rdst btst #%2, %1 */", + op[0], op[1]); + printf (" b = 0x%x,", b); + printf (" ittt = 0x%x,", ittt); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("btst #%2, %1"); +#line 895 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(btst); BWL(LSIZE); S2C(b*16+ittt); SR(rdst); F("--ZC"); + + + } + break; + } + break; + case 0x7d: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_37; + break; + } + break; + case 0x7e: + GETBYTE (); + switch (op[1] & 0xf0) + { + case 0x00: + { + /** 0111 1110 0000 rdst not %0 */ +#line 437 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1110 0000 rdst not %0 */", + op[0], op[1]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("not %0"); +#line 438 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(xor); DR(rdst); SR(rdst); S2C(~0); F("-SZ-"); + + } + break; + case 0x10: + { + /** 0111 1110 0001 rdst neg %0 */ +#line 458 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1110 0001 rdst neg %0 */", + op[0], op[1]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("neg %0"); +#line 459 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sub); DR(rdst); SC(0); S2R(rdst); F("OSZC"); + + } + break; + case 0x20: + { + /** 0111 1110 0010 rdst abs %0 */ +#line 540 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1110 0010 rdst abs %0 */", + op[0], op[1]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("abs %0"); +#line 541 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(abs); DR(rdst); SR(rdst); F("OSZ-"); + + } + break; + case 0x30: + { + /** 0111 1110 0011 rdst sat %0 */ +#line 814 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1110 0011 rdst sat %0 */", + op[0], op[1]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("sat %0"); +#line 815 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sat); DR (rdst); + + } + break; + case 0x40: + { + /** 0111 1110 0100 rdst rorc %0 */ +#line 674 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1110 0100 rdst rorc %0 */", + op[0], op[1]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("rorc %0"); +#line 675 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(rorc); DR(rdst); F("-SZC"); + + } + break; + case 0x50: + { + /** 0111 1110 0101 rdst rolc %0 */ +#line 671 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1110 0101 rdst rolc %0 */", + op[0], op[1]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("rolc %0"); +#line 672 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(rolc); DR(rdst); F("-SZC"); + + } + break; + case 0x80: + case 0x90: + case 0xa0: + { + /** 0111 1110 10sz rsrc push%s %1 */ +#line 353 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = (op[1] >> 4) & 0x03; +#line 353 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1110 10sz rsrc push%s %1 */", + op[0], op[1]); + printf (" sz = 0x%x,", sz); + printf (" rsrc = 0x%x\n", rsrc); + } + SYNTAX("push%s %1"); +#line 354 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); BWL(sz); OP(0, RX_Operand_Predec, 0, 0); SR(rsrc); F("----"); + + } + break; + case 0xb0: + { + /** 0111 1110 1011 rdst pop %0 */ +#line 350 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1110 1011 rdst pop %0 */", + op[0], op[1]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("pop %0"); +#line 351 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); OP(1, RX_Operand_Postinc, 0, 0); DR(rdst); F("----"); + + } + break; + case 0xc0: + case 0xd0: + { + /** 0111 1110 110 crsrc pushc %1 */ +#line 926 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int crsrc AU = op[1] & 0x1f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1110 110 crsrc pushc %1 */", + op[0], op[1]); + printf (" crsrc = 0x%x\n", crsrc); + } + SYNTAX("pushc %1"); +#line 927 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); OP(0, RX_Operand_Predec, 0, 0); SR(crsrc + 16); + + } + break; + case 0xe0: + case 0xf0: + { + /** 0111 1110 111 crdst popc %0 */ +#line 923 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int crdst AU = op[1] & 0x1f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1110 111 crdst popc %0 */", + op[0], op[1]); + printf (" crdst = 0x%x\n", crdst); + } + SYNTAX("popc %0"); +#line 924 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); OP(1, RX_Operand_Postinc, 0, 0); DR(crdst + 16); + + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x7f: + GETBYTE (); + switch (op[1] & 0xff) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: + { + /** 0111 1111 0000 rsrc jmp %0 */ +#line 724 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 0000 rsrc jmp %0 */", + op[0], op[1]); + printf (" rsrc = 0x%x\n", rsrc); + } + SYNTAX("jmp %0"); +#line 725 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(branch); Scc(RXC_always); DR(rsrc); + + } + break; + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1a: + case 0x1b: + case 0x1c: + case 0x1d: + case 0x1e: + case 0x1f: + { + /** 0111 1111 0001 rsrc jsr %0 */ +#line 727 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 0001 rsrc jsr %0 */", + op[0], op[1]); + printf (" rsrc = 0x%x\n", rsrc); + } + SYNTAX("jsr %0"); +#line 728 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(jsr); DR(rsrc); + + } + break; + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: + { + /** 0111 1111 0100 rsrc bra.l %0 */ +#line 720 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 0100 rsrc bra.l %0 */", + op[0], op[1]); + printf (" rsrc = 0x%x\n", rsrc); + } + SYNTAX("bra.l %0"); +#line 721 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(branchrel); Scc(RXC_always); DR(rsrc); + + + } + break; + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5a: + case 0x5b: + case 0x5c: + case 0x5d: + case 0x5e: + case 0x5f: + { + /** 0111 1111 0101 rsrc bsr.l %0 */ +#line 736 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 0101 rsrc bsr.l %0 */", + op[0], op[1]); + printf (" rsrc = 0x%x\n", rsrc); + } + SYNTAX("bsr.l %0"); +#line 737 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(jsrrel); DR(rsrc); + + } + break; + case 0x80: + case 0x81: + case 0x82: + { + /** 0111 1111 1000 00sz suntil%s */ +#line 760 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = op[1] & 0x03; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 1000 00sz suntil%s */", + op[0], op[1]); + printf (" sz = 0x%x\n", sz); + } + SYNTAX("suntil%s"); +#line 761 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(suntil); BWL(sz); F("OSZC"); + + } + break; + case 0x83: + { + /** 0111 1111 1000 0011 scmpu */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 1000 0011 scmpu */", + op[0], op[1]); + } + SYNTAX("scmpu"); +#line 752 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(scmpu); F("--ZC"); + + } + break; + case 0x84: + case 0x85: + case 0x86: + { + /** 0111 1111 1000 01sz swhile%s */ +#line 763 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = op[1] & 0x03; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 1000 01sz swhile%s */", + op[0], op[1]); + printf (" sz = 0x%x\n", sz); + } + SYNTAX("swhile%s"); +#line 764 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(swhile); BWL(sz); F("OSZC"); + + } + break; + case 0x87: + { + /** 0111 1111 1000 0111 smovu */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 1000 0111 smovu */", + op[0], op[1]); + } + SYNTAX("smovu"); +#line 755 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(smovu); + + } + break; + case 0x88: + case 0x89: + case 0x8a: + { + /** 0111 1111 1000 10sz sstr%s */ +#line 769 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = op[1] & 0x03; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 1000 10sz sstr%s */", + op[0], op[1]); + printf (" sz = 0x%x\n", sz); + } + SYNTAX("sstr%s"); +#line 770 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sstr); BWL(sz); + + /*----------------------------------------------------------------------*/ + /* RMPA */ + + } + break; + case 0x8b: + { + /** 0111 1111 1000 1011 smovb */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 1000 1011 smovb */", + op[0], op[1]); + } + SYNTAX("smovb"); +#line 758 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(smovb); + + } + break; + case 0x8c: + case 0x8d: + case 0x8e: + { + /** 0111 1111 1000 11sz rmpa%s */ +#line 775 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = op[1] & 0x03; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 1000 11sz rmpa%s */", + op[0], op[1]); + printf (" sz = 0x%x\n", sz); + } + SYNTAX("rmpa%s"); +#line 776 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(rmpa); BWL(sz); F("OS--"); + + /*----------------------------------------------------------------------*/ + /* HI/LO stuff */ + + } + break; + case 0x8f: + { + /** 0111 1111 1000 1111 smovf */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 1000 1111 smovf */", + op[0], op[1]); + } + SYNTAX("smovf"); +#line 767 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(smovf); + + } + break; + case 0x93: + { + /** 0111 1111 1001 0011 satr */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 1001 0011 satr */", + op[0], op[1]); + } + SYNTAX("satr"); +#line 818 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(satr); + + /*----------------------------------------------------------------------*/ + /* FLOAT */ + + } + break; + case 0x94: + { + /** 0111 1111 1001 0100 rtfi */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 1001 0100 rtfi */", + op[0], op[1]); + } + SYNTAX("rtfi"); +#line 951 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(rtfi); + + } + break; + case 0x95: + { + /** 0111 1111 1001 0101 rte */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 1001 0101 rte */", + op[0], op[1]); + } + SYNTAX("rte"); +#line 954 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(rte); + + } + break; + case 0x96: + { + /** 0111 1111 1001 0110 wait */ + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 1001 0110 wait */", + op[0], op[1]); + } + SYNTAX("wait"); +#line 966 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(wait); + + /*----------------------------------------------------------------------*/ + /* SCcnd */ + + } + break; + case 0xa0: + case 0xa1: + case 0xa2: + case 0xa3: + case 0xa4: + case 0xa5: + case 0xa6: + case 0xa7: + case 0xa8: + case 0xa9: + case 0xaa: + case 0xab: + case 0xac: + case 0xad: + case 0xae: + case 0xaf: + { + /** 0111 1111 1010 rdst setpsw %0 */ +#line 920 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 1010 rdst setpsw %0 */", + op[0], op[1]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("setpsw %0"); +#line 921 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(setpsw); DF(rdst); + + } + break; + case 0xb0: + case 0xb1: + case 0xb2: + case 0xb3: + case 0xb4: + case 0xb5: + case 0xb6: + case 0xb7: + case 0xb8: + case 0xb9: + case 0xba: + case 0xbb: + case 0xbc: + case 0xbd: + case 0xbe: + case 0xbf: + { + /** 0111 1111 1011 rdst clrpsw %0 */ +#line 917 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 0111 1111 1011 rdst clrpsw %0 */", + op[0], op[1]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("clrpsw %0"); +#line 918 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(clrpsw); DF(rdst); + + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x80: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_38: + { + /** 10sz 0dsp a dst b src mov%s %1, %0 */ +#line 311 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = (op[0] >> 4) & 0x03; +#line 311 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int dsp AU = op[0] & 0x07; +#line 311 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int a AU = (op[1] >> 7) & 0x01; +#line 311 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int dst AU = (op[1] >> 4) & 0x07; +#line 311 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int b AU = (op[1] >> 3) & 0x01; +#line 311 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int src AU = op[1] & 0x07; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 10sz 0dsp a dst b src mov%s %1, %0 */", + op[0], op[1]); + printf (" sz = 0x%x,", sz); + printf (" dsp = 0x%x,", dsp); + printf (" a = 0x%x,", a); + printf (" dst = 0x%x,", dst); + printf (" b = 0x%x,", b); + printf (" src = 0x%x\n", src); + } + SYNTAX("mov%s %1, %0"); +#line 312 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); sBWL(sz); DIs(dst, dsp*4+a*2+b, sz); SR(src); F("----"); + + } + break; + } + break; + case 0x81: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0x82: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0x83: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0x84: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0x85: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0x86: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0x87: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0x88: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_39: + { + /** 10sz 1dsp a src b dst mov%s %1, %0 */ +#line 308 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = (op[0] >> 4) & 0x03; +#line 308 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int dsp AU = op[0] & 0x07; +#line 308 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int a AU = (op[1] >> 7) & 0x01; +#line 308 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int src AU = (op[1] >> 4) & 0x07; +#line 308 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int b AU = (op[1] >> 3) & 0x01; +#line 308 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int dst AU = op[1] & 0x07; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 10sz 1dsp a src b dst mov%s %1, %0 */", + op[0], op[1]); + printf (" sz = 0x%x,", sz); + printf (" dsp = 0x%x,", dsp); + printf (" a = 0x%x,", a); + printf (" src = 0x%x,", src); + printf (" b = 0x%x,", b); + printf (" dst = 0x%x\n", dst); + } + SYNTAX("mov%s %1, %0"); +#line 309 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); sBWL(sz); DR(dst); SIs(src, dsp*4+a*2+b, sz); F("----"); + + } + break; + } + break; + case 0x89: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0x8a: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0x8b: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0x8c: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0x8d: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0x8e: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0x8f: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0x90: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0x91: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0x92: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0x93: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0x94: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0x95: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0x96: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0x97: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0x98: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0x99: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0x9a: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0x9b: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0x9c: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0x9d: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0x9e: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0x9f: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0xa0: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0xa1: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0xa2: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0xa3: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0xa4: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0xa5: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0xa6: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0xa7: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_38; + break; + } + break; + case 0xa8: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0xa9: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0xaa: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0xab: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0xac: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0xad: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0xae: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0xaf: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_39; + break; + } + break; + case 0xb0: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_40: + { + /** 1011 w dsp a src b dst movu%s %1, %0 */ +#line 331 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int w AU = (op[0] >> 3) & 0x01; +#line 331 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int dsp AU = op[0] & 0x07; +#line 331 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int a AU = (op[1] >> 7) & 0x01; +#line 331 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int src AU = (op[1] >> 4) & 0x07; +#line 331 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int b AU = (op[1] >> 3) & 0x01; +#line 331 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int dst AU = op[1] & 0x07; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 1011 w dsp a src b dst movu%s %1, %0 */", + op[0], op[1]); + printf (" w = 0x%x,", w); + printf (" dsp = 0x%x,", dsp); + printf (" a = 0x%x,", a); + printf (" src = 0x%x,", src); + printf (" b = 0x%x,", b); + printf (" dst = 0x%x\n", dst); + } + SYNTAX("movu%s %1, %0"); +#line 332 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); uBWL(w); DR(dst); SIs(src, dsp*4+a*2+b, w); F("----"); + + } + break; + } + break; + case 0xb1: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_40; + break; + } + break; + case 0xb2: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_40; + break; + } + break; + case 0xb3: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_40; + break; + } + break; + case 0xb4: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_40; + break; + } + break; + case 0xb5: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_40; + break; + } + break; + case 0xb6: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_40; + break; + } + break; + case 0xb7: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_40; + break; + } + break; + case 0xb8: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_40; + break; + } + break; + case 0xb9: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_40; + break; + } + break; + case 0xba: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_40; + break; + } + break; + case 0xbb: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_40; + break; + } + break; + case 0xbc: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_40; + break; + } + break; + case 0xbd: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_40; + break; + } + break; + case 0xbe: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_40; + break; + } + break; + case 0xbf: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_40; + break; + } + break; + case 0xc0: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_41: + { + /** 11sz sd ss rsrc rdst mov%s %1, %0 */ +#line 297 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = (op[0] >> 4) & 0x03; +#line 297 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = (op[0] >> 2) & 0x03; +#line 297 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[0] & 0x03; +#line 297 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[1] >> 4) & 0x0f; +#line 297 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 11sz sd ss rsrc rdst mov%s %1, %0 */", + op[0], op[1]); + printf (" sz = 0x%x,", sz); + printf (" sd = 0x%x,", sd); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("mov%s %1, %0"); +#line 298 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); sBWL(sz); F("----"); + if ((ss == 3) && (sd != 3)) + { + SD(ss, rdst, sz); DD(sd, rsrc, sz); + } + else + { + SD(ss, rsrc, sz); DD(sd, rdst, sz); + } + + } + break; + } + break; + case 0xc1: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xc2: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xc3: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xc4: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xc5: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xc6: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xc7: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xc8: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xc9: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xca: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xcb: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xcc: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xcd: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xce: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xcf: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xd0: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xd1: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xd2: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xd3: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xd4: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xd5: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xd6: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xd7: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xd8: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xd9: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xda: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xdb: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xdc: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xdd: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xde: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xdf: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xe0: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xe1: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xe2: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xe3: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xe4: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xe5: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xe6: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xe7: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xe8: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xe9: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xea: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xeb: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xec: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xed: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xee: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xef: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_41; + break; + } + break; + case 0xf0: + GETBYTE (); + switch (op[1] & 0x08) + { + case 0x00: + op_semantics_42: + { + /** 1111 00sd rdst 0bit bset #%1, %0%S0 */ +#line 868 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[0] & 0x03; +#line 868 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = (op[1] >> 4) & 0x0f; +#line 868 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int bit AU = op[1] & 0x07; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 1111 00sd rdst 0bit bset #%1, %0%S0 */", + op[0], op[1]); + printf (" sd = 0x%x,", sd); + printf (" rdst = 0x%x,", rdst); + printf (" bit = 0x%x\n", bit); + } + SYNTAX("bset #%1, %0%S0"); +#line 869 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(bset); BWL(BSIZE); SC(bit); DD(sd, rdst, BSIZE); F("----"); + + } + break; + case 0x08: + op_semantics_43: + { + /** 1111 00sd rdst 1bit bclr #%1, %0%S0 */ +#line 878 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[0] & 0x03; +#line 878 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = (op[1] >> 4) & 0x0f; +#line 878 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int bit AU = op[1] & 0x07; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 1111 00sd rdst 1bit bclr #%1, %0%S0 */", + op[0], op[1]); + printf (" sd = 0x%x,", sd); + printf (" rdst = 0x%x,", rdst); + printf (" bit = 0x%x\n", bit); + } + SYNTAX("bclr #%1, %0%S0"); +#line 879 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(bclr); BWL(BSIZE); SC(bit); DD(sd, rdst, BSIZE); F("----"); + + } + break; + } + break; + case 0xf1: + GETBYTE (); + switch (op[1] & 0x08) + { + case 0x00: + goto op_semantics_42; + break; + case 0x08: + goto op_semantics_43; + break; + } + break; + case 0xf2: + GETBYTE (); + switch (op[1] & 0x08) + { + case 0x00: + goto op_semantics_42; + break; + case 0x08: + goto op_semantics_43; + break; + } + break; + case 0xf3: + GETBYTE (); + switch (op[1] & 0x08) + { + case 0x00: + goto op_semantics_42; + break; + case 0x08: + goto op_semantics_43; + break; + } + break; + case 0xf4: + GETBYTE (); + switch (op[1] & 0x0c) + { + case 0x00: + case 0x04: + op_semantics_44: + { + /** 1111 01sd rdst 0bit btst #%2, %1%S1 */ +#line 888 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[0] & 0x03; +#line 888 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = (op[1] >> 4) & 0x0f; +#line 888 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int bit AU = op[1] & 0x07; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 1111 01sd rdst 0bit btst #%2, %1%S1 */", + op[0], op[1]); + printf (" sd = 0x%x,", sd); + printf (" rdst = 0x%x,", rdst); + printf (" bit = 0x%x\n", bit); + } + SYNTAX("btst #%2, %1%S1"); +#line 889 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(btst); BWL(BSIZE); S2C(bit); SD(sd, rdst, BSIZE); F("--ZC"); + + } + break; + case 0x08: + op_semantics_45: + { + /** 1111 01ss rsrc 10sz push%s %1 */ +#line 356 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[0] & 0x03; +#line 356 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[1] >> 4) & 0x0f; +#line 356 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = op[1] & 0x03; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 1111 01ss rsrc 10sz push%s %1 */", + op[0], op[1]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" sz = 0x%x\n", sz); + } + SYNTAX("push%s %1"); +#line 357 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); BWL(sz); OP(0, RX_Operand_Predec, 0, 0); SD(ss, rsrc, sz); F("----"); + + /*----------------------------------------------------------------------*/ + /* XCHG */ + + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0xf5: + GETBYTE (); + switch (op[1] & 0x0c) + { + case 0x00: + case 0x04: + goto op_semantics_44; + break; + case 0x08: + goto op_semantics_45; + break; + default: UNSUPPORTED(); break; + } + break; + case 0xf6: + GETBYTE (); + switch (op[1] & 0x0c) + { + case 0x00: + case 0x04: + goto op_semantics_44; + break; + case 0x08: + goto op_semantics_45; + break; + default: UNSUPPORTED(); break; + } + break; + case 0xf7: + GETBYTE (); + switch (op[1] & 0x0c) + { + case 0x00: + case 0x04: + goto op_semantics_44; + break; + case 0x08: + goto op_semantics_45; + break; + default: UNSUPPORTED(); break; + } + break; + case 0xf8: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + op_semantics_46: + { + /** 1111 10sd rdst im sz mov%s #%1, %0 */ +#line 288 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[0] & 0x03; +#line 288 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = (op[1] >> 4) & 0x0f; +#line 288 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = (op[1] >> 2) & 0x03; +#line 288 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = op[1] & 0x03; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x\n", + "/** 1111 10sd rdst im sz mov%s #%1, %0 */", + op[0], op[1]); + printf (" sd = 0x%x,", sd); + printf (" rdst = 0x%x,", rdst); + printf (" im = 0x%x,", im); + printf (" sz = 0x%x\n", sz); + } + SYNTAX("mov%s #%1, %0"); +#line 289 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); sBWL (sz); DD(sd, rdst, sz); SC(IMMex(im)); F("----"); + + } + break; + } + break; + case 0xf9: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_46; + break; + } + break; + case 0xfa: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_46; + break; + } + break; + case 0xfb: + GETBYTE (); + switch (op[1] & 0x00) + { + case 0x00: + goto op_semantics_46; + break; + } + break; + case 0xfc: + GETBYTE (); + switch (op[1] & 0xff) + { + case 0x03: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1100 0000 0011 rsrc rdst sbb %1, %0 */ +#line 530 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 530 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0000 0011 rsrc rdst sbb %1, %0 */", + op[0], op[1], op[2]); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("sbb %1, %0"); +#line 531 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sbb); SR (rsrc); DR(rdst); F("OSZC"); + + /* FIXME: only supports .L */ + } + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1100 0000 0111 rsrc rdst neg %2, %0 */ +#line 461 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 461 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0000 0111 rsrc rdst neg %2, %0 */", + op[0], op[1], op[2]); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("neg %2, %0"); +#line 462 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sub); DR(rdst); SC(0); S2R(rsrc); F("OSZC"); + + /*----------------------------------------------------------------------*/ + /* ADC */ + + } + break; + } + break; + case 0x0b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1100 0000 1011 rsrc rdst adc %1, %0 */ +#line 470 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 470 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0000 1011 rsrc rdst adc %1, %0 */", + op[0], op[1], op[2]); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("adc %1, %0"); +#line 471 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(adc); SR(rsrc); DR(rdst); F("OSZC"); + + } + break; + } + break; + case 0x0f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1100 0000 1111 rsrc rdst abs %1, %0 */ +#line 543 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 543 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0000 1111 rsrc rdst abs %1, %0 */", + op[0], op[1], op[2]); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("abs %1, %0"); +#line 544 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(abs); DR(rdst); SR(rsrc); F("OSZ-"); + + /*----------------------------------------------------------------------*/ + /* MAX */ + + } + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_47: + { + /** 1111 1100 0001 00ss rsrc rdst max %1%S1, %0 */ +#line 552 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 552 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 552 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0001 00ss rsrc rdst max %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("max %1%S1, %0"); +#line 553 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(max); SP(ss, rsrc); DR(rdst); + + } + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_47; + break; + } + break; + case 0x12: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_47; + break; + } + break; + case 0x13: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_47; + break; + } + break; + case 0x14: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_48: + { + /** 1111 1100 0001 01ss rsrc rdst min %1%S1, %0 */ +#line 564 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 564 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 564 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0001 01ss rsrc rdst min %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("min %1%S1, %0"); +#line 565 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(min); SP(ss, rsrc); DR(rdst); + + } + break; + } + break; + case 0x15: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_48; + break; + } + break; + case 0x16: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_48; + break; + } + break; + case 0x17: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_48; + break; + } + break; + case 0x18: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_49: + { + /** 1111 1100 0001 10ss rsrc rdst emul %1%S1, %0 */ +#line 594 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 594 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 594 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0001 10ss rsrc rdst emul %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("emul %1%S1, %0"); +#line 595 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(emul); SP(ss, rsrc); DR(rdst); + + } + break; + } + break; + case 0x19: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_49; + break; + } + break; + case 0x1a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_49; + break; + } + break; + case 0x1b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_49; + break; + } + break; + case 0x1c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_50: + { + /** 1111 1100 0001 11ss rsrc rdst emulu %1%S1, %0 */ +#line 606 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 606 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 606 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0001 11ss rsrc rdst emulu %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("emulu %1%S1, %0"); +#line 607 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(emulu); SP(ss, rsrc); DR(rdst); + + } + break; + } + break; + case 0x1d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_50; + break; + } + break; + case 0x1e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_50; + break; + } + break; + case 0x1f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_50; + break; + } + break; + case 0x20: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_51: + { + /** 1111 1100 0010 00ss rsrc rdst div %1%S1, %0 */ +#line 618 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 618 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 618 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0010 00ss rsrc rdst div %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("div %1%S1, %0"); +#line 619 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(div); SP(ss, rsrc); DR(rdst); F("O---"); + + } + break; + } + break; + case 0x21: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_51; + break; + } + break; + case 0x22: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_51; + break; + } + break; + case 0x23: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_51; + break; + } + break; + case 0x24: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_52: + { + /** 1111 1100 0010 01ss rsrc rdst divu %1%S1, %0 */ +#line 630 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 630 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 630 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0010 01ss rsrc rdst divu %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("divu %1%S1, %0"); +#line 631 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(divu); SP(ss, rsrc); DR(rdst); F("O---"); + + } + break; + } + break; + case 0x25: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_52; + break; + } + break; + case 0x26: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_52; + break; + } + break; + case 0x27: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_52; + break; + } + break; + case 0x30: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_53: + { + /** 1111 1100 0011 00ss rsrc rdst tst %1%S1, %2 */ +#line 449 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 449 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 449 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0011 00ss rsrc rdst tst %1%S1, %2 */", + op[0], op[1], op[2]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("tst %1%S1, %2"); +#line 450 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(and); SP(ss, rsrc); S2R(rdst); F("-SZ-"); + + } + break; + } + break; + case 0x31: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_53; + break; + } + break; + case 0x32: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_53; + break; + } + break; + case 0x33: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_53; + break; + } + break; + case 0x34: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_54: + { + /** 1111 1100 0011 01ss rsrc rdst xor %1%S1, %0 */ +#line 428 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 428 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 428 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0011 01ss rsrc rdst xor %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("xor %1%S1, %0"); +#line 429 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(xor); SP(ss, rsrc); DR(rdst); F("-SZ-"); + + } + break; + } + break; + case 0x35: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_54; + break; + } + break; + case 0x36: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_54; + break; + } + break; + case 0x37: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_54; + break; + } + break; + case 0x3b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1100 0011 1011 rsrc rdst not %1, %0 */ +#line 440 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 440 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0011 1011 rsrc rdst not %1, %0 */", + op[0], op[1], op[2]); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("not %1, %0"); +#line 441 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(xor); DR(rdst); SR(rsrc); S2C(~0); F("-SZ-"); + + /*----------------------------------------------------------------------*/ + /* TST */ + + } + break; + } + break; + case 0x40: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_55: + { + /** 1111 1100 0100 00ss rsrc rdst xchg %1%S1, %0 */ +#line 362 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int ss AU = op[1] & 0x03; +#line 362 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 362 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0100 00ss rsrc rdst xchg %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" ss = 0x%x,", ss); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("xchg %1%S1, %0"); +#line 363 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(xchg); DR(rdst); SP(ss, rsrc); + + } + break; + } + break; + case 0x41: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_55; + break; + } + break; + case 0x42: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_55; + break; + } + break; + case 0x43: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_55; + break; + } + break; + case 0x44: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_56: + { + /** 1111 1100 0100 01sd rsrc rdst itof %1%S1, %0 */ +#line 859 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 859 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 859 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0100 01sd rsrc rdst itof %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" sd = 0x%x,", sd); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("itof %1%S1, %0"); +#line 860 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(itof); DR (rdst); SP(sd, rsrc); F("-SZ-"); + + } + break; + } + break; + case 0x45: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_56; + break; + } + break; + case 0x46: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_56; + break; + } + break; + case 0x47: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_56; + break; + } + break; + case 0x60: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_57: + { + /** 1111 1100 0110 00sd rdst rsrc bset %1, %0%S0 */ +#line 871 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 871 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = (op[2] >> 4) & 0x0f; +#line 871 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0110 00sd rdst rsrc bset %1, %0%S0 */", + op[0], op[1], op[2]); + printf (" sd = 0x%x,", sd); + printf (" rdst = 0x%x,", rdst); + printf (" rsrc = 0x%x\n", rsrc); + } + SYNTAX("bset %1, %0%S0"); +#line 872 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(bset); BWL(BSIZE); SR(rsrc); DD(sd, rdst, BSIZE); F("----"); + + } + break; + } + break; + case 0x61: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_57; + break; + } + break; + case 0x62: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_57; + break; + } + break; + case 0x63: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_57; + break; + } + break; + case 0x64: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_58: + { + /** 1111 1100 0110 01sd rdst rsrc bclr %1, %0%S0 */ +#line 881 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 881 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = (op[2] >> 4) & 0x0f; +#line 881 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0110 01sd rdst rsrc bclr %1, %0%S0 */", + op[0], op[1], op[2]); + printf (" sd = 0x%x,", sd); + printf (" rdst = 0x%x,", rdst); + printf (" rsrc = 0x%x\n", rsrc); + } + SYNTAX("bclr %1, %0%S0"); +#line 882 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(bclr); BWL(BSIZE); SR(rsrc); DD(sd, rdst, BSIZE); F("----"); + + } + break; + } + break; + case 0x65: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_58; + break; + } + break; + case 0x66: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_58; + break; + } + break; + case 0x67: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_58; + break; + } + break; + case 0x68: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_59: + { + /** 1111 1100 0110 10sd rdst rsrc btst %2, %1%S1 */ +#line 891 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 891 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = (op[2] >> 4) & 0x0f; +#line 891 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0110 10sd rdst rsrc btst %2, %1%S1 */", + op[0], op[1], op[2]); + printf (" sd = 0x%x,", sd); + printf (" rdst = 0x%x,", rdst); + printf (" rsrc = 0x%x\n", rsrc); + } + SYNTAX("btst %2, %1%S1"); +#line 892 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(btst); BWL(BSIZE); S2R(rsrc); SD(sd, rdst, BSIZE); F("--ZC"); + + } + break; + } + break; + case 0x69: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_59; + break; + } + break; + case 0x6a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_59; + break; + } + break; + case 0x6b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_59; + break; + } + break; + case 0x6c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_60: + { + /** 1111 1100 0110 11sd rdst rsrc bnot %1, %0%S0 */ +#line 901 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 901 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = (op[2] >> 4) & 0x0f; +#line 901 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 0110 11sd rdst rsrc bnot %1, %0%S0 */", + op[0], op[1], op[2]); + printf (" sd = 0x%x,", sd); + printf (" rdst = 0x%x,", rdst); + printf (" rsrc = 0x%x\n", rsrc); + } + SYNTAX("bnot %1, %0%S0"); +#line 902 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(bnot); BWL(BSIZE); SR(rsrc); DD(sd, rdst, BSIZE); + + } + break; + } + break; + case 0x6d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_60; + break; + } + break; + case 0x6e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_60; + break; + } + break; + case 0x6f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_60; + break; + } + break; + case 0x80: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_61: + { + /** 1111 1100 1000 00sd rsrc rdst fsub %1%S1, %0 */ +#line 838 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 838 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 838 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 1000 00sd rsrc rdst fsub %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" sd = 0x%x,", sd); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("fsub %1%S1, %0"); +#line 839 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(fsub); DR(rdst); SD(sd, rsrc, LSIZE); F("-SZ-"); + + } + break; + } + break; + case 0x81: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_61; + break; + } + break; + case 0x82: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_61; + break; + } + break; + case 0x83: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_61; + break; + } + break; + case 0x84: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_62: + { + /** 1111 1100 1000 01sd rsrc rdst fcmp %1%S1, %0 */ +#line 832 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 832 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 832 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 1000 01sd rsrc rdst fcmp %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" sd = 0x%x,", sd); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("fcmp %1%S1, %0"); +#line 833 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(fcmp); DR(rdst); SD(sd, rsrc, LSIZE); F("OSZ-"); + + } + break; + } + break; + case 0x85: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_62; + break; + } + break; + case 0x86: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_62; + break; + } + break; + case 0x87: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_62; + break; + } + break; + case 0x88: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_63: + { + /** 1111 1100 1000 10sd rsrc rdst fadd %1%S1, %0 */ +#line 826 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 826 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 826 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 1000 10sd rsrc rdst fadd %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" sd = 0x%x,", sd); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("fadd %1%S1, %0"); +#line 827 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(fadd); DR(rdst); SD(sd, rsrc, LSIZE); F("-SZ-"); + + } + break; + } + break; + case 0x89: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_63; + break; + } + break; + case 0x8a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_63; + break; + } + break; + case 0x8b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_63; + break; + } + break; + case 0x8c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_64: + { + /** 1111 1100 1000 11sd rsrc rdst fmul %1%S1, %0 */ +#line 847 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 847 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 847 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 1000 11sd rsrc rdst fmul %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" sd = 0x%x,", sd); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("fmul %1%S1, %0"); +#line 848 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(fmul); DR(rdst); SD(sd, rsrc, LSIZE); F("-SZ-"); + + } + break; + } + break; + case 0x8d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_64; + break; + } + break; + case 0x8e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_64; + break; + } + break; + case 0x8f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_64; + break; + } + break; + case 0x90: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_65: + { + /** 1111 1100 1001 00sd rsrc rdst fdiv %1%S1, %0 */ +#line 853 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 853 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 853 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 1001 00sd rsrc rdst fdiv %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" sd = 0x%x,", sd); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("fdiv %1%S1, %0"); +#line 854 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(fdiv); DR(rdst); SD(sd, rsrc, LSIZE); F("-SZ-"); + + } + break; + } + break; + case 0x91: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_65; + break; + } + break; + case 0x92: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_65; + break; + } + break; + case 0x93: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_65; + break; + } + break; + case 0x94: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_66: + { + /** 1111 1100 1001 01sd rsrc rdst ftoi %1%S1, %0 */ +#line 841 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 841 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 841 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 1001 01sd rsrc rdst ftoi %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" sd = 0x%x,", sd); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("ftoi %1%S1, %0"); +#line 842 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(ftoi); DR(rdst); SD(sd, rsrc, LSIZE); F("-SZ-"); + + } + break; + } + break; + case 0x95: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_66; + break; + } + break; + case 0x96: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_66; + break; + } + break; + case 0x97: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_66; + break; + } + break; + case 0x98: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_67: + { + /** 1111 1100 1001 10sd rsrc rdst round %1%S1, %0 */ +#line 856 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 856 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 856 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 1001 10sd rsrc rdst round %1%S1, %0 */", + op[0], op[1], op[2]); + printf (" sd = 0x%x,", sd); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("round %1%S1, %0"); +#line 857 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(round); DR(rdst); SD(sd, rsrc, LSIZE); F("-SZ-"); + + } + break; + } + break; + case 0x99: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_67; + break; + } + break; + case 0x9a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_67; + break; + } + break; + case 0x9b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_67; + break; + } + break; + case 0xd0: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_68: + { + /** 1111 1100 1101 sz sd rdst cond sc%1%s %0 */ +#line 971 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = (op[1] >> 2) & 0x03; +#line 971 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 971 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = (op[2] >> 4) & 0x0f; +#line 971 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int cond AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 1101 sz sd rdst cond sc%1%s %0 */", + op[0], op[1], op[2]); + printf (" sz = 0x%x,", sz); + printf (" sd = 0x%x,", sd); + printf (" rdst = 0x%x,", rdst); + printf (" cond = 0x%x\n", cond); + } + SYNTAX("sc%1%s %0"); +#line 972 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sccnd); BWL(sz); DD (sd, rdst, sz); Scc(cond); + + } + break; + } + break; + case 0xd1: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_68; + break; + } + break; + case 0xd2: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_68; + break; + } + break; + case 0xd3: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_68; + break; + } + break; + case 0xd4: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_68; + break; + } + break; + case 0xd5: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_68; + break; + } + break; + case 0xd6: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_68; + break; + } + break; + case 0xd7: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_68; + break; + } + break; + case 0xd8: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_68; + break; + } + break; + case 0xd9: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_68; + break; + } + break; + case 0xda: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_68; + break; + } + break; + case 0xdb: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_68; + break; + } + break; + case 0xe0: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + op_semantics_69: + { + /** 1111 1100 111bit sd rdst cond bm%2 #%1, %0%S0 */ +#line 908 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int bit AU = (op[1] >> 2) & 0x07; +#line 908 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 908 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = (op[2] >> 4) & 0x0f; +#line 908 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int cond AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 111bit sd rdst cond bm%2 #%1, %0%S0 */", + op[0], op[1], op[2]); + printf (" bit = 0x%x,", bit); + printf (" sd = 0x%x,", sd); + printf (" rdst = 0x%x,", rdst); + printf (" cond = 0x%x\n", cond); + } + SYNTAX("bm%2 #%1, %0%S0"); +#line 909 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(bmcc); BWL(BSIZE); S2cc(cond); SC(bit); DD(sd, rdst, BSIZE); + + } + break; + case 0x0f: + op_semantics_70: + { + /** 1111 1100 111bit sd rdst 1111 bnot #%1, %0%S0 */ +#line 898 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int bit AU = (op[1] >> 2) & 0x07; +#line 898 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sd AU = op[1] & 0x03; +#line 898 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = (op[2] >> 4) & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1100 111bit sd rdst 1111 bnot #%1, %0%S0 */", + op[0], op[1], op[2]); + printf (" bit = 0x%x,", bit); + printf (" sd = 0x%x,", sd); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("bnot #%1, %0%S0"); +#line 899 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(bnot); BWL(BSIZE); SC(bit); DD(sd, rdst, BSIZE); + + } + break; + } + break; + case 0xe1: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xe2: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xe3: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xe4: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xe5: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xe6: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xe7: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xe8: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xe9: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xea: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xeb: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xec: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xed: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xee: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xef: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xf0: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xf1: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xf2: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xf3: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xf4: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xf5: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xf6: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xf7: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xf8: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xf9: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xfa: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xfb: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xfc: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xfd: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xfe: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + case 0xff: + GETBYTE (); + switch (op[2] & 0x0f) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + goto op_semantics_69; + break; + case 0x0f: + goto op_semantics_70; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0xfd: + GETBYTE (); + switch (op[1] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1101 0000 0000 srca srcb mulhi %1, %2 */ +#line 781 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srca AU = (op[2] >> 4) & 0x0f; +#line 781 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srcb AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0000 0000 srca srcb mulhi %1, %2 */", + op[0], op[1], op[2]); + printf (" srca = 0x%x,", srca); + printf (" srcb = 0x%x\n", srcb); + } + SYNTAX("mulhi %1, %2"); +#line 782 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mulhi); SR(srca); S2R(srcb); F("----"); + + } + break; + } + break; + case 0x01: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1101 0000 0001 srca srcb mullo %1, %2 */ +#line 784 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srca AU = (op[2] >> 4) & 0x0f; +#line 784 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srcb AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0000 0001 srca srcb mullo %1, %2 */", + op[0], op[1], op[2]); + printf (" srca = 0x%x,", srca); + printf (" srcb = 0x%x\n", srcb); + } + SYNTAX("mullo %1, %2"); +#line 785 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mullo); SR(srca); S2R(srcb); F("----"); + + } + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1101 0000 0100 srca srcb machi %1, %2 */ +#line 787 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srca AU = (op[2] >> 4) & 0x0f; +#line 787 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srcb AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0000 0100 srca srcb machi %1, %2 */", + op[0], op[1], op[2]); + printf (" srca = 0x%x,", srca); + printf (" srcb = 0x%x\n", srcb); + } + SYNTAX("machi %1, %2"); +#line 788 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(machi); SR(srca); S2R(srcb); F("----"); + + } + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1101 0000 0101 srca srcb maclo %1, %2 */ +#line 790 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srca AU = (op[2] >> 4) & 0x0f; +#line 790 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srcb AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0000 0101 srca srcb maclo %1, %2 */", + op[0], op[1], op[2]); + printf (" srca = 0x%x,", srca); + printf (" srcb = 0x%x\n", srcb); + } + SYNTAX("maclo %1, %2"); +#line 791 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(maclo); SR(srca); S2R(srcb); F("----"); + + } + break; + } + break; + case 0x17: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + { + /** 1111 1101 0001 0111 0000 rsrc mvtachi %1 */ +#line 793 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0001 0111 0000 rsrc mvtachi %1 */", + op[0], op[1], op[2]); + printf (" rsrc = 0x%x\n", rsrc); + } + SYNTAX("mvtachi %1"); +#line 794 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mvtachi); SR(rsrc); F("----"); + + } + break; + case 0x10: + { + /** 1111 1101 0001 0111 0001 rsrc mvtaclo %1 */ +#line 796 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0001 0111 0001 rsrc mvtaclo %1 */", + op[0], op[1], op[2]); + printf (" rsrc = 0x%x\n", rsrc); + } + SYNTAX("mvtaclo %1"); +#line 797 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mvtaclo); SR(rsrc); F("----"); + + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x18: + GETBYTE (); + switch (op[2] & 0xef) + { + case 0x00: + { + /** 1111 1101 0001 1000 000i 0000 racw #%1 */ +#line 808 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int i AU = (op[2] >> 4) & 0x01; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0001 1000 000i 0000 racw #%1 */", + op[0], op[1], op[2]); + printf (" i = 0x%x\n", i); + } + SYNTAX("racw #%1"); +#line 809 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(racw); SC(i+1); F("----"); + + /*----------------------------------------------------------------------*/ + /* SAT */ + + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x1f: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + { + /** 1111 1101 0001 1111 0000 rdst mvfachi %0 */ +#line 799 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0001 1111 0000 rdst mvfachi %0 */", + op[0], op[1], op[2]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("mvfachi %0"); +#line 800 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mvfachi); DR(rdst); F("----"); + + } + break; + case 0x10: + { + /** 1111 1101 0001 1111 0001 rdst mvfaclo %0 */ +#line 805 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0001 1111 0001 rdst mvfaclo %0 */", + op[0], op[1], op[2]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("mvfaclo %0"); +#line 806 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mvfaclo); DR(rdst); F("----"); + + } + break; + case 0x20: + { + /** 1111 1101 0001 1111 0010 rdst mvfacmi %0 */ +#line 802 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0001 1111 0010 rdst mvfacmi %0 */", + op[0], op[1], op[2]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("mvfacmi %0"); +#line 803 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mvfacmi); DR(rdst); F("----"); + + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x20: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_71: + { + /** 1111 1101 0010 0p sz rdst rsrc mov%s %1, %0 */ +#line 323 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int p AU = (op[1] >> 2) & 0x01; +#line 323 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = op[1] & 0x03; +#line 323 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = (op[2] >> 4) & 0x0f; +#line 323 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0010 0p sz rdst rsrc mov%s %1, %0 */", + op[0], op[1], op[2]); + printf (" p = 0x%x,", p); + printf (" sz = 0x%x,", sz); + printf (" rdst = 0x%x,", rdst); + printf (" rsrc = 0x%x\n", rsrc); + } + SYNTAX("mov%s %1, %0"); +#line 324 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); sBWL (sz); SR(rsrc); F("----"); + OP(0, p ? RX_Operand_Predec : RX_Operand_Postinc, rdst, 0); + + } + break; + } + break; + case 0x21: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_71; + break; + } + break; + case 0x22: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_71; + break; + } + break; + case 0x24: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_71; + break; + } + break; + case 0x25: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_71; + break; + } + break; + case 0x26: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_71; + break; + } + break; + case 0x28: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_72: + { + /** 1111 1101 0010 1p sz rsrc rdst mov%s %1, %0 */ +#line 327 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int p AU = (op[1] >> 2) & 0x01; +#line 327 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = op[1] & 0x03; +#line 327 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 327 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0010 1p sz rsrc rdst mov%s %1, %0 */", + op[0], op[1], op[2]); + printf (" p = 0x%x,", p); + printf (" sz = 0x%x,", sz); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("mov%s %1, %0"); +#line 328 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); sBWL (sz); DR(rdst); F("----"); + OP(1, p ? RX_Operand_Predec : RX_Operand_Postinc, rsrc, 0); + + } + break; + } + break; + case 0x29: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_72; + break; + } + break; + case 0x2a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_72; + break; + } + break; + case 0x2c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_72; + break; + } + break; + case 0x2d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_72; + break; + } + break; + case 0x2e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_72; + break; + } + break; + case 0x38: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_73: + { + /** 1111 1101 0011 1p sz rsrc rdst movu%s %1, %0 */ +#line 337 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int p AU = (op[1] >> 2) & 0x01; +#line 337 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = op[1] & 0x03; +#line 337 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 337 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0011 1p sz rsrc rdst movu%s %1, %0 */", + op[0], op[1], op[2]); + printf (" p = 0x%x,", p); + printf (" sz = 0x%x,", sz); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("movu%s %1, %0"); +#line 338 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); uBWL (sz); DR(rdst); F("----"); + OP(1, p ? RX_Operand_Predec : RX_Operand_Postinc, rsrc, 0); + + /*----------------------------------------------------------------------*/ + /* PUSH/POP */ + + } + break; + } + break; + case 0x39: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_73; + break; + } + break; + case 0x3a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_73; + break; + } + break; + case 0x3c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_73; + break; + } + break; + case 0x3d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_73; + break; + } + break; + case 0x3e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_73; + break; + } + break; + case 0x60: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1101 0110 0000 rsrc rdst shlr %2, %0 */ +#line 662 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 662 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0110 0000 rsrc rdst shlr %2, %0 */", + op[0], op[1], op[2]); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("shlr %2, %0"); +#line 663 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(shlr); S2R(rsrc); SR(rdst); DR(rdst); F("-SZC"); + + } + break; + } + break; + case 0x61: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1101 0110 0001 rsrc rdst shar %2, %0 */ +#line 652 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 652 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0110 0001 rsrc rdst shar %2, %0 */", + op[0], op[1], op[2]); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("shar %2, %0"); +#line 653 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(shar); S2R(rsrc); SR(rdst); DR(rdst); F("0SZC"); + + } + break; + } + break; + case 0x62: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1101 0110 0010 rsrc rdst shll %2, %0 */ +#line 642 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 642 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0110 0010 rsrc rdst shll %2, %0 */", + op[0], op[1], op[2]); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("shll %2, %0"); +#line 643 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(shll); S2R(rsrc); SR(rdst); DR(rdst); F("OSZC"); + + } + break; + } + break; + case 0x64: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1101 0110 0100 rsrc rdst rotr %1, %0 */ +#line 686 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 686 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0110 0100 rsrc rdst rotr %1, %0 */", + op[0], op[1], op[2]); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("rotr %1, %0"); +#line 687 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(rotr); SR(rsrc); DR(rdst); F("-SZC"); + + } + break; + } + break; + case 0x65: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1101 0110 0101 rsrc rdst revw %1, %0 */ +#line 689 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 689 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0110 0101 rsrc rdst revw %1, %0 */", + op[0], op[1], op[2]); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("revw %1, %0"); +#line 690 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(revw); SR(rsrc); DR(rdst); + + } + break; + } + break; + case 0x66: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1101 0110 0110 rsrc rdst rotl %1, %0 */ +#line 680 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 680 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0110 0110 rsrc rdst rotl %1, %0 */", + op[0], op[1], op[2]); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("rotl %1, %0"); +#line 681 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(rotl); SR(rsrc); DR(rdst); F("-SZC"); + + } + break; + } + break; + case 0x67: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + { + /** 1111 1101 0110 0111 rsrc rdst revl %1, %0 */ +#line 692 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 692 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0110 0111 rsrc rdst revl %1, %0 */", + op[0], op[1], op[2]); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("revl %1, %0"); +#line 693 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(revl); SR(rsrc); DR(rdst); + + /*----------------------------------------------------------------------*/ + /* BRANCH */ + + } + break; + } + break; + case 0x68: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_74: + { + /** 1111 1101 0110 100c rsrc rdst mvtc %1, %0 */ +#line 932 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int c AU = op[1] & 0x01; +#line 932 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 932 "/work/sources/binutils/current/opcodes/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 */", + 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 933 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); SR(rsrc); DR(c*16+rdst + 16); + + } + break; + } + break; + case 0x69: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_74; + break; + } + break; + case 0x6a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_75: + { + /** 1111 1101 0110 101s rsrc rdst mvfc %1, %0 */ +#line 935 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int s AU = op[1] & 0x01; +#line 935 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 935 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0110 101s rsrc rdst mvfc %1, %0 */", + op[0], op[1], op[2]); + printf (" s = 0x%x,", s); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("mvfc %1, %0"); +#line 936 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); SR((s*16+rsrc) + 16); DR(rdst); + + } + break; + } + break; + case 0x6b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_75; + break; + } + break; + case 0x6c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_76: + { + /** 1111 1101 0110 110i mmmm rdst rotr #%1, %0 */ +#line 683 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int i AU = op[1] & 0x01; +#line 683 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mmmm AU = (op[2] >> 4) & 0x0f; +#line 683 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0110 110i mmmm rdst rotr #%1, %0 */", + op[0], op[1], op[2]); + printf (" i = 0x%x,", i); + printf (" mmmm = 0x%x,", mmmm); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("rotr #%1, %0"); +#line 684 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(rotr); SC(i*16+mmmm); DR(rdst); F("-SZC"); + + } + break; + } + break; + case 0x6d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_76; + break; + } + break; + case 0x6e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_77: + { + /** 1111 1101 0110 111i mmmm rdst rotl #%1, %0 */ +#line 677 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int i AU = op[1] & 0x01; +#line 677 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int mmmm AU = (op[2] >> 4) & 0x0f; +#line 677 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0110 111i mmmm rdst rotl #%1, %0 */", + op[0], op[1], op[2]); + printf (" i = 0x%x,", i); + printf (" mmmm = 0x%x,", mmmm); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("rotl #%1, %0"); +#line 678 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(rotl); SC(i*16+mmmm); DR(rdst); F("-SZC"); + + } + break; + } + break; + case 0x6f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_77; + break; + } + break; + case 0x70: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x20: + op_semantics_78: + { + /** 1111 1101 0111 im00 0010rdst adc #%1, %0 */ +#line 467 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = (op[1] >> 2) & 0x03; +#line 467 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 im00 0010rdst adc #%1, %0 */", + op[0], op[1], op[2]); + printf (" im = 0x%x,", im); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("adc #%1, %0"); +#line 468 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(adc); SC(IMMex(im)); DR(rdst); F("OSZC"); + + } + break; + case 0x40: + op_semantics_79: + { + /** 1111 1101 0111 im00 0100rdst max #%1, %0 */ +#line 549 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = (op[1] >> 2) & 0x03; +#line 549 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 im00 0100rdst max #%1, %0 */", + op[0], op[1], op[2]); + printf (" im = 0x%x,", im); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("max #%1, %0"); +#line 550 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(max); DR(rdst); SC(IMMex(im)); + + } + break; + case 0x50: + op_semantics_80: + { + /** 1111 1101 0111 im00 0101rdst min #%1, %0 */ +#line 561 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = (op[1] >> 2) & 0x03; +#line 561 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 im00 0101rdst min #%1, %0 */", + op[0], op[1], op[2]); + printf (" im = 0x%x,", im); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("min #%1, %0"); +#line 562 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(min); DR(rdst); SC(IMMex(im)); + + } + break; + case 0x60: + op_semantics_81: + { + /** 1111 1101 0111 im00 0110rdst emul #%1, %0 */ +#line 591 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = (op[1] >> 2) & 0x03; +#line 591 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 im00 0110rdst emul #%1, %0 */", + op[0], op[1], op[2]); + printf (" im = 0x%x,", im); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("emul #%1, %0"); +#line 592 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(emul); DR(rdst); SC(IMMex(im)); + + } + break; + case 0x70: + op_semantics_82: + { + /** 1111 1101 0111 im00 0111rdst emulu #%1, %0 */ +#line 603 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = (op[1] >> 2) & 0x03; +#line 603 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 im00 0111rdst emulu #%1, %0 */", + op[0], op[1], op[2]); + printf (" im = 0x%x,", im); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("emulu #%1, %0"); +#line 604 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(emulu); DR(rdst); SC(IMMex(im)); + + } + break; + case 0x80: + op_semantics_83: + { + /** 1111 1101 0111 im00 1000rdst div #%1, %0 */ +#line 615 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = (op[1] >> 2) & 0x03; +#line 615 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 im00 1000rdst div #%1, %0 */", + op[0], op[1], op[2]); + printf (" im = 0x%x,", im); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("div #%1, %0"); +#line 616 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(div); DR(rdst); SC(IMMex(im)); F("O---"); + + } + break; + case 0x90: + op_semantics_84: + { + /** 1111 1101 0111 im00 1001rdst divu #%1, %0 */ +#line 627 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = (op[1] >> 2) & 0x03; +#line 627 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 im00 1001rdst divu #%1, %0 */", + op[0], op[1], op[2]); + printf (" im = 0x%x,", im); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("divu #%1, %0"); +#line 628 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(divu); DR(rdst); SC(IMMex(im)); F("O---"); + + } + break; + case 0xc0: + op_semantics_85: + { + /** 1111 1101 0111 im00 1100rdst tst #%1, %2 */ +#line 446 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = (op[1] >> 2) & 0x03; +#line 446 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 im00 1100rdst tst #%1, %2 */", + op[0], op[1], op[2]); + printf (" im = 0x%x,", im); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("tst #%1, %2"); +#line 447 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(and); SC(IMMex(im)); S2R(rdst); F("-SZ-"); + + } + break; + case 0xd0: + op_semantics_86: + { + /** 1111 1101 0111 im00 1101rdst xor #%1, %0 */ +#line 425 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = (op[1] >> 2) & 0x03; +#line 425 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 im00 1101rdst xor #%1, %0 */", + op[0], op[1], op[2]); + printf (" im = 0x%x,", im); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("xor #%1, %0"); +#line 426 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(xor); SC(IMMex(im)); DR(rdst); F("-SZ-"); + + } + break; + case 0xe0: + op_semantics_87: + { + /** 1111 1101 0111 im00 1110rdst stz #%1, %0 */ +#line 371 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = (op[1] >> 2) & 0x03; +#line 371 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 im00 1110rdst stz #%1, %0 */", + op[0], op[1], op[2]); + printf (" im = 0x%x,", im); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("stz #%1, %0"); +#line 372 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(stcc); SC(IMMex(im)); DR(rdst); S2cc(RXC_z); + + } + break; + case 0xf0: + op_semantics_88: + { + /** 1111 1101 0111 im00 1111rdst stnz #%1, %0 */ +#line 374 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = (op[1] >> 2) & 0x03; +#line 374 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 im00 1111rdst stnz #%1, %0 */", + op[0], op[1], op[2]); + printf (" im = 0x%x,", im); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("stnz #%1, %0"); +#line 375 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(stcc); SC(IMMex(im)); DR(rdst); S2cc(RXC_nz); + + /*----------------------------------------------------------------------*/ + /* RTSD */ + + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x72: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + { + /** 1111 1101 0111 0010 0000 rdst fsub #%1, %0 */ +#line 835 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 0010 0000 rdst fsub #%1, %0 */", + op[0], op[1], op[2]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("fsub #%1, %0"); +#line 836 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(fsub); DR(rdst); SC(IMM(0)); F("-SZ-"); + + } + break; + case 0x10: + { + /** 1111 1101 0111 0010 0001 rdst fcmp #%1, %0 */ +#line 829 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 0010 0001 rdst fcmp #%1, %0 */", + op[0], op[1], op[2]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("fcmp #%1, %0"); +#line 830 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(fcmp); DR(rdst); SC(IMM(0)); F("OSZ-"); + + } + break; + case 0x20: + { + /** 1111 1101 0111 0010 0010 rdst fadd #%1, %0 */ +#line 823 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 0010 0010 rdst fadd #%1, %0 */", + op[0], op[1], op[2]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("fadd #%1, %0"); +#line 824 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(fadd); DR(rdst); SC(IMM(0)); F("-SZ-"); + + } + break; + case 0x30: + { + /** 1111 1101 0111 0010 0011 rdst fmul #%1, %0 */ +#line 844 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 0010 0011 rdst fmul #%1, %0 */", + op[0], op[1], op[2]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("fmul #%1, %0"); +#line 845 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(fmul); DR(rdst); SC(IMM(0)); F("-SZ-"); + + } + break; + case 0x40: + { + /** 1111 1101 0111 0010 0100 rdst fdiv #%1, %0 */ +#line 850 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 0010 0100 rdst fdiv #%1, %0 */", + op[0], op[1], op[2]); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("fdiv #%1, %0"); +#line 851 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(fdiv); DR(rdst); SC(IMM(0)); F("-SZ-"); + + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x73: + GETBYTE (); + switch (op[2] & 0xe0) + { + case 0x00: + op_semantics_89: + { + /** 1111 1101 0111 im11 000crdst mvtc #%1, %0 */ +#line 929 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int im AU = (op[1] >> 2) & 0x03; +#line 929 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int crdst AU = op[2] & 0x1f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 0111 im11 000crdst mvtc #%1, %0 */", + op[0], op[1], op[2]); + printf (" im = 0x%x,", im); + printf (" crdst = 0x%x\n", crdst); + } + SYNTAX("mvtc #%1, %0"); +#line 930 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mov); SC(IMMex(im)); DR(crdst + 16); + + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0x74: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x20: + goto op_semantics_78; + break; + case 0x40: + goto op_semantics_79; + break; + case 0x50: + goto op_semantics_80; + break; + case 0x60: + goto op_semantics_81; + break; + case 0x70: + goto op_semantics_82; + break; + case 0x80: + goto op_semantics_83; + break; + case 0x90: + goto op_semantics_84; + break; + case 0xc0: + goto op_semantics_85; + break; + case 0xd0: + goto op_semantics_86; + break; + case 0xe0: + goto op_semantics_87; + break; + case 0xf0: + goto op_semantics_88; + break; + default: UNSUPPORTED(); break; + } + break; + case 0x77: + GETBYTE (); + switch (op[2] & 0xe0) + { + case 0x00: + goto op_semantics_89; + break; + default: UNSUPPORTED(); break; + } + break; + case 0x78: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x20: + goto op_semantics_78; + break; + case 0x40: + goto op_semantics_79; + break; + case 0x50: + goto op_semantics_80; + break; + case 0x60: + goto op_semantics_81; + break; + case 0x70: + goto op_semantics_82; + break; + case 0x80: + goto op_semantics_83; + break; + case 0x90: + goto op_semantics_84; + break; + case 0xc0: + goto op_semantics_85; + break; + case 0xd0: + goto op_semantics_86; + break; + case 0xe0: + goto op_semantics_87; + break; + case 0xf0: + goto op_semantics_88; + break; + default: UNSUPPORTED(); break; + } + break; + case 0x7b: + GETBYTE (); + switch (op[2] & 0xe0) + { + case 0x00: + goto op_semantics_89; + break; + default: UNSUPPORTED(); break; + } + break; + case 0x7c: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x20: + goto op_semantics_78; + break; + case 0x40: + goto op_semantics_79; + break; + case 0x50: + goto op_semantics_80; + break; + case 0x60: + goto op_semantics_81; + break; + case 0x70: + goto op_semantics_82; + break; + case 0x80: + goto op_semantics_83; + break; + case 0x90: + goto op_semantics_84; + break; + case 0xc0: + goto op_semantics_85; + break; + case 0xd0: + goto op_semantics_86; + break; + case 0xe0: + goto op_semantics_87; + break; + case 0xf0: + goto op_semantics_88; + break; + default: UNSUPPORTED(); break; + } + break; + case 0x7f: + GETBYTE (); + switch (op[2] & 0xe0) + { + case 0x00: + goto op_semantics_89; + break; + default: UNSUPPORTED(); break; + } + break; + case 0x80: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_90: + { + /** 1111 1101 100immmm rsrc rdst shlr #%2, %1, %0 */ +#line 665 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int immmm AU = op[1] & 0x1f; +#line 665 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 665 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 100immmm rsrc rdst shlr #%2, %1, %0 */", + op[0], op[1], op[2]); + printf (" immmm = 0x%x,", immmm); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("shlr #%2, %1, %0"); +#line 666 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(shlr); S2C(immmm); SR(rsrc); DR(rdst); F("-SZC"); + + /*----------------------------------------------------------------------*/ + /* ROTATE */ + + } + break; + } + break; + case 0x81: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x82: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x83: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x84: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x85: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x86: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x87: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x88: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x89: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x8a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x8b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x8c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x8d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x8e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x8f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x90: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x91: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x92: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x93: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x94: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x95: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x96: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x97: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x98: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x99: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x9a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x9b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x9c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x9d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x9e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0x9f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_90; + break; + } + break; + case 0xa0: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_91: + { + /** 1111 1101 101immmm rsrc rdst shar #%2, %1, %0 */ +#line 655 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int immmm AU = op[1] & 0x1f; +#line 655 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 655 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 101immmm rsrc rdst shar #%2, %1, %0 */", + op[0], op[1], op[2]); + printf (" immmm = 0x%x,", immmm); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("shar #%2, %1, %0"); +#line 656 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(shar); S2C(immmm); SR(rsrc); DR(rdst); F("0SZC"); + + + } + break; + } + break; + case 0xa1: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xa2: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xa3: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xa4: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xa5: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xa6: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xa7: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xa8: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xa9: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xaa: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xab: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xac: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xad: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xae: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xaf: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xb0: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xb1: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xb2: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xb3: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xb4: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xb5: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xb6: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xb7: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xb8: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xb9: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xba: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xbb: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xbc: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xbd: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xbe: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xbf: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_91; + break; + } + break; + case 0xc0: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_92: + { + /** 1111 1101 110immmm rsrc rdst shll #%2, %1, %0 */ +#line 645 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int immmm AU = op[1] & 0x1f; +#line 645 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rsrc AU = (op[2] >> 4) & 0x0f; +#line 645 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 110immmm rsrc rdst shll #%2, %1, %0 */", + op[0], op[1], op[2]); + printf (" immmm = 0x%x,", immmm); + printf (" rsrc = 0x%x,", rsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("shll #%2, %1, %0"); +#line 646 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(shll); S2C(immmm); SR(rsrc); DR(rdst); F("OSZC"); + + + } + break; + } + break; + case 0xc1: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xc2: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xc3: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xc4: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xc5: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xc6: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xc7: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xc8: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xc9: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xca: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xcb: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xcc: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xcd: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xce: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xcf: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xd0: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xd1: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xd2: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xd3: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xd4: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xd5: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xd6: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xd7: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xd8: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xd9: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xda: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xdb: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xdc: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xdd: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xde: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xdf: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_92; + break; + } + break; + case 0xe0: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + op_semantics_93: + { + /** 1111 1101 111 bittt cond rdst bm%2 #%1, %0%S0 */ +#line 911 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int bittt AU = op[1] & 0x1f; +#line 911 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int cond AU = (op[2] >> 4) & 0x0f; +#line 911 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 111 bittt cond rdst bm%2 #%1, %0%S0 */", + op[0], op[1], op[2]); + printf (" bittt = 0x%x,", bittt); + printf (" cond = 0x%x,", cond); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("bm%2 #%1, %0%S0"); +#line 912 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(bmcc); BWL(LSIZE); S2cc(cond); SC(bittt); DR(rdst); + + /*----------------------------------------------------------------------*/ + /* CONTROL REGISTERS */ + + } + break; + case 0xf0: + op_semantics_94: + { + /** 1111 1101 111bittt 1111 rdst bnot #%1, %0 */ +#line 904 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int bittt AU = op[1] & 0x1f; +#line 904 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1101 111bittt 1111 rdst bnot #%1, %0 */", + op[0], op[1], op[2]); + printf (" bittt = 0x%x,", bittt); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("bnot #%1, %0"); +#line 905 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(bnot); BWL(LSIZE); SC(bittt); DR(rdst); + + + } + break; + } + break; + case 0xe1: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xe2: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xe3: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xe4: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xe5: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xe6: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xe7: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xe8: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xe9: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xea: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xeb: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xec: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xed: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xee: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xef: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xf0: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xf1: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xf2: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xf3: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xf4: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xf5: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xf6: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xf7: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xf8: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xf9: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xfa: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xfb: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xfc: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xfd: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xfe: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + case 0xff: + GETBYTE (); + switch (op[2] & 0xf0) + { + case 0x00: + case 0x10: + case 0x20: + case 0x30: + case 0x40: + case 0x50: + case 0x60: + case 0x70: + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + goto op_semantics_93; + break; + case 0xf0: + goto op_semantics_94; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0xfe: + GETBYTE (); + switch (op[1] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_95: + { + /** 1111 1110 00sz isrc bsrc rdst mov%s %0, [%1, %2] */ +#line 317 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = (op[1] >> 4) & 0x03; +#line 317 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int isrc AU = op[1] & 0x0f; +#line 317 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int bsrc AU = (op[2] >> 4) & 0x0f; +#line 317 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1110 00sz isrc bsrc rdst mov%s %0, [%1, %2] */", + op[0], op[1], op[2]); + printf (" sz = 0x%x,", sz); + printf (" isrc = 0x%x,", isrc); + printf (" bsrc = 0x%x,", bsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("mov%s %0, [%1, %2]"); +#line 318 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(movbir); sBWL(sz); DR(rdst); SR(isrc); S2R(bsrc); F("----"); + + } + break; + } + break; + case 0x01: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x02: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x03: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x0a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x0b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x0e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x0f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x10: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x11: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x12: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x13: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x14: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x15: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x16: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x17: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x18: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x19: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x1a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x1b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x1c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x1d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x1e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x1f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x20: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x21: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x22: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x23: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x24: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x25: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x26: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x27: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x28: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x29: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x2a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x2b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x2c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x2d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x2e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x2f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_95; + break; + } + break; + case 0x40: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_96: + { + /** 1111 1110 01sz isrc bsrc rdst mov%s [%1, %2], %0 */ +#line 314 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = (op[1] >> 4) & 0x03; +#line 314 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int isrc AU = op[1] & 0x0f; +#line 314 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int bsrc AU = (op[2] >> 4) & 0x0f; +#line 314 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1110 01sz isrc bsrc rdst mov%s [%1, %2], %0 */", + op[0], op[1], op[2]); + printf (" sz = 0x%x,", sz); + printf (" isrc = 0x%x,", isrc); + printf (" bsrc = 0x%x,", bsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("mov%s [%1, %2], %0"); +#line 315 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(movbi); sBWL(sz); DR(rdst); SR(isrc); S2R(bsrc); F("----"); + + } + break; + } + break; + case 0x41: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x42: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x43: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x44: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x45: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x46: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x47: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x48: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x49: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x4a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x4b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x4c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x4d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x4e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x4f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x50: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x51: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x52: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x53: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x54: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x55: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x56: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x57: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x58: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x59: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x5a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x5b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x5c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x5d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x5e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x5f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x60: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x61: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x62: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x63: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x64: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x65: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x66: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x67: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x68: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x69: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x6a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x6b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x6c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x6d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x6e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0x6f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_96; + break; + } + break; + case 0xc0: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_97: + { + /** 1111 1110 11sz isrc bsrc rdst movu%s [%1, %2], %0 */ +#line 320 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int sz AU = (op[1] >> 4) & 0x03; +#line 320 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int isrc AU = op[1] & 0x0f; +#line 320 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int bsrc AU = (op[2] >> 4) & 0x0f; +#line 320 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1110 11sz isrc bsrc rdst movu%s [%1, %2], %0 */", + op[0], op[1], op[2]); + printf (" sz = 0x%x,", sz); + printf (" isrc = 0x%x,", isrc); + printf (" bsrc = 0x%x,", bsrc); + printf (" rdst = 0x%x\n", rdst); + } + SYNTAX("movu%s [%1, %2], %0"); +#line 321 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(movbi); uBWL(sz); DR(rdst); SR(isrc); S2R(bsrc); F("----"); + + } + break; + } + break; + case 0xc1: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xc2: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xc3: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xc4: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xc5: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xc6: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xc7: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xc8: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xc9: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xca: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xcb: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xcc: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xcd: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xce: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xcf: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xd0: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xd1: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xd2: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xd3: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xd4: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xd5: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xd6: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xd7: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xd8: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xd9: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xda: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xdb: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xdc: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xdd: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xde: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xdf: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xe0: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xe1: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xe2: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xe3: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xe4: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xe5: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xe6: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xe7: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xe8: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xe9: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xea: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xeb: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xec: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xed: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xee: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + case 0xef: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_97; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + case 0xff: + GETBYTE (); + switch (op[1] & 0xff) + { + case 0x00: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_98: + { + /** 1111 1111 0000 rdst srca srcb sub %2, %1, %0 */ +#line 524 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; +#line 524 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srca AU = (op[2] >> 4) & 0x0f; +#line 524 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srcb AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1111 0000 rdst srca srcb sub %2, %1, %0 */", + op[0], op[1], op[2]); + printf (" rdst = 0x%x,", rdst); + printf (" srca = 0x%x,", srca); + printf (" srcb = 0x%x\n", srcb); + } + SYNTAX("sub %2, %1, %0"); +#line 525 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(sub); DR(rdst); SR(srcb); S2R(srca); F("OSZC"); + + /*----------------------------------------------------------------------*/ + /* SBB */ + + } + break; + } + break; + case 0x01: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_98; + break; + } + break; + case 0x02: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_98; + break; + } + break; + case 0x03: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_98; + break; + } + break; + case 0x04: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_98; + break; + } + break; + case 0x05: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_98; + break; + } + break; + case 0x06: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_98; + break; + } + break; + case 0x07: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_98; + break; + } + break; + case 0x08: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_98; + break; + } + break; + case 0x09: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_98; + break; + } + break; + case 0x0a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_98; + break; + } + break; + case 0x0b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_98; + break; + } + break; + case 0x0c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_98; + break; + } + break; + case 0x0d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_98; + break; + } + break; + case 0x0e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_98; + break; + } + break; + case 0x0f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_98; + break; + } + break; + case 0x20: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_99: + { + /** 1111 1111 0010 rdst srca srcb add %2, %1, %0 */ +#line 491 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; +#line 491 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srca AU = (op[2] >> 4) & 0x0f; +#line 491 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srcb AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1111 0010 rdst srca srcb add %2, %1, %0 */", + op[0], op[1], op[2]); + printf (" rdst = 0x%x,", rdst); + printf (" srca = 0x%x,", srca); + printf (" srcb = 0x%x\n", srcb); + } + SYNTAX("add %2, %1, %0"); +#line 492 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(add); DR(rdst); SR(srcb); S2R(srca); F("OSZC"); + + /*----------------------------------------------------------------------*/ + /* CMP */ + + } + break; + } + break; + case 0x21: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_99; + break; + } + break; + case 0x22: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_99; + break; + } + break; + case 0x23: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_99; + break; + } + break; + case 0x24: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_99; + break; + } + break; + case 0x25: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_99; + break; + } + break; + case 0x26: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_99; + break; + } + break; + case 0x27: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_99; + break; + } + break; + case 0x28: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_99; + break; + } + break; + case 0x29: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_99; + break; + } + break; + case 0x2a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_99; + break; + } + break; + case 0x2b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_99; + break; + } + break; + case 0x2c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_99; + break; + } + break; + case 0x2d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_99; + break; + } + break; + case 0x2e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_99; + break; + } + break; + case 0x2f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_99; + break; + } + break; + case 0x30: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_100: + { + /** 1111 1111 0011 rdst srca srcb mul %2, %1, %0 */ +#line 585 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; +#line 585 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srca AU = (op[2] >> 4) & 0x0f; +#line 585 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srcb AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1111 0011 rdst srca srcb mul %2, %1, %0 */", + op[0], op[1], op[2]); + printf (" rdst = 0x%x,", rdst); + printf (" srca = 0x%x,", srca); + printf (" srcb = 0x%x\n", srcb); + } + SYNTAX("mul %2, %1, %0"); +#line 586 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(mul); DR(rdst); SR(srcb); S2R(srca); F("O---"); + + /*----------------------------------------------------------------------*/ + /* EMUL */ + + } + break; + } + break; + case 0x31: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_100; + break; + } + break; + case 0x32: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_100; + break; + } + break; + case 0x33: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_100; + break; + } + break; + case 0x34: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_100; + break; + } + break; + case 0x35: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_100; + break; + } + break; + case 0x36: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_100; + break; + } + break; + case 0x37: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_100; + break; + } + break; + case 0x38: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_100; + break; + } + break; + case 0x39: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_100; + break; + } + break; + case 0x3a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_100; + break; + } + break; + case 0x3b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_100; + break; + } + break; + case 0x3c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_100; + break; + } + break; + case 0x3d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_100; + break; + } + break; + case 0x3e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_100; + break; + } + break; + case 0x3f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_100; + break; + } + break; + case 0x40: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_101: + { + /** 1111 1111 0100 rdst srca srcb and %2, %1, %0 */ +#line 401 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; +#line 401 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srca AU = (op[2] >> 4) & 0x0f; +#line 401 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srcb AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1111 0100 rdst srca srcb and %2, %1, %0 */", + op[0], op[1], op[2]); + printf (" rdst = 0x%x,", rdst); + printf (" srca = 0x%x,", srca); + printf (" srcb = 0x%x\n", srcb); + } + SYNTAX("and %2, %1, %0"); +#line 402 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(and); DR(rdst); SR(srcb); S2R(srca); F("-SZ-"); + + /*----------------------------------------------------------------------*/ + /* OR */ + + } + break; + } + break; + case 0x41: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_101; + break; + } + break; + case 0x42: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_101; + break; + } + break; + case 0x43: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_101; + break; + } + break; + case 0x44: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_101; + break; + } + break; + case 0x45: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_101; + break; + } + break; + case 0x46: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_101; + break; + } + break; + case 0x47: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_101; + break; + } + break; + case 0x48: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_101; + break; + } + break; + case 0x49: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_101; + break; + } + break; + case 0x4a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_101; + break; + } + break; + case 0x4b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_101; + break; + } + break; + case 0x4c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_101; + break; + } + break; + case 0x4d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_101; + break; + } + break; + case 0x4e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_101; + break; + } + break; + case 0x4f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_101; + break; + } + break; + case 0x50: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + op_semantics_102: + { + /** 1111 1111 0101 rdst srca srcb or %2, %1, %0 */ +#line 419 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int rdst AU = op[1] & 0x0f; +#line 419 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srca AU = (op[2] >> 4) & 0x0f; +#line 419 "/work/sources/binutils/current/opcodes/rx-decode.opc" + int srcb AU = op[2] & 0x0f; + if (trace) + { + printf ("\033[33m%s\033[0m %02x %02x %02x\n", + "/** 1111 1111 0101 rdst srca srcb or %2, %1, %0 */", + op[0], op[1], op[2]); + printf (" rdst = 0x%x,", rdst); + printf (" srca = 0x%x,", srca); + printf (" srcb = 0x%x\n", srcb); + } + SYNTAX("or %2, %1, %0"); +#line 420 "/work/sources/binutils/current/opcodes/rx-decode.opc" + ID(or); DR(rdst); SR(srcb); S2R(srca); F("-SZ-"); + + /*----------------------------------------------------------------------*/ + /* XOR */ + + } + break; + } + break; + case 0x51: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_102; + break; + } + break; + case 0x52: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_102; + break; + } + break; + case 0x53: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_102; + break; + } + break; + case 0x54: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_102; + break; + } + break; + case 0x55: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_102; + break; + } + break; + case 0x56: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_102; + break; + } + break; + case 0x57: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_102; + break; + } + break; + case 0x58: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_102; + break; + } + break; + case 0x59: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_102; + break; + } + break; + case 0x5a: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_102; + break; + } + break; + case 0x5b: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_102; + break; + } + break; + case 0x5c: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_102; + break; + } + break; + case 0x5d: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_102; + break; + } + break; + case 0x5e: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_102; + break; + } + break; + case 0x5f: + GETBYTE (); + switch (op[2] & 0x00) + { + case 0x00: + goto op_semantics_102; + break; + } + break; + default: UNSUPPORTED(); break; + } + break; + default: UNSUPPORTED(); break; + } +#line 975 "/work/sources/binutils/current/opcodes/rx-decode.opc" + + return rx->n_bytes; +} diff --git a/opcodes/rx-decode.opc b/opcodes/rx-decode.opc new file mode 100644 index 0000000..bddf12b --- /dev/null +++ b/opcodes/rx-decode.opc @@ -0,0 +1,977 @@ +/* -*- c -*- */ +#include +#include +#include + +#include "config.h" +#include "ansidecl.h" +#include "opcode/rx.h" + +#define RX_OPCODE_BIG_ENDIAN 0 + +typedef struct +{ + RX_Opcode_Decoded * rx; + int (* getbyte)(void *); + void * ptr; + unsigned char * op; +} LocalData; + +static int trace = 0; + +#define BSIZE 0 +#define WSIZE 1 +#define LSIZE 2 + +/* These are for when the upper bits are "don't care" or "undefined". */ +static int bwl[] = +{ + RX_Byte, + RX_Word, + RX_Long +}; + +static int sbwl[] = +{ + RX_SByte, + RX_SWord, + RX_Long +}; + +static int ubwl[] = +{ + RX_UByte, + RX_UWord, + RX_Long +}; + +static int memex[] = +{ + RX_SByte, + RX_SWord, + RX_Long, + RX_UWord +}; + +#define ID(x) rx->id = RXO_##x +#define OP(n,t,r,a) (rx->op[n].type = t, \ + rx->op[n].reg = r, \ + rx->op[n].addend = a ) +#define OPs(n,t,r,a,s) (OP (n,t,r,a), \ + rx->op[n].size = s ) + +/* This is for the BWL and BW bitfields. */ +static int SCALE[] = { 1, 2, 4 }; +/* This is for the prefix size enum. */ +static int PSCALE[] = { 4, 1, 1, 1, 2, 2, 2, 3, 4 }; + +static int flagmap[] = {0, 1, 2, 3, 0, 0, 0, 0, + 16, 17, 0, 0, 0, 0, 0, 0 }; + +static int dsp3map[] = { 8, 9, 10, 3, 4, 5, 6, 7 }; + +/* + *C a constant (immediate) c + *R A register + *I Register indirect, no offset + *Is Register indirect, with offset + *D standard displacement: type (r,[r],dsp8,dsp16 code), register, BWL code + *P standard displacement: type (r,[r]), reg, assumes UByte + *Pm memex displacement: type (r,[r]), reg, memex code + *cc condition code. */ + +#define DC(c) OP (0, RX_Operand_Immediate, 0, c) +#define DR(r) OP (0, RX_Operand_Register, r, 0) +#define DI(r,a) OP (0, RX_Operand_Indirect, r, a) +#define DIs(r,a,s) OP (0, RX_Operand_Indirect, r, (a) * SCALE[s]) +#define DD(t,r,s) rx_disp (0, t, r, bwl[s], ld); +#define DF(r) OP (0, RX_Operand_Flag, flagmap[r], 0) + +#define SC(i) OP (1, RX_Operand_Immediate, 0, i) +#define SR(r) OP (1, RX_Operand_Register, r, 0) +#define SI(r,a) OP (1, RX_Operand_Indirect, r, a) +#define SIs(r,a,s) OP (1, RX_Operand_Indirect, r, (a) * SCALE[s]) +#define SD(t,r,s) rx_disp (1, t, r, bwl[s], ld); +#define SP(t,r) rx_disp (1, t, r, (t!=3) ? RX_UByte : RX_Long, ld); P(t, 1); +#define SPm(t,r,m) rx_disp (1, t, r, memex[m], ld); rx->op[1].size = memex[m]; +#define Scc(cc) OP (1, RX_Operand_Condition, cc, 0) + +#define S2C(i) OP (2, RX_Operand_Immediate, 0, i) +#define S2R(r) OP (2, RX_Operand_Register, r, 0) +#define S2I(r,a) OP (2, RX_Operand_Indirect, r, a) +#define S2Is(r,a,s) OP (2, RX_Operand_Indirect, r, (a) * SCALE[s]) +#define S2D(t,r,s) rx_disp (2, t, r, bwl[s], ld); +#define S2P(t,r) rx_disp (2, t, r, (t!=3) ? RX_UByte : RX_Long, ld); P(t, 2); +#define S2Pm(t,r,m) rx_disp (2, t, r, memex[m], ld); rx->op[2].size = memex[m]; +#define S2cc(cc) OP (2, RX_Operand_Condition, cc, 0) + +#define BWL(sz) rx->op[0].size = rx->op[1].size = rx->op[2].size = rx->size = bwl[sz] +#define sBWL(sz) rx->op[0].size = rx->op[1].size = rx->op[2].size = rx->size = sbwl[sz] +#define uBWL(sz) rx->op[0].size = rx->op[1].size = rx->op[2].size = rx->size = ubwl[sz] +#define P(t, n) rx->op[n].size = (t!=3) ? RX_UByte : RX_Long; + +#define F(f) store_flags(rx, f) + +#define AU ATTRIBUTE_UNUSED +#define GETBYTE() (ld->op [ld->rx->n_bytes++] = ld->getbyte (ld->ptr)) + +#define SYNTAX(x) rx->syntax = x + +#define UNSUPPORTED() \ + rx->syntax = "*unknown*" + +#define IMM(sf) immediate (sf, 0, ld) +#define IMMex(sf) immediate (sf, 1, ld) + +static int +immediate (int sfield, int ex, LocalData * ld) +{ + unsigned long i = 0, j; + + switch (sfield) + { +#define B ((unsigned long) GETBYTE()) + case 0: +#if RX_OPCODE_BIG_ENDIAN + i = B; + if (ex && (i & 0x80)) + i -= 0x100; + i <<= 24; + i |= B << 16; + i |= B << 8; + i |= B; +#else + i = B; + i |= B << 8; + i |= B << 16; + j = B; + if (ex && (j & 0x80)) + j -= 0x100; + i |= j << 24; +#endif + break; + case 3: +#if RX_OPCODE_BIG_ENDIAN + i = B << 16; + i |= B << 8; + i |= B; +#else + i = B; + i |= B << 8; + i |= B << 16; +#endif + if (ex && (i & 0x800000)) + i -= 0x1000000; + break; + case 2: +#if RX_OPCODE_BIG_ENDIAN + i |= B << 8; + i |= B; +#else + i |= B; + i |= B << 8; +#endif + if (ex && (i & 0x8000)) + i -= 0x10000; + break; + case 1: + i |= B; + if (ex && (i & 0x80)) + i -= 0x100; + break; + default: + abort(); + } + return i; +} + +static void +rx_disp (int n, int type, int reg, int size, LocalData * ld) +{ + int disp; + + ld->rx->op[n].reg = reg; + switch (type) + { + case 3: + ld->rx->op[n].type = RX_Operand_Register; + break; + case 0: + ld->rx->op[n].type = RX_Operand_Indirect; + ld->rx->op[n].addend = 0; + break; + case 1: + ld->rx->op[n].type = RX_Operand_Indirect; + disp = GETBYTE (); + ld->rx->op[n].addend = disp * PSCALE[size]; + break; + case 2: + ld->rx->op[n].type = RX_Operand_Indirect; + disp = GETBYTE (); +#if RX_OPCODE_BIG_ENDIAN + disp = disp * 256 + GETBYTE (); +#else + disp = disp + GETBYTE () * 256; +#endif + ld->rx->op[n].addend = disp * PSCALE[size]; + break; + default: + abort (); + } +} + +/* The syntax is "OSZC" where each character is one of the following: + - = flag unchanged + 0 = flag cleared + 1 = flag set + ? = flag undefined + x = flag set (any letter will do, use it for hints :). */ + +static void +store_flags (RX_Opcode_Decoded * rx, char * str) +{ + int i, mask; + rx->flags_0 = 0; + rx->flags_1 = 0; + rx->flags_s = 0; + + for (i = 0; i < 4; i++) + { + mask = 8 >> i; + switch (str[i]) + { + case 0: + abort (); + case '-': + break; + case '0': + rx->flags_0 |= mask; + break; + case '1': + rx->flags_1 |= mask; + break; + case '?': + break; + default: + rx->flags_0 |= mask; + rx->flags_s |= mask; + break; + } + } +} + +int +rx_decode_opcode (unsigned long pc AU, + RX_Opcode_Decoded * rx, + int (* getbyte)(void *), + void * ptr) +{ + LocalData lds, * ld = &lds; + unsigned char op[20] = {0}; + + lds.rx = rx; + lds.getbyte = getbyte; + lds.ptr = ptr; + lds.op = op; + + memset (rx, 0, sizeof (*rx)); + BWL(LSIZE); + +/** VARY sz 00 01 10 */ + +/*----------------------------------------------------------------------*/ +/* MOV */ + +/** 0111 0101 0100 rdst mov%s #%1, %0 */ + ID(mov); DR(rdst); SC(IMM (1)); F("----"); + +/** 1111 10sd rdst im sz mov%s #%1, %0 */ + ID(mov); sBWL (sz); DD(sd, rdst, sz); SC(IMMex(im)); F("----"); + +/** 0110 0110 immm rdst mov%s #%1, %0 */ + ID(mov); DR(rdst); SC(immm); F("----"); + +/** 0011 11sz d dst sppp mov%s #%1, %0 */ + ID(mov); sBWL (sz); DIs(dst, d*16+sppp, sz); SC(IMM(1)); F("----"); + +/** 11sz sd ss rsrc rdst mov%s %1, %0 */ + ID(mov); sBWL(sz); F("----"); + if ((ss == 3) && (sd != 3)) + { + SD(ss, rdst, sz); DD(sd, rsrc, sz); + } + else + { + SD(ss, rsrc, sz); DD(sd, rdst, sz); + } + +/** 10sz 1dsp a src b dst mov%s %1, %0 */ + ID(mov); sBWL(sz); DR(dst); SIs(src, dsp*4+a*2+b, sz); F("----"); + +/** 10sz 0dsp a dst b src mov%s %1, %0 */ + ID(mov); sBWL(sz); DIs(dst, dsp*4+a*2+b, sz); SR(src); F("----"); + +/** 1111 1110 01sz isrc bsrc rdst mov%s [%1, %2], %0 */ + ID(movbi); sBWL(sz); DR(rdst); SR(isrc); S2R(bsrc); F("----"); + +/** 1111 1110 00sz isrc bsrc rdst mov%s %0, [%1, %2] */ + ID(movbir); sBWL(sz); DR(rdst); SR(isrc); S2R(bsrc); F("----"); + +/** 1111 1110 11sz isrc bsrc rdst movu%s [%1, %2], %0 */ + ID(movbi); uBWL(sz); DR(rdst); SR(isrc); S2R(bsrc); F("----"); + +/** 1111 1101 0010 0p sz rdst rsrc mov%s %1, %0 */ + ID(mov); sBWL (sz); SR(rsrc); F("----"); + OP(0, p ? RX_Operand_Predec : RX_Operand_Postinc, rdst, 0); + +/** 1111 1101 0010 1p sz rsrc rdst mov%s %1, %0 */ + ID(mov); sBWL (sz); DR(rdst); F("----"); + OP(1, p ? RX_Operand_Predec : RX_Operand_Postinc, rsrc, 0); + +/** 1011 w dsp a src b dst movu%s %1, %0 */ + ID(mov); uBWL(w); DR(dst); SIs(src, dsp*4+a*2+b, w); F("----"); + +/** 0101 1 s ss rsrc rdst movu%s %1, %0 */ + ID(mov); uBWL(s); SD(ss, rsrc, s); DR(rdst); F("----"); + +/** 1111 1101 0011 1p sz rsrc rdst movu%s %1, %0 */ + ID(mov); uBWL (sz); DR(rdst); F("----"); + OP(1, p ? RX_Operand_Predec : RX_Operand_Postinc, rsrc, 0); + +/*----------------------------------------------------------------------*/ +/* PUSH/POP */ + +/** 0110 1111 dsta dstb popm %1-%2 */ + ID(popm); SR(dsta); S2R(dstb); F("----"); + +/** 0110 1110 dsta dstb pushm %1-%2 */ + ID(pushm); SR(dsta); S2R(dstb); F("----"); + +/** 0111 1110 1011 rdst pop %0 */ + ID(mov); OP(1, RX_Operand_Postinc, 0, 0); DR(rdst); F("----"); + +/** 0111 1110 10sz rsrc push%s %1 */ + ID(mov); BWL(sz); OP(0, RX_Operand_Predec, 0, 0); SR(rsrc); F("----"); + +/** 1111 01ss rsrc 10sz push%s %1 */ + ID(mov); BWL(sz); OP(0, RX_Operand_Predec, 0, 0); SD(ss, rsrc, sz); F("----"); + +/*----------------------------------------------------------------------*/ +/* XCHG */ + +/** 1111 1100 0100 00ss rsrc rdst xchg %1%S1, %0 */ + ID(xchg); DR(rdst); SP(ss, rsrc); + +/** 0000 0110 mx10 00ss 0001 0000 rsrc rdst xchg %1%S1, %0 */ + ID(xchg); DR(rdst); SPm(ss, rsrc, mx); + +/*----------------------------------------------------------------------*/ +/* STZ/STNZ */ + +/** 1111 1101 0111 im00 1110rdst stz #%1, %0 */ + ID(stcc); SC(IMMex(im)); DR(rdst); S2cc(RXC_z); + +/** 1111 1101 0111 im00 1111rdst stnz #%1, %0 */ + ID(stcc); SC(IMMex(im)); DR(rdst); S2cc(RXC_nz); + +/*----------------------------------------------------------------------*/ +/* RTSD */ + +/** 0110 0111 rtsd #%1 */ + ID(rtsd); SC(IMM(1) * 4); + +/** 0011 1111 rega regb rtsd #%1, %2-%0 */ + ID(rtsd); SC(IMM(1) * 4); S2R(rega); DR(regb); + +/*----------------------------------------------------------------------*/ +/* AND */ + +/** 0110 0100 immm rdst and #%1, %0 */ + ID(and); SC(immm); DR(rdst); F("-SZ-"); + +/** 0111 01im 0010 rdst and #%1, %0 */ + ID(and); SC(IMMex(im)); DR(rdst); F("-SZ-"); + +/** 0101 00ss rsrc rdst and %1%S1, %0 */ + ID(and); SP(ss, rsrc); DR(rdst); F("-SZ-"); + +/** 0000 0110 mx01 00ss rsrc rdst and %1%S1, %0 */ + ID(and); SPm(ss, rsrc, mx); DR(rdst); F("-SZ-"); + +/** 1111 1111 0100 rdst srca srcb and %2, %1, %0 */ + ID(and); DR(rdst); SR(srcb); S2R(srca); F("-SZ-"); + +/*----------------------------------------------------------------------*/ +/* OR */ + +/** 0110 0101 immm rdst or #%1, %0 */ + ID(or); SC(immm); DR(rdst); F("-SZ-"); + +/** 0111 01im 0011 rdst or #%1, %0 */ + ID(or); SC(IMMex(im)); DR(rdst); F("-SZ-"); + +/** 0101 01ss rsrc rdst or %1%S1, %0 */ + ID(or); SP(ss, rsrc); DR(rdst); F("-SZ-"); + +/** 0000 0110 mx01 01ss rsrc rdst or %1%S1, %0 */ + ID(or); SPm(ss, rsrc, mx); DR(rdst); F("-SZ-"); + +/** 1111 1111 0101 rdst srca srcb or %2, %1, %0 */ + ID(or); DR(rdst); SR(srcb); S2R(srca); F("-SZ-"); + +/*----------------------------------------------------------------------*/ +/* XOR */ + +/** 1111 1101 0111 im00 1101rdst xor #%1, %0 */ + ID(xor); SC(IMMex(im)); DR(rdst); F("-SZ-"); + +/** 1111 1100 0011 01ss rsrc rdst xor %1%S1, %0 */ + ID(xor); SP(ss, rsrc); DR(rdst); F("-SZ-"); + +/** 0000 0110 mx10 00ss 0000 1101 rsrc rdst xor %1%S1, %0 */ + ID(xor); SPm(ss, rsrc, mx); DR(rdst); F("-SZ-"); + +/*----------------------------------------------------------------------*/ +/* NOT */ + +/** 0111 1110 0000 rdst not %0 */ + ID(xor); DR(rdst); SR(rdst); S2C(~0); F("-SZ-"); + +/** 1111 1100 0011 1011 rsrc rdst not %1, %0 */ + ID(xor); DR(rdst); SR(rsrc); S2C(~0); F("-SZ-"); + +/*----------------------------------------------------------------------*/ +/* TST */ + +/** 1111 1101 0111 im00 1100rdst tst #%1, %2 */ + ID(and); SC(IMMex(im)); S2R(rdst); F("-SZ-"); + +/** 1111 1100 0011 00ss rsrc rdst tst %1%S1, %2 */ + ID(and); SP(ss, rsrc); S2R(rdst); F("-SZ-"); + +/** 0000 0110 mx10 00ss 0000 1100 rsrc rdst tst %1%S1, %2 */ + ID(and); SPm(ss, rsrc, mx); S2R(rdst); F("-SZ-"); + +/*----------------------------------------------------------------------*/ +/* NEG */ + +/** 0111 1110 0001 rdst neg %0 */ + ID(sub); DR(rdst); SC(0); S2R(rdst); F("OSZC"); + +/** 1111 1100 0000 0111 rsrc rdst neg %2, %0 */ + ID(sub); DR(rdst); SC(0); S2R(rsrc); F("OSZC"); + +/*----------------------------------------------------------------------*/ +/* ADC */ + +/** 1111 1101 0111 im00 0010rdst adc #%1, %0 */ + ID(adc); SC(IMMex(im)); DR(rdst); F("OSZC"); + +/** 1111 1100 0000 1011 rsrc rdst adc %1, %0 */ + ID(adc); SR(rsrc); DR(rdst); F("OSZC"); + +/** 0000 0110 1010 00ss 0000 0010 rsrc rdst adc %1%S1, %0 */ + ID(adc); SPm(ss, rsrc, 2); DR(rdst); F("OSZC"); + +/*----------------------------------------------------------------------*/ +/* ADD */ + +/** 0110 0010 immm rdst add #%1, %0 */ + ID(add); SC(immm); DR(rdst); F("OSZC"); + +/** 0100 10ss rsrc rdst add %1%S1, %0 */ + ID(add); SP(ss, rsrc); DR(rdst); F("OSZC"); + +/** 0000 0110 mx00 10ss rsrc rdst add %1%S1, %0 */ + ID(add); SPm(ss, rsrc, mx); DR(rdst); F("OSZC"); + +/** 0111 00im rsrc rdst add #%1, %2, %0 */ + ID(add); SC(IMMex(im)); S2R(rsrc); DR(rdst); F("OSZC"); + +/** 1111 1111 0010 rdst srca srcb add %2, %1, %0 */ + ID(add); DR(rdst); SR(srcb); S2R(srca); F("OSZC"); + +/*----------------------------------------------------------------------*/ +/* CMP */ + +/** 0110 0001 immm rdst cmp #%2, %1 */ + ID(sub); S2C(immm); SR(rdst); F("OSZC"); + +/** 0111 01im 0000 rsrc cmp #%2, %1%S1 */ + ID(sub); SR(rsrc); S2C(IMMex(im)); F("OSZC"); + +/** 0111 0101 0101 rsrc cmp #%2, %1 */ + ID(sub); SR(rsrc); S2C(IMM(1)); F("OSZC"); + +/** 0100 01ss rsrc rdst cmp %2%S2, %1 */ + ID(sub); S2P(ss, rsrc); SR(rdst); F("OSZC"); + +/** 0000 0110 mx00 01ss rsrc rdst cmp %2%S2, %1 */ + ID(sub); S2Pm(ss, rsrc, mx); SR(rdst); F("OSZC"); + +/*----------------------------------------------------------------------*/ +/* SUB */ + +/** 0110 0000 immm rdst sub #%2, %0 */ + ID(sub); S2C(immm); SR(rdst); DR(rdst); F("OSZC"); + +/** 0100 00ss rsrc rdst sub %2%S2, %1 */ + ID(sub); S2P(ss, rsrc); SR(rdst); DR(rdst); F("OSZC"); + +/** 0000 0110 mx00 00ss rsrc rdst sub %2%S2, %1 */ + ID(sub); S2Pm(ss, rsrc, mx); SR(rdst); DR(rdst); F("OSZC"); + +/** 1111 1111 0000 rdst srca srcb sub %2, %1, %0 */ + ID(sub); DR(rdst); SR(srcb); S2R(srca); F("OSZC"); + +/*----------------------------------------------------------------------*/ +/* SBB */ + +/** 1111 1100 0000 0011 rsrc rdst sbb %1, %0 */ + ID(sbb); SR (rsrc); DR(rdst); F("OSZC"); + + /* FIXME: only supports .L */ +/** 0000 0110 mx10 00sp 0000 0000 rsrc rdst sbb %1%S1, %0 */ + ID(sbb); SPm(sp, rsrc, mx); DR(rdst); F("OSZC"); + +/*----------------------------------------------------------------------*/ +/* ABS */ + +/** 0111 1110 0010 rdst abs %0 */ + ID(abs); DR(rdst); SR(rdst); F("OSZ-"); + +/** 1111 1100 0000 1111 rsrc rdst abs %1, %0 */ + ID(abs); DR(rdst); SR(rsrc); F("OSZ-"); + +/*----------------------------------------------------------------------*/ +/* MAX */ + +/** 1111 1101 0111 im00 0100rdst max #%1, %0 */ + ID(max); DR(rdst); SC(IMMex(im)); + +/** 1111 1100 0001 00ss rsrc rdst max %1%S1, %0 */ + ID(max); SP(ss, rsrc); DR(rdst); + +/** 0000 0110 mx10 00ss 0000 0100 rsrc rdst max %1%S1, %0 */ + ID(max); SPm(ss, rsrc, mx); DR(rdst); + +/*----------------------------------------------------------------------*/ +/* MIN */ + +/** 1111 1101 0111 im00 0101rdst min #%1, %0 */ + ID(min); DR(rdst); SC(IMMex(im)); + +/** 1111 1100 0001 01ss rsrc rdst min %1%S1, %0 */ + ID(min); SP(ss, rsrc); DR(rdst); + +/** 0000 0110 mx10 00ss 0000 0101 rsrc rdst min %1%S1, %0 */ + ID(min); SPm(ss, rsrc, mx); DR(rdst); + +/*----------------------------------------------------------------------*/ +/* MUL */ + +/** 0110 0011 immm rdst mul #%1, %0 */ + ID(mul); DR(rdst); SC(immm); F("O---"); + +/** 0111 01im 0001rdst mul #%1, %0 */ + ID(mul); DR(rdst); SC(IMMex(im)); F("O---"); + +/** 0100 11ss rsrc rdst mul %1%S1, %0 */ + ID(mul); SP(ss, rsrc); DR(rdst); F("O---"); + +/** 0000 0110 mx00 11ss rsrc rdst mul %1%S1, %0 */ + ID(mul); SPm(ss, rsrc, mx); DR(rdst); F("O---"); + +/** 1111 1111 0011 rdst srca srcb mul %2, %1, %0 */ + ID(mul); DR(rdst); SR(srcb); S2R(srca); F("O---"); + +/*----------------------------------------------------------------------*/ +/* EMUL */ + +/** 1111 1101 0111 im00 0110rdst emul #%1, %0 */ + ID(emul); DR(rdst); SC(IMMex(im)); + +/** 1111 1100 0001 10ss rsrc rdst emul %1%S1, %0 */ + ID(emul); SP(ss, rsrc); DR(rdst); + +/** 0000 0110 mx10 00ss 0000 0110 rsrc rdst emul %1%S1, %0 */ + ID(emul); SPm(ss, rsrc, mx); DR(rdst); + +/*----------------------------------------------------------------------*/ +/* EMULU */ + +/** 1111 1101 0111 im00 0111rdst emulu #%1, %0 */ + ID(emulu); DR(rdst); SC(IMMex(im)); + +/** 1111 1100 0001 11ss rsrc rdst emulu %1%S1, %0 */ + ID(emulu); SP(ss, rsrc); DR(rdst); + +/** 0000 0110 mx10 00ss 0000 0111 rsrc rdst emulu %1%S1, %0 */ + ID(emulu); SPm(ss, rsrc, mx); DR(rdst); + +/*----------------------------------------------------------------------*/ +/* DIV */ + +/** 1111 1101 0111 im00 1000rdst div #%1, %0 */ + ID(div); DR(rdst); SC(IMMex(im)); F("O---"); + +/** 1111 1100 0010 00ss rsrc rdst div %1%S1, %0 */ + ID(div); SP(ss, rsrc); DR(rdst); F("O---"); + +/** 0000 0110 mx10 00ss 0000 1000 rsrc rdst div %1%S1, %0 */ + ID(div); SPm(ss, rsrc, mx); DR(rdst); F("O---"); + +/*----------------------------------------------------------------------*/ +/* DIVU */ + +/** 1111 1101 0111 im00 1001rdst divu #%1, %0 */ + ID(divu); DR(rdst); SC(IMMex(im)); F("O---"); + +/** 1111 1100 0010 01ss rsrc rdst divu %1%S1, %0 */ + ID(divu); SP(ss, rsrc); DR(rdst); F("O---"); + +/** 0000 0110 mx10 00ss 0000 1001 rsrc rdst divu %1%S1, %0 */ + ID(divu); SPm(ss, rsrc, mx); DR(rdst); F("O---"); + +/*----------------------------------------------------------------------*/ +/* SHIFT */ + +/** 0110 110i mmmm rdst shll #%2, %0 */ + ID(shll); S2C(i*16+mmmm); SR(rdst); DR(rdst); F("OSZC"); + +/** 1111 1101 0110 0010 rsrc rdst shll %2, %0 */ + ID(shll); S2R(rsrc); SR(rdst); DR(rdst); F("OSZC"); + +/** 1111 1101 110immmm rsrc rdst shll #%2, %1, %0 */ + ID(shll); S2C(immmm); SR(rsrc); DR(rdst); F("OSZC"); + + +/** 0110 101i mmmm rdst shar #%2, %0 */ + ID(shar); S2C(i*16+mmmm); SR(rdst); DR(rdst); F("0SZC"); + +/** 1111 1101 0110 0001 rsrc rdst shar %2, %0 */ + ID(shar); S2R(rsrc); SR(rdst); DR(rdst); F("0SZC"); + +/** 1111 1101 101immmm rsrc rdst shar #%2, %1, %0 */ + ID(shar); S2C(immmm); SR(rsrc); DR(rdst); F("0SZC"); + + +/** 0110 100i mmmm rdst shlr #%2, %0 */ + ID(shlr); S2C(i*16+mmmm); SR(rdst); DR(rdst); F("-SZC"); + +/** 1111 1101 0110 0000 rsrc rdst shlr %2, %0 */ + ID(shlr); S2R(rsrc); SR(rdst); DR(rdst); F("-SZC"); + +/** 1111 1101 100immmm rsrc rdst shlr #%2, %1, %0 */ + ID(shlr); S2C(immmm); SR(rsrc); DR(rdst); F("-SZC"); + +/*----------------------------------------------------------------------*/ +/* ROTATE */ + +/** 0111 1110 0101 rdst rolc %0 */ + ID(rolc); DR(rdst); F("-SZC"); + +/** 0111 1110 0100 rdst rorc %0 */ + ID(rorc); DR(rdst); F("-SZC"); + +/** 1111 1101 0110 111i mmmm rdst rotl #%1, %0 */ + ID(rotl); SC(i*16+mmmm); DR(rdst); F("-SZC"); + +/** 1111 1101 0110 0110 rsrc rdst rotl %1, %0 */ + ID(rotl); SR(rsrc); DR(rdst); F("-SZC"); + +/** 1111 1101 0110 110i mmmm rdst rotr #%1, %0 */ + ID(rotr); SC(i*16+mmmm); DR(rdst); F("-SZC"); + +/** 1111 1101 0110 0100 rsrc rdst rotr %1, %0 */ + ID(rotr); SR(rsrc); DR(rdst); F("-SZC"); + +/** 1111 1101 0110 0101 rsrc rdst revw %1, %0 */ + ID(revw); SR(rsrc); DR(rdst); + +/** 1111 1101 0110 0111 rsrc rdst revl %1, %0 */ + ID(revl); SR(rsrc); DR(rdst); + +/*----------------------------------------------------------------------*/ +/* BRANCH */ + +/** 0001 n dsp b%1.s %a0 */ + ID(branch); Scc(n); DC(pc + dsp3map[dsp]); + +/** 0010 cond b%1.b %a0 */ + ID(branch); Scc(cond); DC(pc + IMMex (1)); + +/** 0011 101c b%1.w %a0 */ + ID(branch); Scc(c); DC(pc + IMMex (2)); + + +/** 0000 1dsp bra.s %a0 */ + ID(branch); Scc(RXC_always); DC(pc + dsp3map[dsp]); + +/** 0010 1110 bra.b %a0 */ + ID(branch); Scc(RXC_always); DC(pc + IMMex(1)); + +/** 0011 1000 bra.w %a0 */ + ID(branch); Scc(RXC_always); DC(pc + IMMex(2)); + +/** 0000 0100 bra.a %a0 */ + ID(branch); Scc(RXC_always); DC(pc + IMMex(3)); + +/** 0111 1111 0100 rsrc bra.l %0 */ + ID(branchrel); Scc(RXC_always); DR(rsrc); + + +/** 0111 1111 0000 rsrc jmp %0 */ + ID(branch); Scc(RXC_always); DR(rsrc); + +/** 0111 1111 0001 rsrc jsr %0 */ + ID(jsr); DR(rsrc); + +/** 0011 1001 bsr.w %a0 */ + ID(jsr); DC(pc + IMMex(2)); + +/** 0000 0101 bsr.a %a0 */ + ID(jsr); DC(pc + IMMex(3)); + +/** 0111 1111 0101 rsrc bsr.l %0 */ + ID(jsrrel); DR(rsrc); + +/** 0000 0010 rts */ + ID(rts); + +/*----------------------------------------------------------------------*/ +/* NOP */ + +/** 0000 0011 nop */ + ID(nop); + +/*----------------------------------------------------------------------*/ +/* STRING FUNCTIONS */ + +/** 0111 1111 1000 0011 scmpu */ + ID(scmpu); F("--ZC"); + +/** 0111 1111 1000 0111 smovu */ + ID(smovu); + +/** 0111 1111 1000 1011 smovb */ + ID(smovb); + +/** 0111 1111 1000 00sz suntil%s */ + ID(suntil); BWL(sz); F("OSZC"); + +/** 0111 1111 1000 01sz swhile%s */ + ID(swhile); BWL(sz); F("OSZC"); + +/** 0111 1111 1000 1111 smovf */ + ID(smovf); + +/** 0111 1111 1000 10sz sstr%s */ + ID(sstr); BWL(sz); + +/*----------------------------------------------------------------------*/ +/* RMPA */ + +/** 0111 1111 1000 11sz rmpa%s */ + ID(rmpa); BWL(sz); F("OS--"); + +/*----------------------------------------------------------------------*/ +/* HI/LO stuff */ + +/** 1111 1101 0000 0000 srca srcb mulhi %1, %2 */ + ID(mulhi); SR(srca); S2R(srcb); F("----"); + +/** 1111 1101 0000 0001 srca srcb mullo %1, %2 */ + ID(mullo); SR(srca); S2R(srcb); F("----"); + +/** 1111 1101 0000 0100 srca srcb machi %1, %2 */ + ID(machi); SR(srca); S2R(srcb); F("----"); + +/** 1111 1101 0000 0101 srca srcb maclo %1, %2 */ + ID(maclo); SR(srca); S2R(srcb); F("----"); + +/** 1111 1101 0001 0111 0000 rsrc mvtachi %1 */ + ID(mvtachi); SR(rsrc); F("----"); + +/** 1111 1101 0001 0111 0001 rsrc mvtaclo %1 */ + ID(mvtaclo); SR(rsrc); F("----"); + +/** 1111 1101 0001 1111 0000 rdst mvfachi %0 */ + ID(mvfachi); DR(rdst); F("----"); + +/** 1111 1101 0001 1111 0010 rdst mvfacmi %0 */ + ID(mvfacmi); DR(rdst); F("----"); + +/** 1111 1101 0001 1111 0001 rdst mvfaclo %0 */ + ID(mvfaclo); DR(rdst); F("----"); + +/** 1111 1101 0001 1000 000i 0000 racw #%1 */ + ID(racw); SC(i+1); F("----"); + +/*----------------------------------------------------------------------*/ +/* SAT */ + +/** 0111 1110 0011 rdst sat %0 */ + ID(sat); DR (rdst); + +/** 0111 1111 1001 0011 satr */ + ID(satr); + +/*----------------------------------------------------------------------*/ +/* FLOAT */ + +/** 1111 1101 0111 0010 0010 rdst fadd #%1, %0 */ + ID(fadd); DR(rdst); SC(IMM(0)); F("-SZ-"); + +/** 1111 1100 1000 10sd rsrc rdst fadd %1%S1, %0 */ + ID(fadd); DR(rdst); SD(sd, rsrc, LSIZE); F("-SZ-"); + +/** 1111 1101 0111 0010 0001 rdst fcmp #%1, %0 */ + ID(fcmp); DR(rdst); SC(IMM(0)); F("OSZ-"); + +/** 1111 1100 1000 01sd rsrc rdst fcmp %1%S1, %0 */ + ID(fcmp); DR(rdst); SD(sd, rsrc, LSIZE); F("OSZ-"); + +/** 1111 1101 0111 0010 0000 rdst fsub #%1, %0 */ + ID(fsub); DR(rdst); SC(IMM(0)); F("-SZ-"); + +/** 1111 1100 1000 00sd rsrc rdst fsub %1%S1, %0 */ + ID(fsub); DR(rdst); SD(sd, rsrc, LSIZE); F("-SZ-"); + +/** 1111 1100 1001 01sd rsrc rdst ftoi %1%S1, %0 */ + ID(ftoi); DR(rdst); SD(sd, rsrc, LSIZE); F("-SZ-"); + +/** 1111 1101 0111 0010 0011 rdst fmul #%1, %0 */ + ID(fmul); DR(rdst); SC(IMM(0)); F("-SZ-"); + +/** 1111 1100 1000 11sd rsrc rdst fmul %1%S1, %0 */ + ID(fmul); DR(rdst); SD(sd, rsrc, LSIZE); F("-SZ-"); + +/** 1111 1101 0111 0010 0100 rdst fdiv #%1, %0 */ + ID(fdiv); DR(rdst); SC(IMM(0)); F("-SZ-"); + +/** 1111 1100 1001 00sd rsrc rdst fdiv %1%S1, %0 */ + ID(fdiv); DR(rdst); SD(sd, rsrc, LSIZE); F("-SZ-"); + +/** 1111 1100 1001 10sd rsrc rdst round %1%S1, %0 */ + ID(round); DR(rdst); SD(sd, rsrc, LSIZE); F("-SZ-"); + +/** 1111 1100 0100 01sd rsrc rdst itof %1%S1, %0 */ + ID(itof); DR (rdst); SP(sd, rsrc); F("-SZ-"); + +/** 0000 0110 mx10 00sd 0001 0001 rsrc rdst itof %1%S1, %0 */ + ID(itof); DR (rdst); SPm(sd, rsrc, mx); F("-SZ-"); + +/*----------------------------------------------------------------------*/ +/* BIT OPS */ + +/** 1111 00sd rdst 0bit bset #%1, %0%S0 */ + ID(bset); BWL(BSIZE); SC(bit); DD(sd, rdst, BSIZE); F("----"); + +/** 1111 1100 0110 00sd rdst rsrc bset %1, %0%S0 */ + ID(bset); BWL(BSIZE); SR(rsrc); DD(sd, rdst, BSIZE); F("----"); + +/** 0111 100b ittt rdst bset #%1, %0 */ + ID(bset); BWL(LSIZE); SC(b*16+ittt); DR(rdst); F("----"); + + +/** 1111 00sd rdst 1bit bclr #%1, %0%S0 */ + ID(bclr); BWL(BSIZE); SC(bit); DD(sd, rdst, BSIZE); F("----"); + +/** 1111 1100 0110 01sd rdst rsrc bclr %1, %0%S0 */ + ID(bclr); BWL(BSIZE); SR(rsrc); DD(sd, rdst, BSIZE); F("----"); + +/** 0111 101b ittt rdst bclr #%1, %0 */ + ID(bclr); BWL(LSIZE); SC(b*16+ittt); DR(rdst); F("----"); + + +/** 1111 01sd rdst 0bit btst #%2, %1%S1 */ + ID(btst); BWL(BSIZE); S2C(bit); SD(sd, rdst, BSIZE); F("--ZC"); + +/** 1111 1100 0110 10sd rdst rsrc btst %2, %1%S1 */ + ID(btst); BWL(BSIZE); S2R(rsrc); SD(sd, rdst, BSIZE); F("--ZC"); + +/** 0111 110b ittt rdst btst #%2, %1 */ + ID(btst); BWL(LSIZE); S2C(b*16+ittt); SR(rdst); F("--ZC"); + + +/** 1111 1100 111bit sd rdst 1111 bnot #%1, %0%S0 */ + ID(bnot); BWL(BSIZE); SC(bit); DD(sd, rdst, BSIZE); + +/** 1111 1100 0110 11sd rdst rsrc bnot %1, %0%S0 */ + ID(bnot); BWL(BSIZE); SR(rsrc); DD(sd, rdst, BSIZE); + +/** 1111 1101 111bittt 1111 rdst bnot #%1, %0 */ + ID(bnot); BWL(LSIZE); SC(bittt); DR(rdst); + + +/** 1111 1100 111bit sd rdst cond bm%2 #%1, %0%S0 */ + ID(bmcc); BWL(BSIZE); S2cc(cond); SC(bit); DD(sd, rdst, BSIZE); + +/** 1111 1101 111 bittt cond rdst bm%2 #%1, %0%S0 */ + ID(bmcc); BWL(LSIZE); S2cc(cond); SC(bittt); DR(rdst); + +/*----------------------------------------------------------------------*/ +/* CONTROL REGISTERS */ + +/** 0111 1111 1011 rdst clrpsw %0 */ + ID(clrpsw); DF(rdst); + +/** 0111 1111 1010 rdst setpsw %0 */ + ID(setpsw); DF(rdst); + +/** 0111 1110 111 crdst popc %0 */ + ID(mov); OP(1, RX_Operand_Postinc, 0, 0); DR(crdst + 16); + +/** 0111 1110 110 crsrc pushc %1 */ + 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 0110 100c rsrc rdst mvtc %1, %0 */ + ID(mov); SR(rsrc); DR(c*16+rdst + 16); + +/** 1111 1101 0110 101s rsrc rdst mvfc %1, %0 */ + ID(mov); SR((s*16+rsrc) + 16); DR(rdst); + +/*?* 1111 1101 1111 1010 01cp rsrc mvtcp #%2, %1, #%0 */ + ID(mvtcp); S2C(cp); SR(rsrc); DC (IMM (WSIZE)); + +/*?* 1111 1101 1111 1011 01cp rdst mvfcp #%2, %0, #%1 */ + ID(mvfcp); S2C(cp); DR(rdst); SC (IMM (WSIZE)); + +/*?* 1111 1101 1111 1001 01cp 0000 opecp #%2, #%1 */ + ID(opecp); S2C(cp); SC (IMM (WSIZE)); + +/*----------------------------------------------------------------------*/ +/* INTERRUPTS */ + +/** 0111 1111 1001 0100 rtfi */ + ID(rtfi); + +/** 0111 1111 1001 0101 rte */ + ID(rte); + +/** 0000 0000 brk */ + ID(brk); + +/** 0000 0001 dbt */ + ID(dbt); + +/** 0111 0101 0110 0000 int #%1 */ + ID(int); SC(IMM(1)); + +/** 0111 1111 1001 0110 wait */ + ID(wait); + +/*----------------------------------------------------------------------*/ +/* SCcnd */ + +/** 1111 1100 1101 sz sd rdst cond sc%1%s %0 */ + ID(sccnd); BWL(sz); DD (sd, rdst, sz); Scc(cond); + +/** */ + + return rx->n_bytes; +} diff --git a/opcodes/rx-dis.c b/opcodes/rx-dis.c new file mode 100644 index 0000000..3413b1d --- /dev/null +++ b/opcodes/rx-dis.c @@ -0,0 +1,199 @@ +/* Disassembler code for Renesas RX. + Copyright 2008, 2009 Free Software Foundation, Inc. + Contributed by Red Hat. + Written by DJ Delorie. + + This file is part of the GNU opcodes library. + + This library is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + It is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#include + +#include "bfd.h" +#include "dis-asm.h" +#include "opcode/rx.h" + +typedef struct +{ + bfd_vma pc; + disassemble_info * dis; +} RX_Data; + +static int +rx_get_byte (void * vdata) +{ + bfd_byte buf[1]; + RX_Data *rx_data = (RX_Data *) vdata; + + rx_data->dis->read_memory_func (rx_data->pc, + buf, + 1, + rx_data->dis); + + rx_data->pc ++; + return buf[0]; +} + +static char const * size_names[] = +{ + "", ".b", ".ub", ".b", ".w", ".uw", ".w", ".a", ".l" +}; + +static char const * opsize_names[] = +{ + "", ".b", ".b", ".b", ".w", ".w", ".w", ".a", ".l" +}; + +static char const * register_names[] = +{ + /* general registers */ + "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", + /* control register */ + "psw", "pc", "usp", "fpsw", "cpen", "", "", "wr", + "bpsw", "bpc", "isp", "fintv", "intb", "", "", "", + "pbp", "pben", "", "", "", "", "", "", + "bbpsw", "bbpc", "", "", "", "", "", "" +}; + +static char const * condition_names[] = +{ + /* condition codes */ + "eq", "ne", "c", "nc", "gtu", "leu", "pz", "n", + "ge", "lt", "gt", "le", "o", "no", "always", "never" +}; + +static const char * flag_names[] = +{ + "c", "z", "s", "o", "", "", "", "", + "", "", "", "", "", "", "", "", + "i", "u", "", "", "", "", "", "" + "", "", "", "", "", "", "", "", +}; + +int +print_insn_rx (bfd_vma addr, disassemble_info * dis) +{ + int rv; + RX_Data rx_data; + RX_Opcode_Decoded opcode; + const char * s; + + rx_data.pc = addr; + rx_data.dis = dis; + + rv = rx_decode_opcode (addr, &opcode, rx_get_byte, &rx_data); + + dis->bytes_per_line = 10; + +#define PR (dis->fprintf_func) +#define PS (dis->stream) +#define PC(c) PR (PS, "%c", c) + + for (s = opcode.syntax; *s; s++) + { + if (*s != '%') + { + PC (*s); + } + else + { + RX_Opcode_Operand * oper; + int do_size = 0; + int do_hex = 0; + int do_addr = 0; + + s ++; + + if (*s == 'S') + { + do_size = 1; + s++; + } + if (*s == 'x') + { + do_hex = 1; + s++; + } + if (*s == 'a') + { + do_addr = 1; + s++; + } + + switch (*s) + { + case '%': + PC ('%'); + break; + + case 's': + PR (PS, "%s", opsize_names[opcode.size]); + break; + + case '0': + case '1': + case '2': + oper = opcode.op + *s - '0'; + if (do_size) + { + if (oper->type == RX_Operand_Indirect) + PR (PS, "%s", size_names[oper->size]); + } + else + switch (oper->type) + { + case RX_Operand_Immediate: + if (do_addr) + dis->print_address_func (oper->addend, dis); + else if (do_hex + || oper->addend > 999 + || oper->addend < -999) + PR (PS, "%#x", oper->addend); + else + PR (PS, "%d", oper->addend); + break; + case RX_Operand_Register: + PR (PS, "%s", register_names[oper->reg]); + break; + case RX_Operand_Indirect: + if (oper->addend) + PR (PS, "%d[%s]", oper->addend, register_names[oper->reg]); + else + PR (PS, "[%s]", register_names[oper->reg]); + break; + case RX_Operand_Postinc: + PR (PS, "[%s+]", register_names[oper->reg]); + break; + case RX_Operand_Predec: + PR (PS, "[-%s]", register_names[oper->reg]); + break; + case RX_Operand_Condition: + PR (PS, "%s", condition_names[oper->reg]); + break; + case RX_Operand_Flag: + PR (PS, "%s", flag_names[oper->reg]); + break; + default: + PR (PS, "[???]"); + break; + } + } + } + } + + return rv; +} -- cgit v1.1