Add support for RISC-V architecture.
bfd * Makefile.am: Add entries for riscv32-elf and riscv64-elf. * config.bdf: Likewise. * configure.ac: Likewise. * Makefile.in: Regenerate. * configure: Regenerate. * archures.c: Add bfd_riscv_arch. * reloc.c: Add riscv relocs. * targets.c: Add riscv_elf32_vec and riscv_elf64_vec. * bfd-in2.h: Regenerate. * libbfd.h: Regenerate. * elf-bfd.h: Add RISCV_ELF_DATA to enum elf_target_id. * elfnn-riscv.c: New file. * elfxx-riscv.c: New file. * elfxx-riscv.h: New file. binutils* readelf.c (guess_is_rela): Add EM_RISCV. (get_machine_name): Likewise. (dump_relocations): Add support for riscv relocations. (get_machine_flags): Add support for riscv flags. (is_32bit_abs_reloc): Add R_RISCV_32. (is_64bit_abs_reloc): Add R_RISCV_64. (is_none_reloc): Add R_RISCV_NONE. * testsuite/binutils-all/objdump.exp (cpus_expected): Add riscv. Expect the debug_ranges test to fail. gas * Makefile.am: Add riscv files. * Makefile.in: Regenerate. * NEWS: Mention the support for this architecture. * configure.in: Define a default architecture. * configure: Regenerate. * configure.tgt: Add entries for riscv. * doc/as.texinfo: Likewise. * testsuite/gas/all/gas.exp: Expect the redef tests to fail. * testsuite/gas/elf/elf.exp: Expect the groupauto tests to fail. * config/tc-riscv.c: New file. * config/tc-riscv.h: New file. * doc/c-riscv.texi: New file. * testsuite/gas/riscv: New directory. * testsuite/gas/riscv/riscv.exp: New file. * testsuite/gas/riscv/t_insns.d: New file. * testsuite/gas/riscv/t_insns.s: New file. ld * Makefile.am: Add riscv files. * Makefile.in: Regenerate. * NEWS: Mention the support for this target. * configure.tgt: Add riscv entries. * emulparams/elf32lriscv-defs.sh: New file. * emulparams/elf32lriscv.sh: New file. * emulparams/elf64lriscv-defs.sh: New file. * emulparams/elf64lriscv.sh: New file. * emultempl/riscvelf.em: New file. opcodes * configure.ac: Add entry for bfd_riscv_arch. * configure: Regenerate. * disassemble.c (disassembler): Add support for riscv. (disassembler_usage): Likewise. * riscv-dis.c: New file. * riscv-opc.c: New file. include * dis-asm.h: Add prototypes for print_insn_riscv and print_riscv_disassembler_options. * elf/riscv.h: New file. * opcode/riscv-opc.h: New file. * opcode/riscv.h: New file.
This commit is contained in:
parent
4e56efac8b
commit
e23eba971d
56 changed files with 9982 additions and 20 deletions
|
@ -1,3 +1,22 @@
|
|||
2016-11-01 Palmer Dabbelt <palmer@dabbelt.com>
|
||||
Andrew Waterman <andrew@sifive.com>
|
||||
|
||||
Add support for RISC-V architecture.
|
||||
* Makefile.am: Add entries for riscv32-elf and riscv64-elf.
|
||||
* config.bdf: Likewise.
|
||||
* configure.ac: Likewise.
|
||||
* Makefile.in: Regenerate.
|
||||
* configure: Regenerate.
|
||||
* archures.c: Add bfd_riscv_arch.
|
||||
* reloc.c: Add riscv relocs.
|
||||
* targets.c: Add riscv_elf32_vec and riscv_elf64_vec.
|
||||
* bfd-in2.h: Regenerate.
|
||||
* libbfd.h: Regenerate.
|
||||
* elf-bfd.h: Add RISCV_ELF_DATA to enum elf_target_id.
|
||||
* elfnn-riscv.c: New file.
|
||||
* elfxx-riscv.c: New file.
|
||||
* elfxx-riscv.h: New file.
|
||||
|
||||
2016-10-31 Alan Modra <amodra@gmail.com>
|
||||
|
||||
PR 20748
|
||||
|
|
|
@ -148,6 +148,7 @@ ALL_MACHINES = \
|
|||
cpu-plugin.lo \
|
||||
cpu-powerpc.lo \
|
||||
cpu-rs6000.lo \
|
||||
cpu-riscv.lo \
|
||||
cpu-rl78.lo \
|
||||
cpu-rx.lo \
|
||||
cpu-s390.lo \
|
||||
|
@ -235,6 +236,7 @@ ALL_MACHINES_CFILES = \
|
|||
cpu-plugin.c \
|
||||
cpu-powerpc.c \
|
||||
cpu-rs6000.c \
|
||||
cpu-riscv.c \
|
||||
cpu-rl78.c \
|
||||
cpu-rx.c \
|
||||
cpu-s390.c \
|
||||
|
@ -671,18 +673,21 @@ BFD64_BACKENDS = \
|
|||
elf64-hppa.lo \
|
||||
elf64-ia64.lo \
|
||||
elf64-ia64-vms.lo \
|
||||
elfxx-ia64.lo \
|
||||
elfn32-mips.lo \
|
||||
elf64-mips.lo \
|
||||
elfxx-mips.lo \
|
||||
elf64-mmix.lo \
|
||||
elf64-ppc.lo \
|
||||
elf32-riscv.lo \
|
||||
elf64-riscv.lo \
|
||||
elfxx-riscv.lo \
|
||||
elf64-s390.lo \
|
||||
elf64-sh64.lo \
|
||||
elf64-sparc.lo \
|
||||
elf64-tilegx.lo \
|
||||
elf64-x86-64.lo \
|
||||
elf64.lo \
|
||||
elfn32-mips.lo \
|
||||
elfxx-ia64.lo \
|
||||
elfxx-mips.lo \
|
||||
mach-o-aarch64.lo \
|
||||
mach-o-x86-64.lo \
|
||||
mmo.lo \
|
||||
|
@ -722,6 +727,7 @@ BFD64_BACKENDS_CFILES = \
|
|||
elfxx-aarch64.c \
|
||||
elfxx-ia64.c \
|
||||
elfxx-mips.c \
|
||||
elfxx-riscv.c \
|
||||
mach-o-aarch64.c \
|
||||
mach-o-x86-64.c \
|
||||
mmo.c \
|
||||
|
@ -785,7 +791,9 @@ SOURCE_CFILES = \
|
|||
|
||||
BUILD_CFILES = \
|
||||
elf32-aarch64.c elf64-aarch64.c \
|
||||
elf32-ia64.c elf64-ia64.c peigen.c pepigen.c pex64igen.c
|
||||
elf32-ia64.c elf64-ia64.c \
|
||||
elf32-riscv.c elf64-riscv.c \
|
||||
peigen.c pepigen.c pex64igen.c
|
||||
|
||||
CFILES = $(SOURCE_CFILES) $(BUILD_CFILES)
|
||||
|
||||
|
@ -955,6 +963,18 @@ elf64-ia64.c : elfnn-ia64.c
|
|||
$(SED) -e s/NN/64/g < $(srcdir)/elfnn-ia64.c > elf64-ia64.new
|
||||
mv -f elf64-ia64.new elf64-ia64.c
|
||||
|
||||
elf32-riscv.c : elfnn-riscv.c
|
||||
rm -f elf32-riscv.c
|
||||
echo "#line 1 \"$(srcdir)/elfnn-riscv.c\"" > elf32-riscv.new
|
||||
sed -e s/NN/32/g < $(srcdir)/elfnn-riscv.c >> elf32-riscv.new
|
||||
mv -f elf32-riscv.new elf32-riscv.c
|
||||
|
||||
elf64-riscv.c : elfnn-riscv.c
|
||||
rm -f elf64-riscv.c
|
||||
echo "#line 1 \"$(srcdir)/elfnn-riscv.c\"" > elf64-riscv.new
|
||||
sed -e s/NN/64/g < $(srcdir)/elfnn-riscv.c >> elf64-riscv.new
|
||||
mv -f elf64-riscv.new elf64-riscv.c
|
||||
|
||||
peigen.c : peXXigen.c
|
||||
rm -f peigen.c
|
||||
$(SED) -e s/XX/pe/g < $(srcdir)/peXXigen.c > peigen.new
|
||||
|
|
|
@ -481,6 +481,7 @@ ALL_MACHINES = \
|
|||
cpu-plugin.lo \
|
||||
cpu-powerpc.lo \
|
||||
cpu-rs6000.lo \
|
||||
cpu-riscv.lo \
|
||||
cpu-rl78.lo \
|
||||
cpu-rx.lo \
|
||||
cpu-s390.lo \
|
||||
|
@ -568,6 +569,7 @@ ALL_MACHINES_CFILES = \
|
|||
cpu-plugin.c \
|
||||
cpu-powerpc.c \
|
||||
cpu-rs6000.c \
|
||||
cpu-riscv.c \
|
||||
cpu-rl78.c \
|
||||
cpu-rx.c \
|
||||
cpu-s390.c \
|
||||
|
@ -1006,18 +1008,21 @@ BFD64_BACKENDS = \
|
|||
elf64-hppa.lo \
|
||||
elf64-ia64.lo \
|
||||
elf64-ia64-vms.lo \
|
||||
elfxx-ia64.lo \
|
||||
elfn32-mips.lo \
|
||||
elf64-mips.lo \
|
||||
elfxx-mips.lo \
|
||||
elf64-mmix.lo \
|
||||
elf64-ppc.lo \
|
||||
elf32-riscv.lo \
|
||||
elf64-riscv.lo \
|
||||
elfxx-riscv.lo \
|
||||
elf64-s390.lo \
|
||||
elf64-sh64.lo \
|
||||
elf64-sparc.lo \
|
||||
elf64-tilegx.lo \
|
||||
elf64-x86-64.lo \
|
||||
elf64.lo \
|
||||
elfn32-mips.lo \
|
||||
elfxx-ia64.lo \
|
||||
elfxx-mips.lo \
|
||||
mach-o-aarch64.lo \
|
||||
mach-o-x86-64.lo \
|
||||
mmo.lo \
|
||||
|
@ -1057,6 +1062,7 @@ BFD64_BACKENDS_CFILES = \
|
|||
elfxx-aarch64.c \
|
||||
elfxx-ia64.c \
|
||||
elfxx-mips.c \
|
||||
elfxx-riscv.c \
|
||||
mach-o-aarch64.c \
|
||||
mach-o-x86-64.c \
|
||||
mmo.c \
|
||||
|
@ -1122,7 +1128,9 @@ SOURCE_CFILES = \
|
|||
|
||||
BUILD_CFILES = \
|
||||
elf32-aarch64.c elf64-aarch64.c \
|
||||
elf32-ia64.c elf64-ia64.c peigen.c pepigen.c pex64igen.c
|
||||
elf32-ia64.c elf64-ia64.c \
|
||||
elf32-riscv.c elf64-riscv.c \
|
||||
peigen.c pepigen.c pex64igen.c
|
||||
|
||||
CFILES = $(SOURCE_CFILES) $(BUILD_CFILES)
|
||||
SOURCE_HFILES = \
|
||||
|
@ -1412,6 +1420,7 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-pj.Plo@am__quote@
|
||||
@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-riscv.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-rl78.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@
|
||||
|
@ -1501,6 +1510,7 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-or1k.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-riscv.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-rl78.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@
|
||||
|
@ -1532,6 +1542,7 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-mips.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-mmix.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-ppc.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-riscv.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-s390.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-sh64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-sparc.Plo@am__quote@
|
||||
|
@ -1543,6 +1554,7 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfxx-aarch64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfxx-ia64.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfxx-mips.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfxx-riscv.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfxx-sparc.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfxx-tilegx.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epoc-pe-arm.Plo@am__quote@
|
||||
|
@ -2080,6 +2092,18 @@ elf64-ia64.c : elfnn-ia64.c
|
|||
$(SED) -e s/NN/64/g < $(srcdir)/elfnn-ia64.c > elf64-ia64.new
|
||||
mv -f elf64-ia64.new elf64-ia64.c
|
||||
|
||||
elf32-riscv.c : elfnn-riscv.c
|
||||
rm -f elf32-riscv.c
|
||||
echo "#line 1 \"$(srcdir)/elfnn-riscv.c\"" > elf32-riscv.new
|
||||
sed -e s/NN/32/g < $(srcdir)/elfnn-riscv.c >> elf32-riscv.new
|
||||
mv -f elf32-riscv.new elf32-riscv.c
|
||||
|
||||
elf64-riscv.c : elfnn-riscv.c
|
||||
rm -f elf64-riscv.c
|
||||
echo "#line 1 \"$(srcdir)/elfnn-riscv.c\"" > elf64-riscv.new
|
||||
sed -e s/NN/64/g < $(srcdir)/elfnn-riscv.c >> elf64-riscv.new
|
||||
mv -f elf64-riscv.new elf64-riscv.c
|
||||
|
||||
peigen.c : peXXigen.c
|
||||
rm -f peigen.c
|
||||
$(SED) -e s/XX/pe/g < $(srcdir)/peXXigen.c > peigen.new
|
||||
|
|
|
@ -457,6 +457,9 @@ DESCRIPTION
|
|||
.#define bfd_mach_cris_v0_v10 255
|
||||
.#define bfd_mach_cris_v32 32
|
||||
.#define bfd_mach_cris_v10_v32 1032
|
||||
. bfd_arch_riscv,
|
||||
.#define bfd_mach_riscv32 132
|
||||
.#define bfd_mach_riscv64 164
|
||||
. bfd_arch_rl78,
|
||||
.#define bfd_mach_rl78 0x75
|
||||
. bfd_arch_rx, {* Renesas RX. *}
|
||||
|
@ -628,6 +631,7 @@ extern const bfd_arch_info_type bfd_pj_arch;
|
|||
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_riscv_arch;
|
||||
extern const bfd_arch_info_type bfd_rs6000_arch;
|
||||
extern const bfd_arch_info_type bfd_rl78_arch;
|
||||
extern const bfd_arch_info_type bfd_rx_arch;
|
||||
|
@ -717,8 +721,9 @@ static const bfd_arch_info_type * const bfd_archures_list[] =
|
|||
&bfd_or1k_arch,
|
||||
&bfd_pdp11_arch,
|
||||
&bfd_powerpc_arch,
|
||||
&bfd_rs6000_arch,
|
||||
&bfd_riscv_arch,
|
||||
&bfd_rl78_arch,
|
||||
&bfd_rs6000_arch,
|
||||
&bfd_rx_arch,
|
||||
&bfd_s390_arch,
|
||||
&bfd_score_arch,
|
||||
|
|
|
@ -2295,6 +2295,9 @@ 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_riscv,
|
||||
#define bfd_mach_riscv32 132
|
||||
#define bfd_mach_riscv64 164
|
||||
bfd_arch_rl78,
|
||||
#define bfd_mach_rl78 0x75
|
||||
bfd_arch_rx, /* Renesas RX. */
|
||||
|
@ -4691,6 +4694,46 @@ number for the IN and OUT instructions */
|
|||
number for the SBIC, SBIS, SBI and CBI instructions */
|
||||
BFD_RELOC_AVR_PORT5,
|
||||
|
||||
/* RISC-V relocations. */
|
||||
BFD_RELOC_RISCV_HI20,
|
||||
BFD_RELOC_RISCV_PCREL_HI20,
|
||||
BFD_RELOC_RISCV_PCREL_LO12_I,
|
||||
BFD_RELOC_RISCV_PCREL_LO12_S,
|
||||
BFD_RELOC_RISCV_LO12_I,
|
||||
BFD_RELOC_RISCV_LO12_S,
|
||||
BFD_RELOC_RISCV_GPREL12_I,
|
||||
BFD_RELOC_RISCV_GPREL12_S,
|
||||
BFD_RELOC_RISCV_TPREL_HI20,
|
||||
BFD_RELOC_RISCV_TPREL_LO12_I,
|
||||
BFD_RELOC_RISCV_TPREL_LO12_S,
|
||||
BFD_RELOC_RISCV_TPREL_ADD,
|
||||
BFD_RELOC_RISCV_CALL,
|
||||
BFD_RELOC_RISCV_CALL_PLT,
|
||||
BFD_RELOC_RISCV_ADD8,
|
||||
BFD_RELOC_RISCV_ADD16,
|
||||
BFD_RELOC_RISCV_ADD32,
|
||||
BFD_RELOC_RISCV_ADD64,
|
||||
BFD_RELOC_RISCV_SUB8,
|
||||
BFD_RELOC_RISCV_SUB16,
|
||||
BFD_RELOC_RISCV_SUB32,
|
||||
BFD_RELOC_RISCV_SUB64,
|
||||
BFD_RELOC_RISCV_GOT_HI20,
|
||||
BFD_RELOC_RISCV_TLS_GOT_HI20,
|
||||
BFD_RELOC_RISCV_TLS_GD_HI20,
|
||||
BFD_RELOC_RISCV_JMP,
|
||||
BFD_RELOC_RISCV_TLS_DTPMOD32,
|
||||
BFD_RELOC_RISCV_TLS_DTPREL32,
|
||||
BFD_RELOC_RISCV_TLS_DTPMOD64,
|
||||
BFD_RELOC_RISCV_TLS_DTPREL64,
|
||||
BFD_RELOC_RISCV_TLS_TPREL32,
|
||||
BFD_RELOC_RISCV_TLS_TPREL64,
|
||||
BFD_RELOC_RISCV_ALIGN,
|
||||
BFD_RELOC_RISCV_RVC_BRANCH,
|
||||
BFD_RELOC_RISCV_RVC_JUMP,
|
||||
BFD_RELOC_RISCV_RVC_LUI,
|
||||
BFD_RELOC_RISCV_GPREL_I,
|
||||
BFD_RELOC_RISCV_GPREL_S,
|
||||
|
||||
/* Renesas RL78 Relocations. */
|
||||
BFD_RELOC_RL78_NEG8,
|
||||
BFD_RELOC_RL78_NEG16,
|
||||
|
|
|
@ -122,6 +122,7 @@ or1k*|or1knd*) targ_archs=bfd_or1k_arch ;;
|
|||
pdp11*) targ_archs=bfd_pdp11_arch ;;
|
||||
pj*) targ_archs="bfd_pj_arch bfd_i386_arch";;
|
||||
powerpc*) targ_archs="bfd_rs6000_arch bfd_powerpc_arch" ;;
|
||||
riscv*) targ_archs=bfd_riscv_arch ;;
|
||||
rs6000) targ_archs="bfd_rs6000_arch bfd_powerpc_arch" ;;
|
||||
s390*) targ_archs=bfd_s390_arch ;;
|
||||
sh*) targ_archs=bfd_sh_arch ;;
|
||||
|
@ -1359,6 +1360,20 @@ case "${targ}" in
|
|||
targ_selvecs="powerpc_pei_le_vec powerpc_pei_vec powerpc_pe_le_vec powerpc_pe_vec"
|
||||
;;
|
||||
|
||||
#ifdef BFD64
|
||||
riscv32-*-*)
|
||||
targ_defvec=riscv_elf32_vec
|
||||
targ_selvecs="riscv_elf32_vec"
|
||||
want64=true
|
||||
;;
|
||||
|
||||
riscv64-*-*)
|
||||
targ_defvec=riscv_elf64_vec
|
||||
targ_selvecs="riscv_elf32_vec riscv_elf64_vec"
|
||||
want64=true
|
||||
;;
|
||||
#endif
|
||||
|
||||
rl78-*-elf)
|
||||
targ_defvec=rl78_elf32_vec
|
||||
;;
|
||||
|
|
2
bfd/configure
vendored
2
bfd/configure
vendored
|
@ -14475,6 +14475,8 @@ do
|
|||
powerpc_pei_vec) tb="$tb pei-ppc.lo peigen.lo $coff" ;;
|
||||
powerpc_pei_le_vec) tb="$tb pei-ppc.lo peigen.lo $coff" ;;
|
||||
powerpc_xcoff_vec) tb="$tb coff-rs6000.lo $xcoff" ;;
|
||||
riscv_elf32_vec) tb="$tb elf32-riscv.lo elfxx-riscv.lo elf32.lo $elf" ;;
|
||||
riscv_elf64_vec) tb="$tb elf64-riscv.lo elf64.lo elfxx-riscv.lo elf32.lo $elf"; target_size=64 ;;
|
||||
rl78_elf32_vec) tb="$tb elf32-rl78.lo elf32.lo $elf" ;;
|
||||
rs6000_xcoff64_vec) tb="$tb coff64-rs6000.lo aix5ppc-core.lo $xcoff"; target_size=64 ;;
|
||||
rs6000_xcoff64_aix_vec) tb="$tb coff64-rs6000.lo aix5ppc-core.lo $xcoff"; target_size=64 ;;
|
||||
|
|
|
@ -606,6 +606,8 @@ do
|
|||
powerpc_pei_vec) tb="$tb pei-ppc.lo peigen.lo $coff" ;;
|
||||
powerpc_pei_le_vec) tb="$tb pei-ppc.lo peigen.lo $coff" ;;
|
||||
powerpc_xcoff_vec) tb="$tb coff-rs6000.lo $xcoff" ;;
|
||||
riscv_elf32_vec) tb="$tb elf32-riscv.lo elfxx-riscv.lo elf32.lo $elf" ;;
|
||||
riscv_elf64_vec) tb="$tb elf64-riscv.lo elf64.lo elfxx-riscv.lo elf32.lo $elf"; target_size=64 ;;
|
||||
rl78_elf32_vec) tb="$tb elf32-rl78.lo elf32.lo $elf" ;;
|
||||
rs6000_xcoff64_vec) tb="$tb coff64-rs6000.lo aix5ppc-core.lo $xcoff"; target_size=64 ;;
|
||||
rs6000_xcoff64_aix_vec) tb="$tb coff64-rs6000.lo aix5ppc-core.lo $xcoff"; target_size=64 ;;
|
||||
|
|
79
bfd/cpu-riscv.c
Normal file
79
bfd/cpu-riscv.c
Normal file
|
@ -0,0 +1,79 @@
|
|||
/* BFD backend for RISC-V
|
||||
Copyright 2011-2016 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Andrew Waterman (andrew@sifive.com).
|
||||
Based on MIPS target.
|
||||
|
||||
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; see the file COPYING3. If not,
|
||||
see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "bfd.h"
|
||||
#include "libbfd.h"
|
||||
|
||||
/* This routine is provided two arch_infos and returns an arch_info
|
||||
that is compatible with both, or NULL if none exists. */
|
||||
|
||||
static const bfd_arch_info_type *
|
||||
riscv_compatible (const bfd_arch_info_type *a, const bfd_arch_info_type *b)
|
||||
{
|
||||
if (a->arch != b->arch)
|
||||
return NULL;
|
||||
|
||||
/* Machine compatibility is checked in
|
||||
_bfd_riscv_elf_merge_private_bfd_data. */
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
#define N(BITS_WORD, BITS_ADDR, NUMBER, PRINT, DEFAULT, NEXT) \
|
||||
{ \
|
||||
BITS_WORD, /* bits in a word */ \
|
||||
BITS_ADDR, /* bits in an address */ \
|
||||
8, /* 8 bits in a byte */ \
|
||||
bfd_arch_riscv, \
|
||||
NUMBER, \
|
||||
"riscv", \
|
||||
PRINT, \
|
||||
3, \
|
||||
DEFAULT, \
|
||||
riscv_compatible, \
|
||||
bfd_default_scan, \
|
||||
bfd_arch_default_fill, \
|
||||
NEXT, \
|
||||
}
|
||||
|
||||
/* This enum must be kept in the same order as arch_info_struct. */
|
||||
enum
|
||||
{
|
||||
I_riscv64,
|
||||
I_riscv32
|
||||
};
|
||||
|
||||
#define NN(index) (&arch_info_struct[(index) + 1])
|
||||
|
||||
/* This array must be kept in the same order as the anonymous enum above,
|
||||
and each entry except the last should end with NN (my enum value). */
|
||||
static const bfd_arch_info_type arch_info_struct[] =
|
||||
{
|
||||
N (64, 64, bfd_mach_riscv64, "riscv:rv64", FALSE, NN (I_riscv64)),
|
||||
N (32, 32, bfd_mach_riscv32, "riscv:rv32", FALSE, 0)
|
||||
};
|
||||
|
||||
/* The default architecture is riscv:rv64. */
|
||||
|
||||
const bfd_arch_info_type bfd_riscv_arch =
|
||||
N (64, 64, 0, "riscv", TRUE, &arch_info_struct[0]);
|
|
@ -477,6 +477,7 @@ enum elf_target_id
|
|||
XGATE_ELF_DATA,
|
||||
TILEGX_ELF_DATA,
|
||||
TILEPRO_ELF_DATA,
|
||||
RISCV_ELF_DATA,
|
||||
GENERIC_ELF_DATA
|
||||
};
|
||||
|
||||
|
|
3160
bfd/elfnn-riscv.c
Normal file
3160
bfd/elfnn-riscv.c
Normal file
File diff suppressed because it is too large
Load diff
815
bfd/elfxx-riscv.c
Normal file
815
bfd/elfxx-riscv.c
Normal file
|
@ -0,0 +1,815 @@
|
|||
/* RISC-V-specific support for ELF.
|
||||
Copyright 2011-2016 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Andrew Waterman (andrew@sifive.com).
|
||||
Based on TILE-Gx and MIPS targets.
|
||||
|
||||
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; see the file COPYING3. If not,
|
||||
see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "bfd.h"
|
||||
#include "libbfd.h"
|
||||
#include "elf-bfd.h"
|
||||
#include "elf/riscv.h"
|
||||
#include "opcode/riscv.h"
|
||||
#include "libiberty.h"
|
||||
#include "elfxx-riscv.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#define MINUS_ONE ((bfd_vma)0 - 1)
|
||||
|
||||
/* The relocation table used for SHT_RELA sections. */
|
||||
|
||||
static reloc_howto_type howto_table[] =
|
||||
{
|
||||
/* No relocation. */
|
||||
HOWTO (R_RISCV_NONE, /* type */
|
||||
0, /* rightshift */
|
||||
3, /* size */
|
||||
0, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_NONE", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
0, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* 32 bit relocation. */
|
||||
HOWTO (R_RISCV_32, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_32", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
0xffffffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* 64 bit relocation. */
|
||||
HOWTO (R_RISCV_64, /* type */
|
||||
0, /* rightshift */
|
||||
4, /* size */
|
||||
64, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_64", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* Relocation against a local symbol in a shared object. */
|
||||
HOWTO (R_RISCV_RELATIVE, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_RELATIVE", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
0xffffffff, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
HOWTO (R_RISCV_COPY, /* type */
|
||||
0, /* rightshift */
|
||||
0, /* this one is variable size */
|
||||
0, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_bitfield, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_COPY", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0, /* src_mask */
|
||||
0x0, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
HOWTO (R_RISCV_JUMP_SLOT, /* type */
|
||||
0, /* rightshift */
|
||||
4, /* size */
|
||||
64, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_bitfield, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_JUMP_SLOT", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0x0, /* src_mask */
|
||||
0x0, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* Dynamic TLS relocations. */
|
||||
HOWTO (R_RISCV_TLS_DTPMOD32, /* type */
|
||||
0, /* rightshift */
|
||||
4, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_TLS_DTPMOD32", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
MINUS_ONE, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
HOWTO (R_RISCV_TLS_DTPMOD64, /* type */
|
||||
0, /* rightshift */
|
||||
4, /* size */
|
||||
64, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_TLS_DTPMOD64", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
MINUS_ONE, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
HOWTO (R_RISCV_TLS_DTPREL32, /* type */
|
||||
0, /* rightshift */
|
||||
4, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_TLS_DTPREL32", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
MINUS_ONE, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
HOWTO (R_RISCV_TLS_DTPREL64, /* type */
|
||||
0, /* rightshift */
|
||||
4, /* size */
|
||||
64, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_TLS_DTPREL64", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
MINUS_ONE, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
HOWTO (R_RISCV_TLS_TPREL32, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_TLS_TPREL32", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
MINUS_ONE, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
HOWTO (R_RISCV_TLS_TPREL64, /* type */
|
||||
0, /* rightshift */
|
||||
4, /* size */
|
||||
64, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_TLS_TPREL64", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
MINUS_ONE, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* Reserved for future relocs that the dynamic linker must understand. */
|
||||
EMPTY_HOWTO (12),
|
||||
EMPTY_HOWTO (13),
|
||||
EMPTY_HOWTO (14),
|
||||
EMPTY_HOWTO (15),
|
||||
|
||||
/* 12-bit PC-relative branch offset. */
|
||||
HOWTO (R_RISCV_BRANCH, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
TRUE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_signed, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_BRANCH", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_SBTYPE_IMM (-1U), /* dst_mask */
|
||||
TRUE), /* pcrel_offset */
|
||||
|
||||
/* 20-bit PC-relative jump offset. */
|
||||
HOWTO (R_RISCV_JAL, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
TRUE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
/* This needs complex overflow
|
||||
detection, because the upper 36
|
||||
bits must match the PC + 4. */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_JAL", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_UJTYPE_IMM (-1U), /* dst_mask */
|
||||
TRUE), /* pcrel_offset */
|
||||
|
||||
/* 32-bit PC-relative function call (AUIPC/JALR). */
|
||||
HOWTO (R_RISCV_CALL, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
64, /* bitsize */
|
||||
TRUE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_CALL", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_UTYPE_IMM (-1U) | ((bfd_vma) ENCODE_ITYPE_IMM (-1U) << 32),
|
||||
/* dst_mask */
|
||||
TRUE), /* pcrel_offset */
|
||||
|
||||
/* 32-bit PC-relative function call (AUIPC/JALR). */
|
||||
HOWTO (R_RISCV_CALL_PLT, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
64, /* bitsize */
|
||||
TRUE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_CALL_PLT", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_UTYPE_IMM (-1U) | ((bfd_vma) ENCODE_ITYPE_IMM (-1U) << 32),
|
||||
/* dst_mask */
|
||||
TRUE), /* pcrel_offset */
|
||||
|
||||
/* High 20 bits of 32-bit PC-relative GOT access. */
|
||||
HOWTO (R_RISCV_GOT_HI20, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
TRUE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_GOT_HI20", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_UTYPE_IMM (-1U), /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* High 20 bits of 32-bit PC-relative TLS IE GOT access. */
|
||||
HOWTO (R_RISCV_TLS_GOT_HI20, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
TRUE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_TLS_GOT_HI20", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_UTYPE_IMM (-1U), /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* High 20 bits of 32-bit PC-relative TLS GD GOT reference. */
|
||||
HOWTO (R_RISCV_TLS_GD_HI20, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
TRUE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_TLS_GD_HI20", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_UTYPE_IMM (-1U), /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* High 20 bits of 32-bit PC-relative reference. */
|
||||
HOWTO (R_RISCV_PCREL_HI20, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
TRUE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_PCREL_HI20", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_UTYPE_IMM (-1U), /* dst_mask */
|
||||
TRUE), /* pcrel_offset */
|
||||
|
||||
/* Low 12 bits of a 32-bit PC-relative load or add. */
|
||||
HOWTO (R_RISCV_PCREL_LO12_I, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_PCREL_LO12_I", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_ITYPE_IMM (-1U), /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* Low 12 bits of a 32-bit PC-relative store. */
|
||||
HOWTO (R_RISCV_PCREL_LO12_S, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_PCREL_LO12_S", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_STYPE_IMM (-1U), /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* High 20 bits of 32-bit absolute address. */
|
||||
HOWTO (R_RISCV_HI20, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_HI20", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_UTYPE_IMM (-1U), /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* High 12 bits of 32-bit load or add. */
|
||||
HOWTO (R_RISCV_LO12_I, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_LO12_I", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_ITYPE_IMM (-1U), /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* High 12 bits of 32-bit store. */
|
||||
HOWTO (R_RISCV_LO12_S, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_LO12_S", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_STYPE_IMM (-1U), /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* High 20 bits of TLS LE thread pointer offset. */
|
||||
HOWTO (R_RISCV_TPREL_HI20, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_signed, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_TPREL_HI20", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_UTYPE_IMM (-1U), /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* Low 12 bits of TLS LE thread pointer offset for loads and adds. */
|
||||
HOWTO (R_RISCV_TPREL_LO12_I, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_signed, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_TPREL_LO12_I", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_ITYPE_IMM (-1U), /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* Low 12 bits of TLS LE thread pointer offset for stores. */
|
||||
HOWTO (R_RISCV_TPREL_LO12_S, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_signed, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_TPREL_LO12_S", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_STYPE_IMM (-1U), /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* TLS LE thread pointer usage. */
|
||||
HOWTO (R_RISCV_TPREL_ADD, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_TPREL_ADD", /* name */
|
||||
TRUE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
0, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* 8-bit in-place addition, for local label subtraction. */
|
||||
HOWTO (R_RISCV_ADD8, /* type */
|
||||
0, /* rightshift */
|
||||
0, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_ADD8", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* 16-bit in-place addition, for local label subtraction. */
|
||||
HOWTO (R_RISCV_ADD16, /* type */
|
||||
0, /* rightshift */
|
||||
1, /* size */
|
||||
16, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_ADD16", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* 32-bit in-place addition, for local label subtraction. */
|
||||
HOWTO (R_RISCV_ADD32, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_ADD32", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* 64-bit in-place addition, for local label subtraction. */
|
||||
HOWTO (R_RISCV_ADD64, /* type */
|
||||
0, /* rightshift */
|
||||
4, /* size */
|
||||
64, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_ADD64", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* 8-bit in-place addition, for local label subtraction. */
|
||||
HOWTO (R_RISCV_SUB8, /* type */
|
||||
0, /* rightshift */
|
||||
0, /* size */
|
||||
8, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_SUB8", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* 16-bit in-place addition, for local label subtraction. */
|
||||
HOWTO (R_RISCV_SUB16, /* type */
|
||||
0, /* rightshift */
|
||||
1, /* size */
|
||||
16, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_SUB16", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* 32-bit in-place addition, for local label subtraction. */
|
||||
HOWTO (R_RISCV_SUB32, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_SUB32", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* 64-bit in-place addition, for local label subtraction. */
|
||||
HOWTO (R_RISCV_SUB64, /* type */
|
||||
0, /* rightshift */
|
||||
4, /* size */
|
||||
64, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_SUB64", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
MINUS_ONE, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* GNU extension to record C++ vtable hierarchy */
|
||||
HOWTO (R_RISCV_GNU_VTINHERIT, /* type */
|
||||
0, /* rightshift */
|
||||
4, /* size */
|
||||
0, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
NULL, /* special_function */
|
||||
"R_RISCV_GNU_VTINHERIT", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
0, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* GNU extension to record C++ vtable member usage */
|
||||
HOWTO (R_RISCV_GNU_VTENTRY, /* type */
|
||||
0, /* rightshift */
|
||||
4, /* size */
|
||||
0, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
_bfd_elf_rel_vtable_reloc_fn, /* special_function */
|
||||
"R_RISCV_GNU_VTENTRY", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
0, /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* Indicates an alignment statement. The addend field encodes how many
|
||||
bytes of NOPs follow the statement. The desired alignment is the
|
||||
addend rounded up to the next power of two. */
|
||||
HOWTO (R_RISCV_ALIGN, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
0, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_ALIGN", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
0, /* dst_mask */
|
||||
TRUE), /* pcrel_offset */
|
||||
|
||||
/* 8-bit PC-relative branch offset. */
|
||||
HOWTO (R_RISCV_RVC_BRANCH, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
TRUE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_signed, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_RVC_BRANCH", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_RVC_B_IMM (-1U), /* dst_mask */
|
||||
TRUE), /* pcrel_offset */
|
||||
|
||||
/* 11-bit PC-relative jump offset. */
|
||||
HOWTO (R_RISCV_RVC_JUMP, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
TRUE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
/* This needs complex overflow
|
||||
detection, because the upper 36
|
||||
bits must match the PC + 4. */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_RVC_JUMP", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_RVC_J_IMM (-1U), /* dst_mask */
|
||||
TRUE), /* pcrel_offset */
|
||||
|
||||
/* High 6 bits of 18-bit absolute address. */
|
||||
HOWTO (R_RISCV_RVC_LUI, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_RVC_LUI", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_RVC_IMM (-1U), /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* High 12 bits of 32-bit load or add. */
|
||||
HOWTO (R_RISCV_GPREL_I, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_GPREL_I", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_ITYPE_IMM (-1U), /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
|
||||
/* High 12 bits of 32-bit store. */
|
||||
HOWTO (R_RISCV_GPREL_S, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size */
|
||||
32, /* bitsize */
|
||||
FALSE, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_dont, /* complain_on_overflow */
|
||||
bfd_elf_generic_reloc, /* special_function */
|
||||
"R_RISCV_GPREL_S", /* name */
|
||||
FALSE, /* partial_inplace */
|
||||
0, /* src_mask */
|
||||
ENCODE_STYPE_IMM (-1U), /* dst_mask */
|
||||
FALSE), /* pcrel_offset */
|
||||
};
|
||||
|
||||
/* A mapping from BFD reloc types to RISC-V ELF reloc types. */
|
||||
|
||||
struct elf_reloc_map
|
||||
{
|
||||
bfd_reloc_code_real_type bfd_val;
|
||||
enum elf_riscv_reloc_type elf_val;
|
||||
};
|
||||
|
||||
static const struct elf_reloc_map riscv_reloc_map[] =
|
||||
{
|
||||
{ BFD_RELOC_NONE, R_RISCV_NONE },
|
||||
{ BFD_RELOC_32, R_RISCV_32 },
|
||||
{ BFD_RELOC_64, R_RISCV_64 },
|
||||
{ BFD_RELOC_RISCV_ADD8, R_RISCV_ADD8 },
|
||||
{ BFD_RELOC_RISCV_ADD16, R_RISCV_ADD16 },
|
||||
{ BFD_RELOC_RISCV_ADD32, R_RISCV_ADD32 },
|
||||
{ BFD_RELOC_RISCV_ADD64, R_RISCV_ADD64 },
|
||||
{ BFD_RELOC_RISCV_SUB8, R_RISCV_SUB8 },
|
||||
{ BFD_RELOC_RISCV_SUB16, R_RISCV_SUB16 },
|
||||
{ BFD_RELOC_RISCV_SUB32, R_RISCV_SUB32 },
|
||||
{ BFD_RELOC_RISCV_SUB64, R_RISCV_SUB64 },
|
||||
{ BFD_RELOC_CTOR, R_RISCV_64 },
|
||||
{ BFD_RELOC_12_PCREL, R_RISCV_BRANCH },
|
||||
{ BFD_RELOC_RISCV_HI20, R_RISCV_HI20 },
|
||||
{ BFD_RELOC_RISCV_LO12_I, R_RISCV_LO12_I },
|
||||
{ BFD_RELOC_RISCV_LO12_S, R_RISCV_LO12_S },
|
||||
{ BFD_RELOC_RISCV_PCREL_LO12_I, R_RISCV_PCREL_LO12_I },
|
||||
{ BFD_RELOC_RISCV_PCREL_LO12_S, R_RISCV_PCREL_LO12_S },
|
||||
{ BFD_RELOC_RISCV_CALL, R_RISCV_CALL },
|
||||
{ BFD_RELOC_RISCV_CALL_PLT, R_RISCV_CALL_PLT },
|
||||
{ BFD_RELOC_RISCV_PCREL_HI20, R_RISCV_PCREL_HI20 },
|
||||
{ BFD_RELOC_RISCV_JMP, R_RISCV_JAL },
|
||||
{ BFD_RELOC_RISCV_GOT_HI20, R_RISCV_GOT_HI20 },
|
||||
{ BFD_RELOC_RISCV_TLS_DTPMOD32, R_RISCV_TLS_DTPMOD32 },
|
||||
{ BFD_RELOC_RISCV_TLS_DTPREL32, R_RISCV_TLS_DTPREL32 },
|
||||
{ BFD_RELOC_RISCV_TLS_DTPMOD64, R_RISCV_TLS_DTPMOD64 },
|
||||
{ BFD_RELOC_RISCV_TLS_DTPREL64, R_RISCV_TLS_DTPREL64 },
|
||||
{ BFD_RELOC_RISCV_TLS_TPREL32, R_RISCV_TLS_TPREL32 },
|
||||
{ BFD_RELOC_RISCV_TLS_TPREL64, R_RISCV_TLS_TPREL64 },
|
||||
{ BFD_RELOC_RISCV_TPREL_HI20, R_RISCV_TPREL_HI20 },
|
||||
{ BFD_RELOC_RISCV_TPREL_ADD, R_RISCV_TPREL_ADD },
|
||||
{ BFD_RELOC_RISCV_TPREL_LO12_S, R_RISCV_TPREL_LO12_S },
|
||||
{ BFD_RELOC_RISCV_TPREL_LO12_I, R_RISCV_TPREL_LO12_I },
|
||||
{ BFD_RELOC_RISCV_TLS_GOT_HI20, R_RISCV_TLS_GOT_HI20 },
|
||||
{ BFD_RELOC_RISCV_TLS_GD_HI20, R_RISCV_TLS_GD_HI20 },
|
||||
{ BFD_RELOC_RISCV_ALIGN, R_RISCV_ALIGN },
|
||||
{ BFD_RELOC_RISCV_RVC_BRANCH, R_RISCV_RVC_BRANCH },
|
||||
{ BFD_RELOC_RISCV_RVC_JUMP, R_RISCV_RVC_JUMP },
|
||||
{ BFD_RELOC_RISCV_RVC_LUI, R_RISCV_RVC_LUI },
|
||||
{ BFD_RELOC_RISCV_GPREL_I, R_RISCV_GPREL_I },
|
||||
{ BFD_RELOC_RISCV_GPREL_S, R_RISCV_GPREL_S },
|
||||
};
|
||||
|
||||
/* Given a BFD reloc type, return a howto structure. */
|
||||
|
||||
reloc_howto_type *
|
||||
riscv_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
||||
bfd_reloc_code_real_type code)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE (riscv_reloc_map); i++)
|
||||
if (riscv_reloc_map[i].bfd_val == code)
|
||||
return &howto_table[(int) riscv_reloc_map[i].elf_val];
|
||||
|
||||
bfd_set_error (bfd_error_bad_value);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
reloc_howto_type *
|
||||
riscv_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE (howto_table); i++)
|
||||
if (howto_table[i].name && strcasecmp (howto_table[i].name, r_name) == 0)
|
||||
return &howto_table[i];
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
reloc_howto_type *
|
||||
riscv_elf_rtype_to_howto (unsigned int r_type)
|
||||
{
|
||||
if (r_type >= ARRAY_SIZE (howto_table))
|
||||
{
|
||||
(*_bfd_error_handler) (_("unrecognized relocation (0x%x)"), r_type);
|
||||
bfd_set_error (bfd_error_bad_value);
|
||||
return NULL;
|
||||
}
|
||||
return &howto_table[r_type];
|
||||
}
|
33
bfd/elfxx-riscv.h
Normal file
33
bfd/elfxx-riscv.h
Normal file
|
@ -0,0 +1,33 @@
|
|||
/* RISC-V ELF specific backend routines.
|
||||
Copyright 2011-2016 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Andrew Waterman (andrew@sifive.com).
|
||||
Based on MIPS target.
|
||||
|
||||
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; see the file COPYING3. If not,
|
||||
see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "elf/common.h"
|
||||
#include "elf/internal.h"
|
||||
|
||||
extern reloc_howto_type *
|
||||
riscv_reloc_name_lookup (bfd *, const char *);
|
||||
|
||||
extern reloc_howto_type *
|
||||
riscv_reloc_type_lookup (bfd *, bfd_reloc_code_real_type);
|
||||
|
||||
extern reloc_howto_type *
|
||||
riscv_elf_rtype_to_howto (unsigned int r_type);
|
38
bfd/libbfd.h
38
bfd/libbfd.h
|
@ -2166,6 +2166,44 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
|
|||
"BFD_RELOC_AVR_LDS_STS_16",
|
||||
"BFD_RELOC_AVR_PORT6",
|
||||
"BFD_RELOC_AVR_PORT5",
|
||||
"BFD_RELOC_RISCV_HI20",
|
||||
"BFD_RELOC_RISCV_PCREL_HI20",
|
||||
"BFD_RELOC_RISCV_PCREL_LO12_I",
|
||||
"BFD_RELOC_RISCV_PCREL_LO12_S",
|
||||
"BFD_RELOC_RISCV_LO12_I",
|
||||
"BFD_RELOC_RISCV_LO12_S",
|
||||
"BFD_RELOC_RISCV_GPREL12_I",
|
||||
"BFD_RELOC_RISCV_GPREL12_S",
|
||||
"BFD_RELOC_RISCV_TPREL_HI20",
|
||||
"BFD_RELOC_RISCV_TPREL_LO12_I",
|
||||
"BFD_RELOC_RISCV_TPREL_LO12_S",
|
||||
"BFD_RELOC_RISCV_TPREL_ADD",
|
||||
"BFD_RELOC_RISCV_CALL",
|
||||
"BFD_RELOC_RISCV_CALL_PLT",
|
||||
"BFD_RELOC_RISCV_ADD8",
|
||||
"BFD_RELOC_RISCV_ADD16",
|
||||
"BFD_RELOC_RISCV_ADD32",
|
||||
"BFD_RELOC_RISCV_ADD64",
|
||||
"BFD_RELOC_RISCV_SUB8",
|
||||
"BFD_RELOC_RISCV_SUB16",
|
||||
"BFD_RELOC_RISCV_SUB32",
|
||||
"BFD_RELOC_RISCV_SUB64",
|
||||
"BFD_RELOC_RISCV_GOT_HI20",
|
||||
"BFD_RELOC_RISCV_TLS_GOT_HI20",
|
||||
"BFD_RELOC_RISCV_TLS_GD_HI20",
|
||||
"BFD_RELOC_RISCV_JMP",
|
||||
"BFD_RELOC_RISCV_TLS_DTPMOD32",
|
||||
"BFD_RELOC_RISCV_TLS_DTPREL32",
|
||||
"BFD_RELOC_RISCV_TLS_DTPMOD64",
|
||||
"BFD_RELOC_RISCV_TLS_DTPREL64",
|
||||
"BFD_RELOC_RISCV_TLS_TPREL32",
|
||||
"BFD_RELOC_RISCV_TLS_TPREL64",
|
||||
"BFD_RELOC_RISCV_ALIGN",
|
||||
"BFD_RELOC_RISCV_RVC_BRANCH",
|
||||
"BFD_RELOC_RISCV_RVC_JUMP",
|
||||
"BFD_RELOC_RISCV_RVC_LUI",
|
||||
"BFD_RELOC_RISCV_GPREL_I",
|
||||
"BFD_RELOC_RISCV_GPREL_S",
|
||||
"BFD_RELOC_RL78_NEG8",
|
||||
"BFD_RELOC_RL78_NEG16",
|
||||
"BFD_RELOC_RL78_NEG24",
|
||||
|
|
80
bfd/reloc.c
80
bfd/reloc.c
|
@ -5047,6 +5047,86 @@ ENUM
|
|||
ENUMDOC
|
||||
This is a 5 bit reloc for the AVR that stores an I/O register
|
||||
number for the SBIC, SBIS, SBI and CBI instructions
|
||||
|
||||
ENUM
|
||||
BFD_RELOC_RISCV_HI20
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_PCREL_HI20
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_PCREL_LO12_I
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_PCREL_LO12_S
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_LO12_I
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_LO12_S
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_GPREL12_I
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_GPREL12_S
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_TPREL_HI20
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_TPREL_LO12_I
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_TPREL_LO12_S
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_TPREL_ADD
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_CALL
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_CALL_PLT
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_ADD8
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_ADD16
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_ADD32
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_ADD64
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_SUB8
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_SUB16
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_SUB32
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_SUB64
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_GOT_HI20
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_TLS_GOT_HI20
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_TLS_GD_HI20
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_JMP
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_TLS_DTPMOD32
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_TLS_DTPREL32
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_TLS_DTPMOD64
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_TLS_DTPREL64
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_TLS_TPREL32
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_TLS_TPREL64
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_ALIGN
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_RVC_BRANCH
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_RVC_JUMP
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_RVC_LUI
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_GPREL_I
|
||||
ENUMX
|
||||
BFD_RELOC_RISCV_GPREL_S
|
||||
ENUMDOC
|
||||
RISC-V relocations.
|
||||
|
||||
ENUM
|
||||
BFD_RELOC_RL78_NEG8
|
||||
ENUMX
|
||||
|
|
|
@ -799,6 +799,8 @@ extern const bfd_target powerpc_pe_le_vec;
|
|||
extern const bfd_target powerpc_pei_vec;
|
||||
extern const bfd_target powerpc_pei_le_vec;
|
||||
extern const bfd_target powerpc_xcoff_vec;
|
||||
extern const bfd_target riscv_elf32_vec;
|
||||
extern const bfd_target riscv_elf64_vec;
|
||||
extern const bfd_target rl78_elf32_vec;
|
||||
extern const bfd_target rs6000_xcoff64_vec;
|
||||
extern const bfd_target rs6000_xcoff64_aix_vec;
|
||||
|
@ -1303,6 +1305,10 @@ static const bfd_target * const _bfd_target_vector[] =
|
|||
&powerpc_xcoff_vec,
|
||||
#endif
|
||||
|
||||
&riscv_elf32_vec,
|
||||
#ifdef BFD64
|
||||
&riscv_elf64_vec,
|
||||
#endif
|
||||
&rl78_elf32_vec,
|
||||
|
||||
#ifdef BFD64
|
||||
|
|
|
@ -1,3 +1,17 @@
|
|||
2016-11-01 Palmer Dabbelt <palmer@dabbelt.com>
|
||||
Andrew Waterman <andrew@sifive.com>
|
||||
|
||||
Add support for RISC-V architecture.
|
||||
* readelf.c (guess_is_rela): Add EM_RISCV.
|
||||
(get_machine_name): Likewise.
|
||||
(dump_relocations): Add support for riscv relocations.
|
||||
(get_machine_flags): Add support for riscv flags.
|
||||
(is_32bit_abs_reloc): Add R_RISCV_32.
|
||||
(is_64bit_abs_reloc): Add R_RISCV_64.
|
||||
(is_none_reloc): Add R_RISCV_NONE.
|
||||
* testsuite/binutils-all/objdump.exp (cpus_expected): Add riscv.
|
||||
Expect the debug_ranges test to fail.
|
||||
|
||||
2016-10-17 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* readelf.c (apply_relocations): Fail if the symbol table section
|
||||
|
|
|
@ -124,6 +124,7 @@
|
|||
#include "elf/metag.h"
|
||||
#include "elf/microblaze.h"
|
||||
#include "elf/mips.h"
|
||||
#include "elf/riscv.h"
|
||||
#include "elf/mmix.h"
|
||||
#include "elf/mn10200.h"
|
||||
#include "elf/mn10300.h"
|
||||
|
@ -775,6 +776,7 @@ guess_is_rela (unsigned int e_machine)
|
|||
case EM_OR1K:
|
||||
case EM_PPC64:
|
||||
case EM_PPC:
|
||||
case EM_RISCV:
|
||||
case EM_RL78:
|
||||
case EM_RX:
|
||||
case EM_S390:
|
||||
|
@ -1314,6 +1316,10 @@ dump_relocations (FILE * file,
|
|||
rtype = elf_mips_reloc_type (type);
|
||||
break;
|
||||
|
||||
case EM_RISCV:
|
||||
rtype = elf_riscv_reloc_type (type);
|
||||
break;
|
||||
|
||||
case EM_ALPHA:
|
||||
rtype = elf_alpha_reloc_type (type);
|
||||
break;
|
||||
|
@ -2327,6 +2333,7 @@ get_machine_name (unsigned e_machine)
|
|||
case EM_CR16:
|
||||
case EM_MICROBLAZE:
|
||||
case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
|
||||
case EM_RISCV: return "RISC-V";
|
||||
case EM_RL78: return "Renesas RL78";
|
||||
case EM_RX: return "Renesas RX";
|
||||
case EM_METAG: return "Imagination Technologies Meta processor architecture";
|
||||
|
@ -2363,7 +2370,6 @@ get_machine_name (unsigned e_machine)
|
|||
case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
|
||||
case EM_Z80: return "Zilog Z80";
|
||||
case EM_AMDGPU: return "AMD GPU architecture";
|
||||
case EM_RISCV: return "RISC-V";
|
||||
default:
|
||||
snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
|
||||
return buff;
|
||||
|
@ -3308,6 +3314,13 @@ get_machine_flags (unsigned e_flags, unsigned e_machine)
|
|||
decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
|
||||
break;
|
||||
|
||||
case EM_RISCV:
|
||||
if (e_flags & EF_RISCV_RVC)
|
||||
strcat (buf, ", RVC");
|
||||
if (e_flags & EF_RISCV_SOFT_FLOAT)
|
||||
strcat (buf, ", soft-float ABI");
|
||||
break;
|
||||
|
||||
case EM_SH:
|
||||
switch ((e_flags & EF_SH_MACH_MASK))
|
||||
{
|
||||
|
@ -11788,6 +11801,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_RISCV:
|
||||
return reloc_type == 1; /* R_RISCV_32. */
|
||||
case EM_RL78:
|
||||
return reloc_type == 1; /* R_RL78_DIR32. */
|
||||
case EM_RX:
|
||||
|
@ -11941,6 +11956,8 @@ is_64bit_abs_reloc (unsigned int reloc_type)
|
|||
return reloc_type == 80; /* R_PARISC_DIR64. */
|
||||
case EM_PPC64:
|
||||
return reloc_type == 38; /* R_PPC64_ADDR64. */
|
||||
case EM_RISCV:
|
||||
return reloc_type == 2; /* R_RISCV_64. */
|
||||
case EM_SPARC32PLUS:
|
||||
case EM_SPARCV9:
|
||||
case EM_SPARC:
|
||||
|
@ -12112,6 +12129,7 @@ is_none_reloc (unsigned int reloc_type)
|
|||
case EM_PARISC: /* R_PARISC_NONE. */
|
||||
case EM_PPC64: /* R_PPC64_NONE. */
|
||||
case EM_PPC: /* R_PPC_NONE. */
|
||||
case EM_RISCV: /* R_RISCV_NONE. */
|
||||
case EM_S390: /* R_390_NONE. */
|
||||
case EM_S390_OLD:
|
||||
case EM_SH: /* R_SH_NONE. */
|
||||
|
|
|
@ -38,7 +38,7 @@ lappend cpus_expected aarch64 alpha arc ARC700 ARCv2 arm cris
|
|||
lappend cpus_expected d10v d30v fr30 fr500 fr550 h8 hppa i386 i860 i960 iamcu ip2022
|
||||
lappend cpus_expected m16c m32c m32r m68hc11 m68hc12 m68k m88k MCore mep c5 h1 MicroBlaze
|
||||
lappend cpus_expected mips mn10200 mn10300 ms1 msp MSP430 nds32 n1h_v3 ns32k
|
||||
lappend cpus_expected or1k or1knd pj powerpc pyramid romp rs6000 s390 sh sparc
|
||||
lappend cpus_expected or1k or1knd pj powerpc pyramid riscv romp rs6000 s390 sh sparc
|
||||
lappend cpus_expected tahoe tic54x tic80 tilegx tms320c30 tms320c4x tms320c54x
|
||||
lappend cpus_expected v850 vax we32k x86-64 xscale xtensa z8k z8001 z8002
|
||||
|
||||
|
@ -265,7 +265,7 @@ if { ![is_elf_format] } then {
|
|||
send_log "\n"
|
||||
}
|
||||
|
||||
setup_xfail "msp430-*-*" "nds32*-*-*"
|
||||
setup_xfail "msp430-*-*" "nds32*-*-*" "riscv*-*-*"
|
||||
if { [regexp_diff objdump.out $srcdir/$subdir/dw2-ranges.W] } then {
|
||||
fail "objdump -W for debug_ranges"
|
||||
} else {
|
||||
|
|
|
@ -1,3 +1,24 @@
|
|||
2016-11-01 Palmer Dabbelt <palmer@dabbelt.com>
|
||||
Andrew Waterman <andrew@sifive.com>
|
||||
|
||||
Add support for RISC-V architecture.
|
||||
* Makefile.am: Add riscv files.
|
||||
* Makefile.in: Regenerate.
|
||||
* NEWS: Mention the support for this architecture.
|
||||
* configure.in: Define a default architecture.
|
||||
* configure: Regenerate.
|
||||
* configure.tgt: Add entries for riscv.
|
||||
* doc/as.texinfo: Likewise.
|
||||
* testsuite/gas/all/gas.exp: Expect the redef tests to fail.
|
||||
* testsuite/gas/elf/elf.exp: Expect the groupauto tests to fail.
|
||||
* config/tc-riscv.c: New file.
|
||||
* config/tc-riscv.h: New file.
|
||||
* doc/c-riscv.texi: New file.
|
||||
* testsuite/gas/riscv: New directory.
|
||||
* testsuite/gas/riscv/riscv.exp: New file.
|
||||
* testsuite/gas/riscv/t_insns.d: New file.
|
||||
* testsuite/gas/riscv/t_insns.s: New file.
|
||||
|
||||
2016-10-27 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* config/tc-arc.c (arc_target): Delete.
|
||||
|
|
|
@ -177,6 +177,7 @@ TARGET_CPU_CFILES = \
|
|||
config/tc-pdp11.c \
|
||||
config/tc-pj.c \
|
||||
config/tc-ppc.c \
|
||||
config/tc-riscv.c \
|
||||
config/tc-rl78.c \
|
||||
config/tc-rx.c \
|
||||
config/tc-s390.c \
|
||||
|
@ -250,6 +251,7 @@ TARGET_CPU_HFILES = \
|
|||
config/tc-pdp11.h \
|
||||
config/tc-pj.h \
|
||||
config/tc-ppc.h \
|
||||
config/tc-riscv.h \
|
||||
config/tc-rl78.h \
|
||||
config/tc-rx.h \
|
||||
config/tc-s390.h \
|
||||
|
|
|
@ -472,6 +472,7 @@ TARGET_CPU_CFILES = \
|
|||
config/tc-pdp11.c \
|
||||
config/tc-pj.c \
|
||||
config/tc-ppc.c \
|
||||
config/tc-riscv.c \
|
||||
config/tc-rl78.c \
|
||||
config/tc-rx.c \
|
||||
config/tc-s390.c \
|
||||
|
@ -545,6 +546,7 @@ TARGET_CPU_HFILES = \
|
|||
config/tc-pdp11.h \
|
||||
config/tc-pj.h \
|
||||
config/tc-ppc.h \
|
||||
config/tc-riscv.h \
|
||||
config/tc-rl78.h \
|
||||
config/tc-rx.h \
|
||||
config/tc-s390.h \
|
||||
|
@ -903,6 +905,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-riscv.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc-rl78.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@
|
||||
|
@ -1623,6 +1626,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-riscv.o: config/tc-riscv.c
|
||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tc-riscv.o -MD -MP -MF $(DEPDIR)/tc-riscv.Tpo -c -o tc-riscv.o `test -f 'config/tc-riscv.c' || echo '$(srcdir)/'`config/tc-riscv.c
|
||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/tc-riscv.Tpo $(DEPDIR)/tc-riscv.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='config/tc-riscv.c' object='tc-riscv.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-riscv.o `test -f 'config/tc-riscv.c' || echo '$(srcdir)/'`config/tc-riscv.c
|
||||
|
||||
tc-riscv.obj: config/tc-riscv.c
|
||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tc-riscv.obj -MD -MP -MF $(DEPDIR)/tc-riscv.Tpo -c -o tc-riscv.obj `if test -f 'config/tc-riscv.c'; then $(CYGPATH_W) 'config/tc-riscv.c'; else $(CYGPATH_W) '$(srcdir)/config/tc-riscv.c'; fi`
|
||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/tc-riscv.Tpo $(DEPDIR)/tc-riscv.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='config/tc-riscv.c' object='tc-riscv.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-riscv.obj `if test -f 'config/tc-riscv.c'; then $(CYGPATH_W) 'config/tc-riscv.c'; else $(CYGPATH_W) '$(srcdir)/config/tc-riscv.c'; fi`
|
||||
|
||||
tc-rl78.o: config/tc-rl78.c
|
||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tc-rl78.o -MD -MP -MF $(DEPDIR)/tc-rl78.Tpo -c -o tc-rl78.o `test -f 'config/tc-rl78.c' || echo '$(srcdir)/'`config/tc-rl78.c
|
||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/tc-rl78.Tpo $(DEPDIR)/tc-rl78.Po
|
||||
|
|
2
gas/NEWS
2
gas/NEWS
|
@ -1,5 +1,7 @@
|
|||
-*- text -*-
|
||||
|
||||
* Add support for the RISC-V architecture.
|
||||
|
||||
Changes in 2.27:
|
||||
|
||||
* Default to --enable-compressed-debug-sections=gas for Linux/x86 targets.
|
||||
|
|
2408
gas/config/tc-riscv.c
Normal file
2408
gas/config/tc-riscv.c
Normal file
File diff suppressed because it is too large
Load diff
101
gas/config/tc-riscv.h
Normal file
101
gas/config/tc-riscv.h
Normal file
|
@ -0,0 +1,101 @@
|
|||
/* tc-riscv.h -- header file for tc-riscv.c.
|
||||
Copyright 2011-2016 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Andrew Waterman (andrew@sifive.com).
|
||||
Based on MIPS target.
|
||||
|
||||
This file is part of GAS.
|
||||
|
||||
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 this program; see the file COPYING3. If not,
|
||||
see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef TC_RISCV
|
||||
#define TC_RISCV
|
||||
|
||||
#include "opcode/riscv.h"
|
||||
|
||||
struct frag;
|
||||
struct expressionS;
|
||||
|
||||
#define TARGET_BYTES_BIG_ENDIAN 0
|
||||
|
||||
#define TARGET_ARCH bfd_arch_riscv
|
||||
|
||||
#define WORKING_DOT_WORD 1
|
||||
#define LOCAL_LABELS_FB 1
|
||||
|
||||
/* Symbols named FAKE_LABEL_NAME are emitted when generating DWARF, so make
|
||||
sure FAKE_LABEL_NAME is printable. It still must be distinct from any
|
||||
real label name. So, append a space, which other labels can't contain. */
|
||||
#define FAKE_LABEL_NAME ".L0 "
|
||||
|
||||
#define md_relax_frag(segment, fragp, stretch) \
|
||||
riscv_relax_frag (segment, fragp, stretch)
|
||||
extern int riscv_relax_frag (asection *, struct frag *, long);
|
||||
|
||||
#define md_section_align(seg,size) (size)
|
||||
#define md_undefined_symbol(name) (0)
|
||||
#define md_operand(x)
|
||||
|
||||
/* FIXME: it is unclear if this is used, or if it is even correct. */
|
||||
#define MAX_MEM_FOR_RS_ALIGN_CODE (1 + 2)
|
||||
|
||||
/* The ISA of the target may change based on command-line arguments. */
|
||||
#define TARGET_FORMAT riscv_target_format()
|
||||
extern const char * riscv_target_format (void);
|
||||
|
||||
#define md_after_parse_args() riscv_after_parse_args()
|
||||
extern void riscv_after_parse_args (void);
|
||||
|
||||
#define md_parse_long_option(arg) riscv_parse_long_option (arg)
|
||||
extern int riscv_parse_long_option (const char *);
|
||||
|
||||
/* Let the linker resolve all the relocs due to relaxation. */
|
||||
#define tc_fix_adjustable(fixp) 0
|
||||
#define md_allow_local_subtract(l,r,s) 0
|
||||
|
||||
/* Values passed to md_apply_fix don't include symbol values. */
|
||||
#define MD_APPLY_SYM_VALUE(FIX) 0
|
||||
|
||||
/* Global syms must not be resolved, to support ELF shared libraries. */
|
||||
#define EXTERN_FORCE_RELOC \
|
||||
(OUTPUT_FLAVOR == bfd_target_elf_flavour)
|
||||
|
||||
/* Postpone text-section label subtraction calculation until linking, since
|
||||
linker relaxations might change the deltas. */
|
||||
#define TC_FORCE_RELOCATION_SUB_SAME(FIX, SEG) ((SEG)->flags & SEC_CODE)
|
||||
#define TC_FORCE_RELOCATION_SUB_LOCAL(FIX, SEG) 1
|
||||
#define TC_VALIDATE_FIX_SUB(FIX, SEG) 1
|
||||
#define TC_FORCE_RELOCATION_LOCAL(FIX) 1
|
||||
#define DIFF_EXPR_OK 1
|
||||
|
||||
extern void riscv_pop_insert (void);
|
||||
#define md_pop_insert() riscv_pop_insert ()
|
||||
|
||||
#define TARGET_USE_CFIPOP 1
|
||||
|
||||
#define tc_cfi_frame_initial_instructions riscv_cfi_frame_initial_instructions
|
||||
extern void riscv_cfi_frame_initial_instructions (void);
|
||||
|
||||
#define tc_regname_to_dw2regnum tc_riscv_regname_to_dw2regnum
|
||||
extern int tc_riscv_regname_to_dw2regnum (char *);
|
||||
|
||||
extern unsigned xlen;
|
||||
#define DWARF2_DEFAULT_RETURN_COLUMN X_RA
|
||||
#define DWARF2_CIE_DATA_ALIGNMENT (-(int) (xlen / 8))
|
||||
|
||||
#define elf_tc_final_processing riscv_elf_final_processing
|
||||
extern void riscv_elf_final_processing (void);
|
||||
|
||||
#endif /* TC_RISCV */
|
2
gas/configure
vendored
2
gas/configure
vendored
|
@ -12552,7 +12552,7 @@ $as_echo "#define NDS32_DEFAULT_AUDIO_EXT 1" >>confdefs.h
|
|||
$as_echo "$enable_audio_ext" >&6; }
|
||||
;;
|
||||
|
||||
i386 | s390 | sparc)
|
||||
i386 | riscv | s390 | sparc)
|
||||
if test $this_target = $target ; then
|
||||
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
|
|
|
@ -510,7 +510,7 @@ changequote([,])dnl
|
|||
AC_MSG_RESULT($enable_audio_ext)
|
||||
;;
|
||||
|
||||
i386 | s390 | sparc)
|
||||
i386 | riscv | s390 | sparc)
|
||||
if test $this_target = $target ; then
|
||||
AC_DEFINE_UNQUOTED(DEFAULT_ARCH, "${arch}", [Default architecture.])
|
||||
fi
|
||||
|
|
|
@ -87,6 +87,8 @@ case ${cpu} in
|
|||
pj*) cpu_type=pj endian=big ;;
|
||||
powerpc*le*) cpu_type=ppc endian=little ;;
|
||||
powerpc*) cpu_type=ppc endian=big ;;
|
||||
riscv32*) cpu_type=riscv endian=little arch=riscv32 ;;
|
||||
riscv64*) cpu_type=riscv endian=little arch=riscv64 ;;
|
||||
rs6000*) cpu_type=ppc ;;
|
||||
rl78*) cpu_type=rl78 ;;
|
||||
rx) cpu_type=rx ;;
|
||||
|
@ -391,6 +393,8 @@ case ${generic_target} in
|
|||
ppc-*-kaos*) fmt=elf ;;
|
||||
ppc-*-lynxos*) fmt=elf em=lynx ;;
|
||||
|
||||
riscv*-*-*) fmt=elf endian=little em=linux ;;
|
||||
|
||||
s390-*-linux-*) fmt=elf em=linux ;;
|
||||
s390-*-tpf*) fmt=elf ;;
|
||||
|
||||
|
@ -488,7 +492,7 @@ case ${generic_target} in
|
|||
esac
|
||||
|
||||
case ${cpu_type} in
|
||||
aarch64 | alpha | arm | i386 | ia64 | microblaze | mips | ns32k | or1k | or1knd | pdp11 | ppc | sparc | z80 | z8k)
|
||||
aarch64 | alpha | arm | i386 | ia64 | microblaze | mips | ns32k | or1k | or1knd | pdp11 | ppc | riscv | sparc | z80 | z8k)
|
||||
bfd_gas=yes
|
||||
;;
|
||||
esac
|
||||
|
|
|
@ -1647,6 +1647,25 @@ PowerPC processor.
|
|||
|
||||
@end ifset
|
||||
|
||||
@ifset RISCV
|
||||
|
||||
@ifclear man
|
||||
@xref{RISC-V-Opts}, for the options available when @value{AS} is configured
|
||||
for a RISC-V processor.
|
||||
@end ifclear
|
||||
|
||||
@ifset man
|
||||
@c man begin OPTIONS
|
||||
The following options are available when @value{AS} is configured for a
|
||||
RISC-V processor.
|
||||
@c man end
|
||||
@c man begin INCLUDE
|
||||
@include c-riscv.texi
|
||||
@c ended inside the included file
|
||||
@end ifset
|
||||
|
||||
@end ifset
|
||||
|
||||
@c man begin OPTIONS
|
||||
@ifset RX
|
||||
See the info pages for documentation of the RX-specific options.
|
||||
|
|
48
gas/doc/c-riscv.texi
Normal file
48
gas/doc/c-riscv.texi
Normal file
|
@ -0,0 +1,48 @@
|
|||
@c Copyright (C) 2016 Free Software Foundation, Inc.
|
||||
@c This is part of the GAS anual.
|
||||
@c For copying conditions, see the file as.texinfo
|
||||
@c man end
|
||||
|
||||
@ifset GENERIC
|
||||
@page
|
||||
@node RISC-V-Dependent
|
||||
@chapter RISC-V Dependent Features
|
||||
@end ifset
|
||||
@ifclear GENERIC
|
||||
@node Machine Dependencies
|
||||
@chapter RISC-V Dependent Features
|
||||
@end ifclear
|
||||
|
||||
@cindex RISC-V support
|
||||
@menu
|
||||
* RISC-V Options:: RISC-V Options
|
||||
@end menu
|
||||
|
||||
@node RISC-V Options
|
||||
@section Options
|
||||
|
||||
The following table lists all availiable RISC-V specific options
|
||||
|
||||
@c man begin OPTIONS
|
||||
@table @gcctabopt
|
||||
@cindex @samp{-m32} option, RISC-V
|
||||
@cindex @samp{-m64} option, RISC-V
|
||||
@item -m32 | -m64
|
||||
Select the base ISA, either RV32 or RV64.
|
||||
|
||||
@cindex @samp{-mrvc} option, RISC-V
|
||||
@item -mrvc
|
||||
Enables the C ISA subset for compressed instructions.
|
||||
|
||||
@cindex @samp{-msoft-float} option, RISC-V
|
||||
@cindex @samp{-mhard-float} option, RISC-V
|
||||
@item -msoft-float | -mhard-float
|
||||
Select the floating-point ABI, hard-float has F registers while soft-float
|
||||
doesn't.
|
||||
|
||||
@cindex @samp{-march=RV{32,64}{G,I}{M,}{A,}{F,}{D,}{C,}} option, RISC-V
|
||||
@item -march=RV{32,64}{G,I}{M,}{A,}{F,}{D,}{C,}
|
||||
Select the base isa, as specified by ISA. For example -march=RV32IMA.
|
||||
|
||||
@end table
|
||||
@c man end
|
|
@ -159,10 +159,10 @@ case $target_triplet in {
|
|||
# These targets fail redef2 because they disallow redefined
|
||||
# symbols on relocs.
|
||||
setup_xfail "m68hc1*-*-*" "m6811-*-*" "m6812-*-*" "rl78-*-*"
|
||||
setup_xfail "rx-*-*" "vax*-*-*" "xgate*-*-*" "z8k-*-*"
|
||||
setup_xfail "riscv*-*-*" "rx-*-*" "vax*-*-*" "xgate*-*-*" "z8k-*-*"
|
||||
run_dump_test redef2
|
||||
setup_xfail "m68hc1*-*-*" "m6811-*-*" "m6812-*-*" "rl78-*-*"
|
||||
setup_xfail "rx-*-*" "vax*-*-*" "xgate*-*-*" "z8k-*-*"
|
||||
setup_xfail "riscv*-*-*" "rx-*-*" "vax*-*-*" "xgate*-*-*" "z8k-*-*"
|
||||
# rs6000-aix disallows redefinition via .comm.
|
||||
setup_xfail "*-*-aix*"
|
||||
# SOM uses a different syntax for .comm
|
||||
|
@ -277,8 +277,8 @@ if { ![istarget *c30*-*-*]
|
|||
&& ![istarget hppa*-*-*] } then {
|
||||
# The vax fails because VMS can apparently actually handle this
|
||||
# case in relocs, so gas doesn't handle it itself.
|
||||
# msp430 and mn10[23]00 emit two relocs to handle the difference of two symbols.
|
||||
setup_xfail "mn10200-*-*" "mn10300*-*-*" "msp430*-*-*" "vax*-*-vms*"
|
||||
# msp430, mn10[23]00 and riscv emit two relocs to handle the difference of two symbols.
|
||||
setup_xfail "mn10200-*-*" "mn10300*-*-*" "msp430*-*-*" "riscv*-*-*" "vax*-*-vms*"
|
||||
do_930509a
|
||||
}
|
||||
|
||||
|
|
|
@ -120,12 +120,14 @@ if { [is_elf_format] } then {
|
|||
run_dump_test "group2"
|
||||
case $target_triplet in {
|
||||
{ hppa64*-*-hpux* } { }
|
||||
{ riscv*-*-* } { }
|
||||
default {
|
||||
run_dump_test "groupautoa"
|
||||
}
|
||||
}
|
||||
case $target_triplet in {
|
||||
{ hppa64*-*-hpux* } { }
|
||||
{ riscv*-*-* } { }
|
||||
{ xtensa*-*-* } { }
|
||||
default {
|
||||
run_dump_test "groupautob"
|
||||
|
@ -144,6 +146,7 @@ if { [is_elf_format] } then {
|
|||
{ mn10300-*-* } { }
|
||||
{ msp43*-*-* } { }
|
||||
{ rl78-*-* } { }
|
||||
{ riscv*-*-* } { }
|
||||
{ rx-*-* } { }
|
||||
default {
|
||||
# The next test can fail if the target does not convert fixups
|
||||
|
|
23
gas/testsuite/gas/riscv/riscv.exp
Normal file
23
gas/testsuite/gas/riscv/riscv.exp
Normal file
|
@ -0,0 +1,23 @@
|
|||
# Expect script for RISC-V assembler tests.
|
||||
# Copyright (C) 2011-2016 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.
|
||||
|
||||
if [istarget riscv*-*-*] {
|
||||
run_dump_test "t_insns"
|
||||
}
|
10
gas/testsuite/gas/riscv/t_insns.d
Normal file
10
gas/testsuite/gas/riscv/t_insns.d
Normal file
|
@ -0,0 +1,10 @@
|
|||
#as:
|
||||
#objdump: -dr
|
||||
|
||||
.*:[ ]+file format .*
|
||||
|
||||
|
||||
Disassembly of section .text:
|
||||
|
||||
0+000 <target>:
|
||||
[ ]+0:[ ]+00000013[ ]+nop
|
2
gas/testsuite/gas/riscv/t_insns.s
Normal file
2
gas/testsuite/gas/riscv/t_insns.s
Normal file
|
@ -0,0 +1,2 @@
|
|||
target:
|
||||
nop
|
|
@ -1,3 +1,13 @@
|
|||
2016-11-01 Palmer Dabbelt <palmer@dabbelt.com>
|
||||
Andrew Waterman <andrew@sifive.com>
|
||||
|
||||
Add support for RISC-V architecture.
|
||||
* dis-asm.h: Add prototypes for print_insn_riscv and
|
||||
print_riscv_disassembler_options.
|
||||
* elf/riscv.h: New file.
|
||||
* opcode/riscv-opc.h: New file.
|
||||
* opcode/riscv.h: New file.
|
||||
|
||||
2016-10-17 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* elf/common.h (DT_SYMTAB_SHNDX): Define.
|
||||
|
|
|
@ -263,6 +263,7 @@ extern int print_insn_little_arm (bfd_vma, disassemble_info *);
|
|||
extern int print_insn_little_mips (bfd_vma, disassemble_info *);
|
||||
extern int print_insn_little_nios2 (bfd_vma, disassemble_info *);
|
||||
extern int print_insn_little_powerpc (bfd_vma, disassemble_info *);
|
||||
extern int print_insn_riscv (bfd_vma, disassemble_info *);
|
||||
extern int print_insn_little_score (bfd_vma, disassemble_info *);
|
||||
extern int print_insn_lm32 (bfd_vma, disassemble_info *);
|
||||
extern int print_insn_m32c (bfd_vma, disassemble_info *);
|
||||
|
@ -327,6 +328,7 @@ extern void print_aarch64_disassembler_options (FILE *);
|
|||
extern void print_i386_disassembler_options (FILE *);
|
||||
extern void print_mips_disassembler_options (FILE *);
|
||||
extern void print_ppc_disassembler_options (FILE *);
|
||||
extern void print_riscv_disassembler_options (FILE *);
|
||||
extern void print_arm_disassembler_options (FILE *);
|
||||
extern void print_arc_disassembler_options (FILE *);
|
||||
extern void parse_arm_disassembler_option (char *);
|
||||
|
|
92
include/elf/riscv.h
Normal file
92
include/elf/riscv.h
Normal file
|
@ -0,0 +1,92 @@
|
|||
/* RISC-V ELF support for BFD.
|
||||
Copyright 2011-2016 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Andrew Waterman (andrew@sifive.com).
|
||||
Based on MIPS ELF support for BFD, by Ian Lance Taylor.
|
||||
|
||||
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; see the file COPYING3. If not,
|
||||
see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* This file holds definitions specific to the RISCV ELF ABI. Note
|
||||
that most of this is not actually implemented by BFD. */
|
||||
|
||||
#ifndef _ELF_RISCV_H
|
||||
#define _ELF_RISCV_H
|
||||
|
||||
#include "elf/reloc-macros.h"
|
||||
#include "libiberty.h"
|
||||
|
||||
/* Relocation types. */
|
||||
START_RELOC_NUMBERS (elf_riscv_reloc_type)
|
||||
/* Relocation types used by the dynamic linker. */
|
||||
RELOC_NUMBER (R_RISCV_NONE, 0)
|
||||
RELOC_NUMBER (R_RISCV_32, 1)
|
||||
RELOC_NUMBER (R_RISCV_64, 2)
|
||||
RELOC_NUMBER (R_RISCV_RELATIVE, 3)
|
||||
RELOC_NUMBER (R_RISCV_COPY, 4)
|
||||
RELOC_NUMBER (R_RISCV_JUMP_SLOT, 5)
|
||||
RELOC_NUMBER (R_RISCV_TLS_DTPMOD32, 6)
|
||||
RELOC_NUMBER (R_RISCV_TLS_DTPMOD64, 7)
|
||||
RELOC_NUMBER (R_RISCV_TLS_DTPREL32, 8)
|
||||
RELOC_NUMBER (R_RISCV_TLS_DTPREL64, 9)
|
||||
RELOC_NUMBER (R_RISCV_TLS_TPREL32, 10)
|
||||
RELOC_NUMBER (R_RISCV_TLS_TPREL64, 11)
|
||||
|
||||
/* Relocation types not used by the dynamic linker. */
|
||||
RELOC_NUMBER (R_RISCV_BRANCH, 16)
|
||||
RELOC_NUMBER (R_RISCV_JAL, 17)
|
||||
RELOC_NUMBER (R_RISCV_CALL, 18)
|
||||
RELOC_NUMBER (R_RISCV_CALL_PLT, 19)
|
||||
RELOC_NUMBER (R_RISCV_GOT_HI20, 20)
|
||||
RELOC_NUMBER (R_RISCV_TLS_GOT_HI20, 21)
|
||||
RELOC_NUMBER (R_RISCV_TLS_GD_HI20, 22)
|
||||
RELOC_NUMBER (R_RISCV_PCREL_HI20, 23)
|
||||
RELOC_NUMBER (R_RISCV_PCREL_LO12_I, 24)
|
||||
RELOC_NUMBER (R_RISCV_PCREL_LO12_S, 25)
|
||||
RELOC_NUMBER (R_RISCV_HI20, 26)
|
||||
RELOC_NUMBER (R_RISCV_LO12_I, 27)
|
||||
RELOC_NUMBER (R_RISCV_LO12_S, 28)
|
||||
RELOC_NUMBER (R_RISCV_TPREL_HI20, 29)
|
||||
RELOC_NUMBER (R_RISCV_TPREL_LO12_I, 30)
|
||||
RELOC_NUMBER (R_RISCV_TPREL_LO12_S, 31)
|
||||
RELOC_NUMBER (R_RISCV_TPREL_ADD, 32)
|
||||
RELOC_NUMBER (R_RISCV_ADD8, 33)
|
||||
RELOC_NUMBER (R_RISCV_ADD16, 34)
|
||||
RELOC_NUMBER (R_RISCV_ADD32, 35)
|
||||
RELOC_NUMBER (R_RISCV_ADD64, 36)
|
||||
RELOC_NUMBER (R_RISCV_SUB8, 37)
|
||||
RELOC_NUMBER (R_RISCV_SUB16, 38)
|
||||
RELOC_NUMBER (R_RISCV_SUB32, 39)
|
||||
RELOC_NUMBER (R_RISCV_SUB64, 40)
|
||||
RELOC_NUMBER (R_RISCV_GNU_VTINHERIT, 41)
|
||||
RELOC_NUMBER (R_RISCV_GNU_VTENTRY, 42)
|
||||
RELOC_NUMBER (R_RISCV_ALIGN, 43)
|
||||
RELOC_NUMBER (R_RISCV_RVC_BRANCH, 44)
|
||||
RELOC_NUMBER (R_RISCV_RVC_JUMP, 45)
|
||||
RELOC_NUMBER (R_RISCV_RVC_LUI, 46)
|
||||
RELOC_NUMBER (R_RISCV_GPREL_I, 47)
|
||||
RELOC_NUMBER (R_RISCV_GPREL_S, 48)
|
||||
END_RELOC_NUMBERS (R_RISCV_max)
|
||||
|
||||
/* Processor specific flags for the ELF header e_flags field. */
|
||||
|
||||
/* File may contain compressed instructions. */
|
||||
#define EF_RISCV_RVC 0x0001
|
||||
|
||||
/* File uses the soft-float calling convention. */
|
||||
#define EF_RISCV_SOFT_FLOAT 0x0002
|
||||
|
||||
#endif /* _ELF_RISCV_H */
|
1160
include/opcode/riscv-opc.h
Normal file
1160
include/opcode/riscv-opc.h
Normal file
File diff suppressed because it is too large
Load diff
342
include/opcode/riscv.h
Normal file
342
include/opcode/riscv.h
Normal file
|
@ -0,0 +1,342 @@
|
|||
/* riscv.h. RISC-V opcode list for GDB, the GNU debugger.
|
||||
Copyright 2011-2016 Free Software Foundation, Inc.
|
||||
Contributed by Andrew Waterman
|
||||
|
||||
This file is part of GDB, GAS, and the GNU binutils.
|
||||
|
||||
GDB, GAS, and the GNU binutils are free software; you can redistribute
|
||||
them and/or modify them 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.
|
||||
|
||||
GDB, GAS, and the GNU binutils are distributed in the hope that they
|
||||
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; see the file COPYING3. If not,
|
||||
see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _RISCV_H_
|
||||
#define _RISCV_H_
|
||||
|
||||
#include "riscv-opc.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
||||
typedef uint64_t insn_t;
|
||||
|
||||
static inline unsigned int riscv_insn_length (insn_t insn)
|
||||
{
|
||||
if ((insn & 0x3) != 0x3) /* RVC. */
|
||||
return 2;
|
||||
if ((insn & 0x1f) != 0x1f) /* Base ISA and extensions in 32-bit space. */
|
||||
return 4;
|
||||
if ((insn & 0x3f) == 0x1f) /* 48-bit extensions. */
|
||||
return 6;
|
||||
if ((insn & 0x7f) == 0x3f) /* 64-bit extensions. */
|
||||
return 8;
|
||||
/* Longer instructions not supported at the moment. */
|
||||
return 2;
|
||||
}
|
||||
|
||||
static const char * const riscv_rm[8] =
|
||||
{
|
||||
"rne", "rtz", "rdn", "rup", "rmm", 0, 0, "dyn"
|
||||
};
|
||||
|
||||
static const char * const riscv_pred_succ[16] =
|
||||
{
|
||||
0, "w", "r", "rw", "o", "ow", "or", "orw",
|
||||
"i", "iw", "ir", "irw", "io", "iow", "ior", "iorw"
|
||||
};
|
||||
|
||||
#define RVC_JUMP_BITS 11
|
||||
#define RVC_JUMP_REACH ((1ULL << RVC_JUMP_BITS) * RISCV_JUMP_ALIGN)
|
||||
|
||||
#define RVC_BRANCH_BITS 8
|
||||
#define RVC_BRANCH_REACH ((1ULL << RVC_BRANCH_BITS) * RISCV_BRANCH_ALIGN)
|
||||
|
||||
#define RV_X(x, s, n) (((x) >> (s)) & ((1 << (n)) - 1))
|
||||
#define RV_IMM_SIGN(x) (-(((x) >> 31) & 1))
|
||||
|
||||
#define EXTRACT_ITYPE_IMM(x) \
|
||||
(RV_X(x, 20, 12) | (RV_IMM_SIGN(x) << 12))
|
||||
#define EXTRACT_STYPE_IMM(x) \
|
||||
(RV_X(x, 7, 5) | (RV_X(x, 25, 7) << 5) | (RV_IMM_SIGN(x) << 12))
|
||||
#define EXTRACT_SBTYPE_IMM(x) \
|
||||
((RV_X(x, 8, 4) << 1) | (RV_X(x, 25, 6) << 5) | (RV_X(x, 7, 1) << 11) | (RV_IMM_SIGN(x) << 12))
|
||||
#define EXTRACT_UTYPE_IMM(x) \
|
||||
((RV_X(x, 12, 20) << 12) | (RV_IMM_SIGN(x) << 32))
|
||||
#define EXTRACT_UJTYPE_IMM(x) \
|
||||
((RV_X(x, 21, 10) << 1) | (RV_X(x, 20, 1) << 11) | (RV_X(x, 12, 8) << 12) | (RV_IMM_SIGN(x) << 20))
|
||||
#define EXTRACT_RVC_IMM(x) \
|
||||
(RV_X(x, 2, 5) | (-RV_X(x, 12, 1) << 5))
|
||||
#define EXTRACT_RVC_LUI_IMM(x) \
|
||||
(EXTRACT_RVC_IMM (x) << RISCV_IMM_BITS)
|
||||
#define EXTRACT_RVC_SIMM3(x) \
|
||||
(RV_X(x, 10, 2) | (-RV_X(x, 12, 1) << 2))
|
||||
#define EXTRACT_RVC_ADDI4SPN_IMM(x) \
|
||||
((RV_X(x, 6, 1) << 2) | (RV_X(x, 5, 1) << 3) | (RV_X(x, 11, 2) << 4) | (RV_X(x, 7, 4) << 6))
|
||||
#define EXTRACT_RVC_ADDI16SP_IMM(x) \
|
||||
((RV_X(x, 6, 1) << 4) | (RV_X(x, 2, 1) << 5) | (RV_X(x, 5, 1) << 6) | (RV_X(x, 3, 2) << 7) | (-RV_X(x, 12, 1) << 9))
|
||||
#define EXTRACT_RVC_LW_IMM(x) \
|
||||
((RV_X(x, 6, 1) << 2) | (RV_X(x, 10, 3) << 3) | (RV_X(x, 5, 1) << 6))
|
||||
#define EXTRACT_RVC_LD_IMM(x) \
|
||||
((RV_X(x, 10, 3) << 3) | (RV_X(x, 5, 2) << 6))
|
||||
#define EXTRACT_RVC_LWSP_IMM(x) \
|
||||
((RV_X(x, 4, 3) << 2) | (RV_X(x, 12, 1) << 5) | (RV_X(x, 2, 2) << 6))
|
||||
#define EXTRACT_RVC_LDSP_IMM(x) \
|
||||
((RV_X(x, 5, 2) << 3) | (RV_X(x, 12, 1) << 5) | (RV_X(x, 2, 3) << 6))
|
||||
#define EXTRACT_RVC_SWSP_IMM(x) \
|
||||
((RV_X(x, 9, 4) << 2) | (RV_X(x, 7, 2) << 6))
|
||||
#define EXTRACT_RVC_SDSP_IMM(x) \
|
||||
((RV_X(x, 10, 3) << 3) | (RV_X(x, 7, 3) << 6))
|
||||
#define EXTRACT_RVC_B_IMM(x) \
|
||||
((RV_X(x, 3, 2) << 1) | (RV_X(x, 10, 2) << 3) | (RV_X(x, 2, 1) << 5) | (RV_X(x, 5, 2) << 6) | (-RV_X(x, 12, 1) << 8))
|
||||
#define EXTRACT_RVC_J_IMM(x) \
|
||||
((RV_X(x, 3, 3) << 1) | (RV_X(x, 11, 1) << 4) | (RV_X(x, 2, 1) << 5) | (RV_X(x, 7, 1) << 6) | (RV_X(x, 6, 1) << 7) | (RV_X(x, 9, 2) << 8) | (RV_X(x, 8, 1) << 10) | (-RV_X(x, 12, 1) << 11))
|
||||
|
||||
#define ENCODE_ITYPE_IMM(x) \
|
||||
(RV_X(x, 0, 12) << 20)
|
||||
#define ENCODE_STYPE_IMM(x) \
|
||||
((RV_X(x, 0, 5) << 7) | (RV_X(x, 5, 7) << 25))
|
||||
#define ENCODE_SBTYPE_IMM(x) \
|
||||
((RV_X(x, 1, 4) << 8) | (RV_X(x, 5, 6) << 25) | (RV_X(x, 11, 1) << 7) | (RV_X(x, 12, 1) << 31))
|
||||
#define ENCODE_UTYPE_IMM(x) \
|
||||
(RV_X(x, 12, 20) << 12)
|
||||
#define ENCODE_UJTYPE_IMM(x) \
|
||||
((RV_X(x, 1, 10) << 21) | (RV_X(x, 11, 1) << 20) | (RV_X(x, 12, 8) << 12) | (RV_X(x, 20, 1) << 31))
|
||||
#define ENCODE_RVC_IMM(x) \
|
||||
((RV_X(x, 0, 5) << 2) | (RV_X(x, 5, 1) << 12))
|
||||
#define ENCODE_RVC_LUI_IMM(x) \
|
||||
ENCODE_RVC_IMM ((x) >> RISCV_IMM_BITS)
|
||||
#define ENCODE_RVC_SIMM3(x) \
|
||||
(RV_X(x, 0, 3) << 10)
|
||||
#define ENCODE_RVC_ADDI4SPN_IMM(x) \
|
||||
((RV_X(x, 2, 1) << 6) | (RV_X(x, 3, 1) << 5) | (RV_X(x, 4, 2) << 11) | (RV_X(x, 6, 4) << 7))
|
||||
#define ENCODE_RVC_ADDI16SP_IMM(x) \
|
||||
((RV_X(x, 4, 1) << 6) | (RV_X(x, 5, 1) << 2) | (RV_X(x, 6, 1) << 5) | (RV_X(x, 7, 2) << 3) | (RV_X(x, 9, 1) << 12))
|
||||
#define ENCODE_RVC_LW_IMM(x) \
|
||||
((RV_X(x, 2, 1) << 6) | (RV_X(x, 3, 3) << 10) | (RV_X(x, 6, 1) << 5))
|
||||
#define ENCODE_RVC_LD_IMM(x) \
|
||||
((RV_X(x, 3, 3) << 10) | (RV_X(x, 6, 2) << 5))
|
||||
#define ENCODE_RVC_LWSP_IMM(x) \
|
||||
((RV_X(x, 2, 3) << 4) | (RV_X(x, 5, 1) << 12) | (RV_X(x, 6, 2) << 2))
|
||||
#define ENCODE_RVC_LDSP_IMM(x) \
|
||||
((RV_X(x, 3, 2) << 5) | (RV_X(x, 5, 1) << 12) | (RV_X(x, 6, 3) << 2))
|
||||
#define ENCODE_RVC_SWSP_IMM(x) \
|
||||
((RV_X(x, 2, 4) << 9) | (RV_X(x, 6, 2) << 7))
|
||||
#define ENCODE_RVC_SDSP_IMM(x) \
|
||||
((RV_X(x, 3, 3) << 10) | (RV_X(x, 6, 3) << 7))
|
||||
#define ENCODE_RVC_B_IMM(x) \
|
||||
((RV_X(x, 1, 2) << 3) | (RV_X(x, 3, 2) << 10) | (RV_X(x, 5, 1) << 2) | (RV_X(x, 6, 2) << 5) | (RV_X(x, 8, 1) << 12))
|
||||
#define ENCODE_RVC_J_IMM(x) \
|
||||
((RV_X(x, 1, 3) << 3) | (RV_X(x, 4, 1) << 11) | (RV_X(x, 5, 1) << 2) | (RV_X(x, 6, 1) << 7) | (RV_X(x, 7, 1) << 6) | (RV_X(x, 8, 2) << 9) | (RV_X(x, 10, 1) << 8) | (RV_X(x, 11, 1) << 12))
|
||||
|
||||
#define VALID_ITYPE_IMM(x) (EXTRACT_ITYPE_IMM(ENCODE_ITYPE_IMM(x)) == (x))
|
||||
#define VALID_STYPE_IMM(x) (EXTRACT_STYPE_IMM(ENCODE_STYPE_IMM(x)) == (x))
|
||||
#define VALID_SBTYPE_IMM(x) (EXTRACT_SBTYPE_IMM(ENCODE_SBTYPE_IMM(x)) == (x))
|
||||
#define VALID_UTYPE_IMM(x) (EXTRACT_UTYPE_IMM(ENCODE_UTYPE_IMM(x)) == (x))
|
||||
#define VALID_UJTYPE_IMM(x) (EXTRACT_UJTYPE_IMM(ENCODE_UJTYPE_IMM(x)) == (x))
|
||||
#define VALID_RVC_IMM(x) (EXTRACT_RVC_IMM(ENCODE_RVC_IMM(x)) == (x))
|
||||
#define VALID_RVC_LUI_IMM(x) (EXTRACT_RVC_LUI_IMM(ENCODE_RVC_LUI_IMM(x)) == (x))
|
||||
#define VALID_RVC_SIMM3(x) (EXTRACT_RVC_SIMM3(ENCODE_RVC_SIMM3(x)) == (x))
|
||||
#define VALID_RVC_ADDI4SPN_IMM(x) (EXTRACT_RVC_ADDI4SPN_IMM(ENCODE_RVC_ADDI4SPN_IMM(x)) == (x))
|
||||
#define VALID_RVC_ADDI16SP_IMM(x) (EXTRACT_RVC_ADDI16SP_IMM(ENCODE_RVC_ADDI16SP_IMM(x)) == (x))
|
||||
#define VALID_RVC_LW_IMM(x) (EXTRACT_RVC_LW_IMM(ENCODE_RVC_LW_IMM(x)) == (x))
|
||||
#define VALID_RVC_LD_IMM(x) (EXTRACT_RVC_LD_IMM(ENCODE_RVC_LD_IMM(x)) == (x))
|
||||
#define VALID_RVC_LWSP_IMM(x) (EXTRACT_RVC_LWSP_IMM(ENCODE_RVC_LWSP_IMM(x)) == (x))
|
||||
#define VALID_RVC_LDSP_IMM(x) (EXTRACT_RVC_LDSP_IMM(ENCODE_RVC_LDSP_IMM(x)) == (x))
|
||||
#define VALID_RVC_SWSP_IMM(x) (EXTRACT_RVC_SWSP_IMM(ENCODE_RVC_SWSP_IMM(x)) == (x))
|
||||
#define VALID_RVC_SDSP_IMM(x) (EXTRACT_RVC_SDSP_IMM(ENCODE_RVC_SDSP_IMM(x)) == (x))
|
||||
#define VALID_RVC_B_IMM(x) (EXTRACT_RVC_B_IMM(ENCODE_RVC_B_IMM(x)) == (x))
|
||||
#define VALID_RVC_J_IMM(x) (EXTRACT_RVC_J_IMM(ENCODE_RVC_J_IMM(x)) == (x))
|
||||
|
||||
#define RISCV_RTYPE(insn, rd, rs1, rs2) \
|
||||
((MATCH_ ## insn) | ((rd) << OP_SH_RD) | ((rs1) << OP_SH_RS1) | ((rs2) << OP_SH_RS2))
|
||||
#define RISCV_ITYPE(insn, rd, rs1, imm) \
|
||||
((MATCH_ ## insn) | ((rd) << OP_SH_RD) | ((rs1) << OP_SH_RS1) | ENCODE_ITYPE_IMM(imm))
|
||||
#define RISCV_STYPE(insn, rs1, rs2, imm) \
|
||||
((MATCH_ ## insn) | ((rs1) << OP_SH_RS1) | ((rs2) << OP_SH_RS2) | ENCODE_STYPE_IMM(imm))
|
||||
#define RISCV_SBTYPE(insn, rs1, rs2, target) \
|
||||
((MATCH_ ## insn) | ((rs1) << OP_SH_RS1) | ((rs2) << OP_SH_RS2) | ENCODE_SBTYPE_IMM(target))
|
||||
#define RISCV_UTYPE(insn, rd, bigimm) \
|
||||
((MATCH_ ## insn) | ((rd) << OP_SH_RD) | ENCODE_UTYPE_IMM(bigimm))
|
||||
#define RISCV_UJTYPE(insn, rd, target) \
|
||||
((MATCH_ ## insn) | ((rd) << OP_SH_RD) | ENCODE_UJTYPE_IMM(target))
|
||||
|
||||
#define RISCV_NOP RISCV_ITYPE(ADDI, 0, 0, 0)
|
||||
#define RVC_NOP MATCH_C_ADDI
|
||||
|
||||
#define RISCV_CONST_HIGH_PART(VALUE) \
|
||||
(((VALUE) + (RISCV_IMM_REACH/2)) & ~(RISCV_IMM_REACH-1))
|
||||
#define RISCV_CONST_LOW_PART(VALUE) ((VALUE) - RISCV_CONST_HIGH_PART (VALUE))
|
||||
#define RISCV_PCREL_HIGH_PART(VALUE, PC) RISCV_CONST_HIGH_PART((VALUE) - (PC))
|
||||
#define RISCV_PCREL_LOW_PART(VALUE, PC) RISCV_CONST_LOW_PART((VALUE) - (PC))
|
||||
|
||||
#define RISCV_JUMP_BITS RISCV_BIGIMM_BITS
|
||||
#define RISCV_JUMP_ALIGN_BITS 1
|
||||
#define RISCV_JUMP_ALIGN (1 << RISCV_JUMP_ALIGN_BITS)
|
||||
#define RISCV_JUMP_REACH ((1ULL << RISCV_JUMP_BITS) * RISCV_JUMP_ALIGN)
|
||||
|
||||
#define RISCV_IMM_BITS 12
|
||||
#define RISCV_BIGIMM_BITS (32 - RISCV_IMM_BITS)
|
||||
#define RISCV_IMM_REACH (1LL << RISCV_IMM_BITS)
|
||||
#define RISCV_BIGIMM_REACH (1LL << RISCV_BIGIMM_BITS)
|
||||
#define RISCV_RVC_IMM_REACH (1LL << 6)
|
||||
#define RISCV_BRANCH_BITS RISCV_IMM_BITS
|
||||
#define RISCV_BRANCH_ALIGN_BITS RISCV_JUMP_ALIGN_BITS
|
||||
#define RISCV_BRANCH_ALIGN (1 << RISCV_BRANCH_ALIGN_BITS)
|
||||
#define RISCV_BRANCH_REACH (RISCV_IMM_REACH * RISCV_BRANCH_ALIGN)
|
||||
|
||||
/* RV fields. */
|
||||
|
||||
#define OP_MASK_OP 0x7f
|
||||
#define OP_SH_OP 0
|
||||
#define OP_MASK_RS2 0x1f
|
||||
#define OP_SH_RS2 20
|
||||
#define OP_MASK_RS1 0x1f
|
||||
#define OP_SH_RS1 15
|
||||
#define OP_MASK_RS3 0x1f
|
||||
#define OP_SH_RS3 27
|
||||
#define OP_MASK_RD 0x1f
|
||||
#define OP_SH_RD 7
|
||||
#define OP_MASK_SHAMT 0x3f
|
||||
#define OP_SH_SHAMT 20
|
||||
#define OP_MASK_SHAMTW 0x1f
|
||||
#define OP_SH_SHAMTW 20
|
||||
#define OP_MASK_RM 0x7
|
||||
#define OP_SH_RM 12
|
||||
#define OP_MASK_PRED 0xf
|
||||
#define OP_SH_PRED 24
|
||||
#define OP_MASK_SUCC 0xf
|
||||
#define OP_SH_SUCC 20
|
||||
#define OP_MASK_AQ 0x1
|
||||
#define OP_SH_AQ 26
|
||||
#define OP_MASK_RL 0x1
|
||||
#define OP_SH_RL 25
|
||||
|
||||
#define OP_MASK_CUSTOM_IMM 0x7f
|
||||
#define OP_SH_CUSTOM_IMM 25
|
||||
#define OP_MASK_CSR 0xfff
|
||||
#define OP_SH_CSR 20
|
||||
|
||||
/* RVC fields. */
|
||||
|
||||
#define OP_MASK_CRS2 0x1f
|
||||
#define OP_SH_CRS2 2
|
||||
#define OP_MASK_CRS1S 0x7
|
||||
#define OP_SH_CRS1S 7
|
||||
#define OP_MASK_CRS2S 0x7
|
||||
#define OP_SH_CRS2S 2
|
||||
|
||||
/* ABI names for selected x-registers. */
|
||||
|
||||
#define X_RA 1
|
||||
#define X_SP 2
|
||||
#define X_GP 3
|
||||
#define X_TP 4
|
||||
#define X_T0 5
|
||||
#define X_T1 6
|
||||
#define X_T2 7
|
||||
#define X_T3 28
|
||||
|
||||
#define NGPR 32
|
||||
#define NFPR 32
|
||||
|
||||
/* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
|
||||
VALUE << SHIFT. VALUE is evaluated exactly once. */
|
||||
#define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
|
||||
(STRUCT) = (((STRUCT) & ~((insn_t)(MASK) << (SHIFT))) \
|
||||
| ((insn_t)((VALUE) & (MASK)) << (SHIFT)))
|
||||
|
||||
/* Extract bits MASK << SHIFT from STRUCT and shift them right
|
||||
SHIFT places. */
|
||||
#define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
|
||||
(((STRUCT) >> (SHIFT)) & (MASK))
|
||||
|
||||
/* Extract the operand given by FIELD from integer INSN. */
|
||||
#define EXTRACT_OPERAND(FIELD, INSN) \
|
||||
EXTRACT_BITS ((INSN), OP_MASK_##FIELD, OP_SH_##FIELD)
|
||||
|
||||
/* This structure holds information for a particular instruction. */
|
||||
|
||||
struct riscv_opcode
|
||||
{
|
||||
/* The name of the instruction. */
|
||||
const char *name;
|
||||
/* The ISA subset name (I, M, A, F, D, Xextension). */
|
||||
const char *subset;
|
||||
/* A string describing the arguments for this instruction. */
|
||||
const char *args;
|
||||
/* The basic opcode for the instruction. When assembling, this
|
||||
opcode is modified by the arguments to produce the actual opcode
|
||||
that is used. If pinfo is INSN_MACRO, then this is 0. */
|
||||
insn_t match;
|
||||
/* If pinfo is not INSN_MACRO, then this is a bit mask for the
|
||||
relevant portions of the opcode when disassembling. If the
|
||||
actual opcode anded with the match field equals the opcode field,
|
||||
then we have found the correct instruction. If pinfo is
|
||||
INSN_MACRO, then this field is the macro identifier. */
|
||||
insn_t mask;
|
||||
/* A function to determine if a word corresponds to this instruction.
|
||||
Usually, this computes ((word & mask) == match). */
|
||||
int (*match_func) (const struct riscv_opcode *op, insn_t word);
|
||||
/* For a macro, this is INSN_MACRO. Otherwise, it is a collection
|
||||
of bits describing the instruction, notably any relevant hazard
|
||||
information. */
|
||||
unsigned long pinfo;
|
||||
};
|
||||
|
||||
/* Instruction is a simple alias (e.g. "mv" for "addi"). */
|
||||
#define INSN_ALIAS 0x00000001
|
||||
/* Instruction is actually a macro. It should be ignored by the
|
||||
disassembler, and requires special treatment by the assembler. */
|
||||
#define INSN_MACRO 0xffffffff
|
||||
|
||||
/* This is a list of macro expanded instructions.
|
||||
|
||||
_I appended means immediate
|
||||
_A appended means address
|
||||
_AB appended means address with base register
|
||||
_D appended means 64 bit floating point constant
|
||||
_S appended means 32 bit floating point constant. */
|
||||
|
||||
enum
|
||||
{
|
||||
M_LA,
|
||||
M_LLA,
|
||||
M_LA_TLS_GD,
|
||||
M_LA_TLS_IE,
|
||||
M_LB,
|
||||
M_LBU,
|
||||
M_LH,
|
||||
M_LHU,
|
||||
M_LW,
|
||||
M_LWU,
|
||||
M_LD,
|
||||
M_SB,
|
||||
M_SH,
|
||||
M_SW,
|
||||
M_SD,
|
||||
M_FLW,
|
||||
M_FLD,
|
||||
M_FSW,
|
||||
M_FSD,
|
||||
M_CALL,
|
||||
M_J,
|
||||
M_LI,
|
||||
M_NUM_MACROS
|
||||
};
|
||||
|
||||
|
||||
extern const char * const riscv_gpr_names_numeric[NGPR];
|
||||
extern const char * const riscv_gpr_names_abi[NGPR];
|
||||
extern const char * const riscv_fpr_names_numeric[NFPR];
|
||||
extern const char * const riscv_fpr_names_abi[NFPR];
|
||||
|
||||
extern const struct riscv_opcode riscv_opcodes[];
|
||||
|
||||
#endif /* _RISCV_H_ */
|
14
ld/ChangeLog
14
ld/ChangeLog
|
@ -1,3 +1,17 @@
|
|||
2016-11-01 Palmer Dabbelt <palmer@dabbelt.com>
|
||||
Andrew Waterman <andrew@sifive.com>
|
||||
|
||||
Add support for RISC-V architecture.
|
||||
* Makefile.am: Add riscv files.
|
||||
* Makefile.in: Regenerate.
|
||||
* NEWS: Mention the support for this target.
|
||||
* configure.tgt: Add riscv entries.
|
||||
* emulparams/elf32lriscv-defs.sh: New file.
|
||||
* emulparams/elf32lriscv.sh: New file.
|
||||
* emulparams/elf64lriscv-defs.sh: New file.
|
||||
* emulparams/elf64lriscv.sh: New file.
|
||||
* emultempl/riscvelf.em: New file.
|
||||
|
||||
2016-10-31 Thomas Preud'homme <thomas.preudhomme@arm.com>
|
||||
|
||||
* ldmain.c (add_archive_element): Initialize input->header.type.
|
||||
|
|
|
@ -278,6 +278,7 @@ ALL_EMULATION_SOURCES = \
|
|||
eelf32ppcsim.c \
|
||||
eelf32ppcvxworks.c \
|
||||
eelf32ppcwindiss.c \
|
||||
eelf32lriscv.c \
|
||||
eelf32rl78.c \
|
||||
eelf32rx.c \
|
||||
eelf32tilegx.c \
|
||||
|
@ -494,6 +495,7 @@ ALL_64_EMULATION_SOURCES = \
|
|||
eelf64btsmip_fbsd.c \
|
||||
eelf64hppa.c \
|
||||
eelf64lppc.c \
|
||||
eelf64lriscv.c \
|
||||
eelf64ltsmip.c \
|
||||
eelf64ltsmip_fbsd.c \
|
||||
eelf64mmix.c \
|
||||
|
@ -1165,6 +1167,11 @@ eelf32lppcsim.c: $(srcdir)/emulparams/elf32lppcsim.sh \
|
|||
$(srcdir)/emultempl/ppc32elf.em ldemul-list.h \
|
||||
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
|
||||
|
||||
eelf32lriscv.c: $(srcdir)/emulparams/elf32lriscv.sh \
|
||||
$(srcdir)/emulparams/elf32lriscv-defs.sh $(ELF_DEPS) \
|
||||
$(srcdir)/emultempl/riscvelf.em $(srcdir)/scripttempl/elf.sc \
|
||||
${GEN_DEPENDS}
|
||||
|
||||
eelf32lsmip.c: $(srcdir)/emulparams/elf32lsmip.sh \
|
||||
$(srcdir)/emulparams/elf32lmip.sh $(srcdir)/emulparams/elf32bmip.sh \
|
||||
$(ELF_DEPS) $(srcdir)/emultempl/mipself.em $(srcdir)/scripttempl/elf.sc \
|
||||
|
@ -1959,6 +1966,12 @@ eelf64lppc.c: $(srcdir)/emulparams/elf64lppc.sh \
|
|||
ldemul-list.h \
|
||||
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
|
||||
|
||||
eelf64lriscv.c: $(srcdir)/emulparams/elf64lriscv.sh \
|
||||
$(srcdir)/emulparams/elf64lriscv-defs.sh \
|
||||
$(srcdir)/emulparams/elf32lriscv-defs.sh $(ELF_DEPS) \
|
||||
$(srcdir)/emultempl/riscvelf.em $(srcdir)/scripttempl/elf.sc \
|
||||
${GEN_DEPENDS}
|
||||
|
||||
eelf64ltsmip.c: $(srcdir)/emulparams/elf64ltsmip.sh \
|
||||
$(srcdir)/emulparams/elf64btsmip.sh $(srcdir)/emulparams/elf64bmip-defs.sh \
|
||||
$(srcdir)/emulparams/elf32bmipn32-defs.sh $(ELF_DEPS) \
|
||||
|
|
|
@ -647,6 +647,7 @@ ALL_EMULATION_SOURCES = \
|
|||
eelf32ppcsim.c \
|
||||
eelf32ppcvxworks.c \
|
||||
eelf32ppcwindiss.c \
|
||||
eelf32lriscv.c \
|
||||
eelf32rl78.c \
|
||||
eelf32rx.c \
|
||||
eelf32tilegx.c \
|
||||
|
@ -862,6 +863,7 @@ ALL_64_EMULATION_SOURCES = \
|
|||
eelf64btsmip_fbsd.c \
|
||||
eelf64hppa.c \
|
||||
eelf64lppc.c \
|
||||
eelf64lriscv.c \
|
||||
eelf64ltsmip.c \
|
||||
eelf64ltsmip_fbsd.c \
|
||||
eelf64mmix.c \
|
||||
|
@ -1282,6 +1284,7 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32lppcsim.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32lr5900.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32lr5900n32.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32lriscv.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32lsmip.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32ltsmip.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32ltsmip_fbsd.Po@am__quote@
|
||||
|
@ -1335,6 +1338,7 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64btsmip_fbsd.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64hppa.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64lppc.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64lriscv.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64ltsmip.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64ltsmip_fbsd.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64mmix.Po@am__quote@
|
||||
|
@ -2754,6 +2758,11 @@ eelf32lppcsim.c: $(srcdir)/emulparams/elf32lppcsim.sh \
|
|||
$(srcdir)/emultempl/ppc32elf.em ldemul-list.h \
|
||||
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
|
||||
|
||||
eelf32lriscv.c: $(srcdir)/emulparams/elf32lriscv.sh \
|
||||
$(srcdir)/emulparams/elf32lriscv-defs.sh $(ELF_DEPS) \
|
||||
$(srcdir)/emultempl/riscvelf.em $(srcdir)/scripttempl/elf.sc \
|
||||
${GEN_DEPENDS}
|
||||
|
||||
eelf32lsmip.c: $(srcdir)/emulparams/elf32lsmip.sh \
|
||||
$(srcdir)/emulparams/elf32lmip.sh $(srcdir)/emulparams/elf32bmip.sh \
|
||||
$(ELF_DEPS) $(srcdir)/emultempl/mipself.em $(srcdir)/scripttempl/elf.sc \
|
||||
|
@ -3548,6 +3557,12 @@ eelf64lppc.c: $(srcdir)/emulparams/elf64lppc.sh \
|
|||
ldemul-list.h \
|
||||
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
|
||||
|
||||
eelf64lriscv.c: $(srcdir)/emulparams/elf64lriscv.sh \
|
||||
$(srcdir)/emulparams/elf64lriscv-defs.sh \
|
||||
$(srcdir)/emulparams/elf32lriscv-defs.sh $(ELF_DEPS) \
|
||||
$(srcdir)/emultempl/riscvelf.em $(srcdir)/scripttempl/elf.sc \
|
||||
${GEN_DEPENDS}
|
||||
|
||||
eelf64ltsmip.c: $(srcdir)/emulparams/elf64ltsmip.sh \
|
||||
$(srcdir)/emulparams/elf64btsmip.sh $(srcdir)/emulparams/elf64bmip-defs.sh \
|
||||
$(srcdir)/emulparams/elf32bmipn32-defs.sh $(ELF_DEPS) \
|
||||
|
|
2
ld/NEWS
2
ld/NEWS
|
@ -1,6 +1,6 @@
|
|||
-*- text -*-
|
||||
|
||||
Changes in 2.28:
|
||||
* Add support for the RISC-V architecture.
|
||||
|
||||
* The command line option --no-eh-frame-hdr can now be used in ELF based
|
||||
linkers to disable the automatic generation of .eh_frame_hdr sections.
|
||||
|
|
|
@ -679,6 +679,12 @@ powerpc-*-aix*) targ_emul=aixppc ;;
|
|||
powerpc-*-beos*) targ_emul=aixppc ;;
|
||||
powerpc-*-windiss*) targ_emul=elf32ppcwindiss ;;
|
||||
powerpc-*-lynxos*) targ_emul=ppclynx ;;
|
||||
riscv32*-*-*) targ_emul=elf32lriscv
|
||||
targ_extra_emuls="elf64lriscv"
|
||||
targ_extra_libpath=$targ_extra_emuls ;;
|
||||
riscv64*-*-*) targ_emul=elf64lriscv
|
||||
targ_extra_emuls="elf32lriscv"
|
||||
targ_extra_libpath=$targ_extra_emuls ;;
|
||||
rs6000-*-aix[5-9]*) targ_emul=aix5rs6 ;;
|
||||
rs6000-*-aix*) targ_emul=aixrs6
|
||||
;;
|
||||
|
|
42
ld/emulparams/elf32lriscv-defs.sh
Normal file
42
ld/emulparams/elf32lriscv-defs.sh
Normal file
|
@ -0,0 +1,42 @@
|
|||
# This is an ELF platform.
|
||||
SCRIPT_NAME=elf
|
||||
ARCH=riscv
|
||||
NO_REL_RELOCS=yes
|
||||
|
||||
TEMPLATE_NAME=elf32
|
||||
EXTRA_EM_FILE=riscvelf
|
||||
|
||||
ELFSIZE=32
|
||||
|
||||
if test `echo "$host" | sed -e s/64//` = `echo "$target" | sed -e s/64//`; then
|
||||
case " $EMULATION_LIBPATH " in
|
||||
*" ${EMULATION_NAME} "*)
|
||||
NATIVE=yes
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
GENERATE_SHLIB_SCRIPT=yes
|
||||
GENERATE_PIE_SCRIPT=yes
|
||||
|
||||
TEXT_START_ADDR=0x10000
|
||||
MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
|
||||
COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
|
||||
|
||||
SDATA_START_SYMBOLS="_gp = . + 0x800;
|
||||
*(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata .srodata.*)"
|
||||
|
||||
# Place the data section before text section. This enables more compact
|
||||
# global variable access for RVC code via linker relaxation.
|
||||
INITIAL_READONLY_SECTIONS="
|
||||
.data : { *(.data) *(.data.*) *(.gnu.linkonce.d.*) }
|
||||
.rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r.*) }
|
||||
.srodata : { ${SDATA_START_SYMBOLS} }
|
||||
.sdata : { *(.sdata .sdata.* .gnu.linkonce.s.*) }
|
||||
.sbss : { *(.dynsbss) *(.sbss .sbss.* .gnu.linkonce.sb.*) }
|
||||
.bss : { *(.dynbss) *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) }
|
||||
. = ALIGN(${SEGMENT_SIZE}) + (. & (${MAXPAGESIZE} - 1));"
|
||||
INITIAL_READONLY_SECTIONS=".interp : { *(.interp) } ${CREATE_PIE-${INITIAL_READONLY_SECTIONS}}"
|
||||
INITIAL_READONLY_SECTIONS="${RELOCATING+${CREATE_SHLIB-${INITIAL_READONLY_SECTIONS}}}"
|
||||
|
||||
SDATA_START_SYMBOLS="${CREATE_PIE+${SDATA_START_SYMBOLS}}"
|
2
ld/emulparams/elf32lriscv.sh
Normal file
2
ld/emulparams/elf32lriscv.sh
Normal file
|
@ -0,0 +1,2 @@
|
|||
. ${srcdir}/emulparams/elf32lriscv-defs.sh
|
||||
OUTPUT_FORMAT="elf32-littleriscv"
|
13
ld/emulparams/elf64lriscv-defs.sh
Normal file
13
ld/emulparams/elf64lriscv-defs.sh
Normal file
|
@ -0,0 +1,13 @@
|
|||
. ${srcdir}/emulparams/elf32lriscv-defs.sh
|
||||
ELFSIZE=64
|
||||
|
||||
# Look for 64 bit target libraries in /lib64, /usr/lib64 etc., first
|
||||
# on Linux.
|
||||
case "$target" in
|
||||
riscv64*-linux*)
|
||||
case "$EMULATION_NAME" in
|
||||
*64*)
|
||||
LIBPATH_SUFFIX=64 ;;
|
||||
esac
|
||||
;;
|
||||
esac
|
2
ld/emulparams/elf64lriscv.sh
Normal file
2
ld/emulparams/elf64lriscv.sh
Normal file
|
@ -0,0 +1,2 @@
|
|||
. ${srcdir}/emulparams/elf64lriscv-defs.sh
|
||||
OUTPUT_FORMAT="elf64-littleriscv"
|
68
ld/emultempl/riscvelf.em
Normal file
68
ld/emultempl/riscvelf.em
Normal file
|
@ -0,0 +1,68 @@
|
|||
# This shell script emits a C file. -*- C -*-
|
||||
# Copyright 2004, 2006, 2007, 2008, 2016 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.
|
||||
|
||||
fragment <<EOF
|
||||
|
||||
#include "ldmain.h"
|
||||
#include "ldctor.h"
|
||||
#include "elf/riscv.h"
|
||||
#include "elfxx-riscv.h"
|
||||
|
||||
static void
|
||||
riscv_elf_before_allocation (void)
|
||||
{
|
||||
gld${EMULATION_NAME}_before_allocation ();
|
||||
|
||||
if (link_info.discard == discard_sec_merge)
|
||||
link_info.discard = discard_l;
|
||||
|
||||
/* We always need at least some relaxation to handle code alignment. */
|
||||
if (RELAXATION_DISABLED_BY_USER)
|
||||
TARGET_ENABLE_RELAXATION;
|
||||
else
|
||||
ENABLE_RELAXATION;
|
||||
|
||||
link_info.relax_pass = 2;
|
||||
}
|
||||
|
||||
static void
|
||||
gld${EMULATION_NAME}_after_allocation (void)
|
||||
{
|
||||
int need_layout = 0;
|
||||
|
||||
/* Don't attempt to discard unused .eh_frame sections until the final link,
|
||||
as we can't reliably tell if they're used until after relaxation. */
|
||||
if (!bfd_link_relocatable (&link_info))
|
||||
{
|
||||
need_layout = bfd_elf_discard_info (link_info.output_bfd, &link_info);
|
||||
if (need_layout < 0)
|
||||
{
|
||||
einfo ("%X%P: .eh_frame/.stab edit: %E\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
gld${EMULATION_NAME}_map_segments (need_layout);
|
||||
}
|
||||
|
||||
EOF
|
||||
|
||||
LDEMUL_BEFORE_ALLOCATION=riscv_elf_before_allocation
|
||||
LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
|
|
@ -1,3 +1,14 @@
|
|||
2016-11-01 Palmer Dabbelt <palmer@dabbelt.com>
|
||||
Andrew Waterman <andrew@sifive.com>
|
||||
|
||||
Add support for RISC-V architecture.
|
||||
* configure.ac: Add entry for bfd_riscv_arch.
|
||||
* configure: Regenerate.
|
||||
* disassemble.c (disassembler): Add support for riscv.
|
||||
(disassembler_usage): Likewise.
|
||||
* riscv-dis.c: New file.
|
||||
* riscv-opc.c: New file.
|
||||
|
||||
2016-10-21 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* i386-dis.c (PREFIX_RM_0_0FAE_REG_7): Removed.
|
||||
|
|
1
opcodes/configure
vendored
1
opcodes/configure
vendored
|
@ -12685,6 +12685,7 @@ if test x${all_targets} = xfalse ; then
|
|||
bfd_powerpc_64_arch) ta="$ta ppc-dis.lo ppc-opc.lo" ;;
|
||||
bfd_pyramid_arch) ;;
|
||||
bfd_romp_arch) ;;
|
||||
bfd_riscv_arch) ta="$ta riscv-dis.lo riscv-opc.lo" ;;
|
||||
bfd_rs6000_arch) ta="$ta ppc-dis.lo ppc-opc.lo" ;;
|
||||
bfd_rl78_arch) ta="$ta rl78-dis.lo rl78-decode.lo";;
|
||||
bfd_rx_arch) ta="$ta rx-dis.lo rx-decode.lo";;
|
||||
|
|
|
@ -309,6 +309,7 @@ if test x${all_targets} = xfalse ; then
|
|||
bfd_powerpc_64_arch) ta="$ta ppc-dis.lo ppc-opc.lo" ;;
|
||||
bfd_pyramid_arch) ;;
|
||||
bfd_romp_arch) ;;
|
||||
bfd_riscv_arch) ta="$ta riscv-dis.lo riscv-opc.lo" ;;
|
||||
bfd_rs6000_arch) ta="$ta ppc-dis.lo ppc-opc.lo" ;;
|
||||
bfd_rl78_arch) ta="$ta rl78-dis.lo rl78-decode.lo";;
|
||||
bfd_rx_arch) ta="$ta rx-dis.lo rx-decode.lo";;
|
||||
|
|
|
@ -375,6 +375,11 @@ disassembler (bfd *abfd)
|
|||
disassemble = print_insn_little_powerpc;
|
||||
break;
|
||||
#endif
|
||||
#ifdef ARCH_riscv
|
||||
case bfd_arch_riscv:
|
||||
disassemble = print_insn_riscv;
|
||||
break;
|
||||
#endif
|
||||
#ifdef ARCH_rs6000
|
||||
case bfd_arch_rs6000:
|
||||
if (bfd_get_mach (abfd) == bfd_mach_ppc_620)
|
||||
|
@ -559,6 +564,9 @@ disassembler_usage (FILE *stream ATTRIBUTE_UNUSED)
|
|||
#ifdef ARCH_powerpc
|
||||
print_ppc_disassembler_options (stream);
|
||||
#endif
|
||||
#ifdef ARCH_riscv
|
||||
print_riscv_disassembler_options (stream);
|
||||
#endif
|
||||
#ifdef ARCH_i386
|
||||
print_i386_disassembler_options (stream);
|
||||
#endif
|
||||
|
|
502
opcodes/riscv-dis.c
Normal file
502
opcodes/riscv-dis.c
Normal file
|
@ -0,0 +1,502 @@
|
|||
/* RISC-V disassembler
|
||||
Copyright 2011-2016 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Andrew Waterman (andrew@sifive.com).
|
||||
Based on MIPS target.
|
||||
|
||||
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; see the file COPYING3. If not,
|
||||
see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "dis-asm.h"
|
||||
#include "libiberty.h"
|
||||
#include "opcode/riscv.h"
|
||||
#include "opintl.h"
|
||||
#include "elf-bfd.h"
|
||||
#include "elf/riscv.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <ctype.h>
|
||||
|
||||
struct riscv_private_data
|
||||
{
|
||||
bfd_vma gp;
|
||||
bfd_vma print_addr;
|
||||
bfd_vma hi_addr[OP_MASK_RD + 1];
|
||||
};
|
||||
|
||||
static const char * const *riscv_gpr_names;
|
||||
static const char * const *riscv_fpr_names;
|
||||
|
||||
/* Other options. */
|
||||
static int no_aliases; /* If set disassemble as most general inst. */
|
||||
|
||||
static void
|
||||
set_default_riscv_dis_options (void)
|
||||
{
|
||||
riscv_gpr_names = riscv_gpr_names_abi;
|
||||
riscv_fpr_names = riscv_fpr_names_abi;
|
||||
no_aliases = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
parse_riscv_dis_option (const char *option)
|
||||
{
|
||||
if (strcmp (option, "no-aliases") == 0)
|
||||
no_aliases = 1;
|
||||
else if (strcmp (option, "numeric") == 0)
|
||||
{
|
||||
riscv_gpr_names = riscv_gpr_names_numeric;
|
||||
riscv_fpr_names = riscv_fpr_names_numeric;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Invalid option. */
|
||||
fprintf (stderr, _("Unrecognized disassembler option: %s\n"), option);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
parse_riscv_dis_options (const char *opts_in)
|
||||
{
|
||||
char *opts = xstrdup (opts_in), *opt = opts, *opt_end = opts;
|
||||
|
||||
set_default_riscv_dis_options ();
|
||||
|
||||
for ( ; opt_end != NULL; opt = opt_end + 1)
|
||||
{
|
||||
if ((opt_end = strchr (opt, ',')) != NULL)
|
||||
*opt_end = 0;
|
||||
parse_riscv_dis_option (opt);
|
||||
}
|
||||
|
||||
free (opts);
|
||||
}
|
||||
|
||||
/* Print one argument from an array. */
|
||||
|
||||
static void
|
||||
arg_print (struct disassemble_info *info, unsigned long val,
|
||||
const char* const* array, size_t size)
|
||||
{
|
||||
const char *s = val >= size || array[val] == NULL ? "unknown" : array[val];
|
||||
(*info->fprintf_func) (info->stream, "%s", s);
|
||||
}
|
||||
|
||||
static void
|
||||
maybe_print_address (struct riscv_private_data *pd, int base_reg, int offset)
|
||||
{
|
||||
if (pd->hi_addr[base_reg] != (bfd_vma)-1)
|
||||
{
|
||||
pd->print_addr = pd->hi_addr[base_reg] + offset;
|
||||
pd->hi_addr[base_reg] = -1;
|
||||
}
|
||||
else if (base_reg == X_GP && pd->gp != (bfd_vma)-1)
|
||||
pd->print_addr = pd->gp + offset;
|
||||
else if (base_reg == X_TP || base_reg == 0)
|
||||
pd->print_addr = offset;
|
||||
}
|
||||
|
||||
/* Print insn arguments for 32/64-bit code. */
|
||||
|
||||
static void
|
||||
print_insn_args (const char *d, insn_t l, bfd_vma pc, disassemble_info *info)
|
||||
{
|
||||
struct riscv_private_data *pd = info->private_data;
|
||||
int rs1 = (l >> OP_SH_RS1) & OP_MASK_RS1;
|
||||
int rd = (l >> OP_SH_RD) & OP_MASK_RD;
|
||||
fprintf_ftype print = info->fprintf_func;
|
||||
|
||||
if (*d != '\0')
|
||||
print (info->stream, "\t");
|
||||
|
||||
for (; *d != '\0'; d++)
|
||||
{
|
||||
switch (*d)
|
||||
{
|
||||
case 'C': /* RVC */
|
||||
switch (*++d)
|
||||
{
|
||||
case 's': /* RS1 x8-x15 */
|
||||
case 'w': /* RS1 x8-x15 */
|
||||
print (info->stream, "%s",
|
||||
riscv_gpr_names[EXTRACT_OPERAND (CRS1S, l) + 8]);
|
||||
break;
|
||||
case 't': /* RS2 x8-x15 */
|
||||
case 'x': /* RS2 x8-x15 */
|
||||
print (info->stream, "%s",
|
||||
riscv_gpr_names[EXTRACT_OPERAND (CRS2S, l) + 8]);
|
||||
break;
|
||||
case 'U': /* RS1, constrained to equal RD */
|
||||
print (info->stream, "%s", riscv_gpr_names[rd]);
|
||||
break;
|
||||
case 'c': /* RS1, constrained to equal sp */
|
||||
print (info->stream, "%s", riscv_gpr_names[X_SP]);
|
||||
break;
|
||||
case 'V': /* RS2 */
|
||||
print (info->stream, "%s",
|
||||
riscv_gpr_names[EXTRACT_OPERAND (CRS2, l)]);
|
||||
break;
|
||||
case 'i':
|
||||
print (info->stream, "%d", (int)EXTRACT_RVC_SIMM3 (l));
|
||||
break;
|
||||
case 'j':
|
||||
print (info->stream, "%d", (int)EXTRACT_RVC_IMM (l));
|
||||
break;
|
||||
case 'k':
|
||||
print (info->stream, "%d", (int)EXTRACT_RVC_LW_IMM (l));
|
||||
break;
|
||||
case 'l':
|
||||
print (info->stream, "%d", (int)EXTRACT_RVC_LD_IMM (l));
|
||||
break;
|
||||
case 'm':
|
||||
print (info->stream, "%d", (int)EXTRACT_RVC_LWSP_IMM (l));
|
||||
break;
|
||||
case 'n':
|
||||
print (info->stream, "%d", (int)EXTRACT_RVC_LDSP_IMM (l));
|
||||
break;
|
||||
case 'K':
|
||||
print (info->stream, "%d", (int)EXTRACT_RVC_ADDI4SPN_IMM (l));
|
||||
break;
|
||||
case 'L':
|
||||
print (info->stream, "%d", (int)EXTRACT_RVC_ADDI16SP_IMM (l));
|
||||
break;
|
||||
case 'M':
|
||||
print (info->stream, "%d", (int)EXTRACT_RVC_SWSP_IMM (l));
|
||||
break;
|
||||
case 'N':
|
||||
print (info->stream, "%d", (int)EXTRACT_RVC_SDSP_IMM (l));
|
||||
break;
|
||||
case 'p':
|
||||
info->target = EXTRACT_RVC_B_IMM (l) + pc;
|
||||
(*info->print_address_func) (info->target, info);
|
||||
break;
|
||||
case 'a':
|
||||
info->target = EXTRACT_RVC_J_IMM (l) + pc;
|
||||
(*info->print_address_func) (info->target, info);
|
||||
break;
|
||||
case 'u':
|
||||
print (info->stream, "0x%x",
|
||||
(int)(EXTRACT_RVC_IMM (l) & (RISCV_BIGIMM_REACH-1)));
|
||||
break;
|
||||
case '>':
|
||||
print (info->stream, "0x%x", (int)EXTRACT_RVC_IMM (l) & 0x3f);
|
||||
break;
|
||||
case '<':
|
||||
print (info->stream, "0x%x", (int)EXTRACT_RVC_IMM (l) & 0x1f);
|
||||
break;
|
||||
case 'T': /* floating-point RS2 */
|
||||
print (info->stream, "%s",
|
||||
riscv_fpr_names[EXTRACT_OPERAND (CRS2, l)]);
|
||||
break;
|
||||
case 'D': /* floating-point RS2 x8-x15 */
|
||||
print (info->stream, "%s",
|
||||
riscv_fpr_names[EXTRACT_OPERAND (CRS2S, l) + 8]);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case ',':
|
||||
case '(':
|
||||
case ')':
|
||||
case '[':
|
||||
case ']':
|
||||
print (info->stream, "%c", *d);
|
||||
break;
|
||||
|
||||
case '0':
|
||||
/* Only print constant 0 if it is the last argument */
|
||||
if (!d[1])
|
||||
print (info->stream, "0");
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
case 's':
|
||||
print (info->stream, "%s", riscv_gpr_names[rs1]);
|
||||
break;
|
||||
|
||||
case 't':
|
||||
print (info->stream, "%s",
|
||||
riscv_gpr_names[EXTRACT_OPERAND (RS2, l)]);
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
print (info->stream, "0x%x",
|
||||
(unsigned)EXTRACT_UTYPE_IMM (l) >> RISCV_IMM_BITS);
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
arg_print (info, EXTRACT_OPERAND (RM, l),
|
||||
riscv_rm, ARRAY_SIZE (riscv_rm));
|
||||
break;
|
||||
|
||||
case 'P':
|
||||
arg_print (info, EXTRACT_OPERAND (PRED, l),
|
||||
riscv_pred_succ, ARRAY_SIZE (riscv_pred_succ));
|
||||
break;
|
||||
|
||||
case 'Q':
|
||||
arg_print (info, EXTRACT_OPERAND (SUCC, l),
|
||||
riscv_pred_succ, ARRAY_SIZE (riscv_pred_succ));
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
maybe_print_address (pd, rs1, EXTRACT_ITYPE_IMM (l));
|
||||
case 'j':
|
||||
if (((l & MASK_ADDI) == MATCH_ADDI && rs1 != 0)
|
||||
|| (l & MASK_JALR) == MATCH_JALR)
|
||||
maybe_print_address (pd, rs1, EXTRACT_ITYPE_IMM (l));
|
||||
print (info->stream, "%d", (int)EXTRACT_ITYPE_IMM (l));
|
||||
break;
|
||||
|
||||
case 'q':
|
||||
maybe_print_address (pd, rs1, EXTRACT_STYPE_IMM (l));
|
||||
print (info->stream, "%d", (int)EXTRACT_STYPE_IMM (l));
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
info->target = EXTRACT_UJTYPE_IMM (l) + pc;
|
||||
(*info->print_address_func) (info->target, info);
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
info->target = EXTRACT_SBTYPE_IMM (l) + pc;
|
||||
(*info->print_address_func) (info->target, info);
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
if ((l & MASK_AUIPC) == MATCH_AUIPC)
|
||||
pd->hi_addr[rd] = pc + EXTRACT_UTYPE_IMM (l);
|
||||
else if ((l & MASK_LUI) == MATCH_LUI)
|
||||
pd->hi_addr[rd] = EXTRACT_UTYPE_IMM (l);
|
||||
else if ((l & MASK_C_LUI) == MATCH_C_LUI)
|
||||
pd->hi_addr[rd] = EXTRACT_RVC_LUI_IMM (l);
|
||||
print (info->stream, "%s", riscv_gpr_names[rd]);
|
||||
break;
|
||||
|
||||
case 'z':
|
||||
print (info->stream, "%s", riscv_gpr_names[0]);
|
||||
break;
|
||||
|
||||
case '>':
|
||||
print (info->stream, "0x%x", (int)EXTRACT_OPERAND (SHAMT, l));
|
||||
break;
|
||||
|
||||
case '<':
|
||||
print (info->stream, "0x%x", (int)EXTRACT_OPERAND (SHAMTW, l));
|
||||
break;
|
||||
|
||||
case 'S':
|
||||
case 'U':
|
||||
print (info->stream, "%s", riscv_fpr_names[rs1]);
|
||||
break;
|
||||
|
||||
case 'T':
|
||||
print (info->stream, "%s", riscv_fpr_names[EXTRACT_OPERAND (RS2, l)]);
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
print (info->stream, "%s", riscv_fpr_names[rd]);
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
print (info->stream, "%s", riscv_fpr_names[EXTRACT_OPERAND (RS3, l)]);
|
||||
break;
|
||||
|
||||
case 'E':
|
||||
{
|
||||
const char* csr_name = NULL;
|
||||
unsigned int csr = EXTRACT_OPERAND (CSR, l);
|
||||
switch (csr)
|
||||
{
|
||||
#define DECLARE_CSR(name, num) case num: csr_name = #name; break;
|
||||
#include "opcode/riscv-opc.h"
|
||||
#undef DECLARE_CSR
|
||||
}
|
||||
if (csr_name)
|
||||
print (info->stream, "%s", csr_name);
|
||||
else
|
||||
print (info->stream, "0x%x", csr);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'Z':
|
||||
print (info->stream, "%d", rs1);
|
||||
break;
|
||||
|
||||
default:
|
||||
/* xgettext:c-format */
|
||||
print (info->stream, _("# internal error, undefined modifier (%c)"),
|
||||
*d);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Print the RISC-V instruction at address MEMADDR in debugged memory,
|
||||
on using INFO. Returns length of the instruction, in bytes.
|
||||
BIGENDIAN must be 1 if this is big-endian code, 0 if
|
||||
this is little-endian code. */
|
||||
|
||||
static int
|
||||
riscv_disassemble_insn (bfd_vma memaddr, insn_t word, disassemble_info *info)
|
||||
{
|
||||
const struct riscv_opcode *op;
|
||||
static bfd_boolean init = 0;
|
||||
static const struct riscv_opcode *riscv_hash[OP_MASK_OP + 1];
|
||||
struct riscv_private_data *pd;
|
||||
int insnlen;
|
||||
|
||||
#define OP_HASH_IDX(i) ((i) & (riscv_insn_length (i) == 2 ? 0x3 : OP_MASK_OP))
|
||||
|
||||
/* Build a hash table to shorten the search time. */
|
||||
if (! init)
|
||||
{
|
||||
for (op = riscv_opcodes; op->name; op++)
|
||||
if (!riscv_hash[OP_HASH_IDX (op->match)])
|
||||
riscv_hash[OP_HASH_IDX (op->match)] = op;
|
||||
|
||||
init = 1;
|
||||
}
|
||||
|
||||
if (info->private_data == NULL)
|
||||
{
|
||||
int i;
|
||||
|
||||
pd = info->private_data = xcalloc (1, sizeof (struct riscv_private_data));
|
||||
pd->gp = -1;
|
||||
pd->print_addr = -1;
|
||||
for (i = 0; i < (int)ARRAY_SIZE (pd->hi_addr); i++)
|
||||
pd->hi_addr[i] = -1;
|
||||
|
||||
for (i = 0; i < info->symtab_size; i++)
|
||||
if (strcmp (bfd_asymbol_name (info->symtab[i]), "_gp") == 0)
|
||||
pd->gp = bfd_asymbol_value (info->symtab[i]);
|
||||
}
|
||||
else
|
||||
pd = info->private_data;
|
||||
|
||||
insnlen = riscv_insn_length (word);
|
||||
|
||||
info->bytes_per_chunk = insnlen % 4 == 0 ? 4 : 2;
|
||||
info->bytes_per_line = 8;
|
||||
info->display_endian = info->endian;
|
||||
info->insn_info_valid = 1;
|
||||
info->branch_delay_insns = 0;
|
||||
info->data_size = 0;
|
||||
info->insn_type = dis_nonbranch;
|
||||
info->target = 0;
|
||||
info->target2 = 0;
|
||||
|
||||
op = riscv_hash[OP_HASH_IDX (word)];
|
||||
if (op != NULL)
|
||||
{
|
||||
int xlen = 0;
|
||||
|
||||
/* The incoming section might not always be complete. */
|
||||
if (info->section != NULL)
|
||||
{
|
||||
Elf_Internal_Ehdr *ehdr = elf_elfheader (info->section->owner);
|
||||
xlen = ehdr->e_ident[EI_CLASS] == ELFCLASS64 ? 64 : 32;
|
||||
}
|
||||
|
||||
for (; op->name; op++)
|
||||
{
|
||||
/* Does the opcode match? */
|
||||
if (! (op->match_func) (op, word))
|
||||
continue;
|
||||
/* Is this a pseudo-instruction and may we print it as such? */
|
||||
if (no_aliases && (op->pinfo & INSN_ALIAS))
|
||||
continue;
|
||||
/* Is this instruction restricted to a certain value of XLEN? */
|
||||
if (isdigit (op->subset[0]) && atoi (op->subset) != xlen)
|
||||
continue;
|
||||
|
||||
/* It's a match. */
|
||||
(*info->fprintf_func) (info->stream, "%s", op->name);
|
||||
print_insn_args (op->args, word, memaddr, info);
|
||||
|
||||
/* Try to disassemble multi-instruction addressing sequences. */
|
||||
if (pd->print_addr != (bfd_vma)-1)
|
||||
{
|
||||
info->target = pd->print_addr;
|
||||
(*info->fprintf_func) (info->stream, " # ");
|
||||
(*info->print_address_func) (info->target, info);
|
||||
pd->print_addr = -1;
|
||||
}
|
||||
|
||||
return insnlen;
|
||||
}
|
||||
}
|
||||
|
||||
/* We did not find a match, so just print the instruction bits. */
|
||||
info->insn_type = dis_noninsn;
|
||||
(*info->fprintf_func) (info->stream, "0x%llx", (unsigned long long)word);
|
||||
return insnlen;
|
||||
}
|
||||
|
||||
int
|
||||
print_insn_riscv (bfd_vma memaddr, struct disassemble_info *info)
|
||||
{
|
||||
bfd_byte packet[2];
|
||||
insn_t insn = 0;
|
||||
bfd_vma n;
|
||||
int status;
|
||||
|
||||
if (info->disassembler_options != NULL)
|
||||
{
|
||||
parse_riscv_dis_options (info->disassembler_options);
|
||||
/* Avoid repeatedly parsing the options. */
|
||||
info->disassembler_options = NULL;
|
||||
}
|
||||
else if (riscv_gpr_names == NULL)
|
||||
set_default_riscv_dis_options ();
|
||||
|
||||
/* Instructions are a sequence of 2-byte packets in little-endian order. */
|
||||
for (n = 0; n < sizeof (insn) && n < riscv_insn_length (insn); n += 2)
|
||||
{
|
||||
status = (*info->read_memory_func) (memaddr + n, packet, 2, info);
|
||||
if (status != 0)
|
||||
{
|
||||
/* Don't fail just because we fell off the end. */
|
||||
if (n > 0)
|
||||
break;
|
||||
(*info->memory_error_func) (status, memaddr, info);
|
||||
return status;
|
||||
}
|
||||
|
||||
insn |= ((insn_t) bfd_getl16 (packet)) << (8 * n);
|
||||
}
|
||||
|
||||
return riscv_disassemble_insn (memaddr, insn, info);
|
||||
}
|
||||
|
||||
void
|
||||
print_riscv_disassembler_options (FILE *stream)
|
||||
{
|
||||
fprintf (stream, _("\n\
|
||||
The following RISC-V-specific disassembler options are supported for use\n\
|
||||
with the -M switch (multiple options should be separated by commas):\n"));
|
||||
|
||||
fprintf (stream, _("\n\
|
||||
numeric Print numeric reigster names, rather than ABI names.\n"));
|
||||
|
||||
fprintf (stream, _("\n\
|
||||
no-aliases Disassemble only into canonical instructions, rather\n\
|
||||
than into pseudoinstructions.\n"));
|
||||
|
||||
fprintf (stream, _("\n"));
|
||||
}
|
624
opcodes/riscv-opc.c
Normal file
624
opcodes/riscv-opc.c
Normal file
|
@ -0,0 +1,624 @@
|
|||
/* RISC-V opcode list
|
||||
Copyright 2011-2016 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by Andrew Waterman (andrew@sifive.com).
|
||||
Based on MIPS target.
|
||||
|
||||
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; see the file COPYING3. If not,
|
||||
see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "opcode/riscv.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/* Register names used by gas and objdump. */
|
||||
|
||||
const char * const riscv_gpr_names_numeric[NGPR] =
|
||||
{
|
||||
"x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
|
||||
"x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
|
||||
"x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
|
||||
"x24", "x25", "x26", "x27", "x28", "x29", "x30", "x31"
|
||||
};
|
||||
|
||||
const char * const riscv_gpr_names_abi[NGPR] =
|
||||
{
|
||||
"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2",
|
||||
"s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5",
|
||||
"a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7",
|
||||
"s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6"
|
||||
};
|
||||
|
||||
const char * const riscv_fpr_names_numeric[NFPR] =
|
||||
{
|
||||
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
|
||||
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
|
||||
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
|
||||
"f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"
|
||||
};
|
||||
|
||||
const char * const riscv_fpr_names_abi[NFPR] =
|
||||
{
|
||||
"ft0", "ft1", "ft2", "ft3", "ft4", "ft5", "ft6", "ft7",
|
||||
"fs0", "fs1", "fa0", "fa1", "fa2", "fa3", "fa4", "fa5",
|
||||
"fa6", "fa7", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7",
|
||||
"fs8", "fs9", "fs10", "fs11", "ft8", "ft9", "ft10", "ft11"
|
||||
};
|
||||
|
||||
/* The order of overloaded instructions matters. Label arguments and
|
||||
register arguments look the same. Instructions that can have either
|
||||
for arguments must apear in the correct order in this table for the
|
||||
assembler to pick the right one. In other words, entries with
|
||||
immediate operands must apear after the same instruction with
|
||||
registers.
|
||||
|
||||
Because of the lookup algorithm used, entries with the same opcode
|
||||
name must be contiguous. */
|
||||
|
||||
#define MASK_RS1 (OP_MASK_RS1 << OP_SH_RS1)
|
||||
#define MASK_RS2 (OP_MASK_RS2 << OP_SH_RS2)
|
||||
#define MASK_RD (OP_MASK_RD << OP_SH_RD)
|
||||
#define MASK_CRS2 (OP_MASK_CRS2 << OP_SH_CRS2)
|
||||
#define MASK_IMM ENCODE_ITYPE_IMM(-1U)
|
||||
#define MASK_RVC_IMM ENCODE_RVC_IMM(-1U)
|
||||
#define MASK_UIMM ENCODE_UTYPE_IMM(-1U)
|
||||
#define MASK_RM (OP_MASK_RM << OP_SH_RM)
|
||||
#define MASK_PRED (OP_MASK_PRED << OP_SH_PRED)
|
||||
#define MASK_SUCC (OP_MASK_SUCC << OP_SH_SUCC)
|
||||
#define MASK_AQ (OP_MASK_AQ << OP_SH_AQ)
|
||||
#define MASK_RL (OP_MASK_RL << OP_SH_RL)
|
||||
#define MASK_AQRL (MASK_AQ | MASK_RL)
|
||||
|
||||
static int
|
||||
match_opcode (const struct riscv_opcode *op, insn_t insn)
|
||||
{
|
||||
return ((insn ^ op->match) & op->mask) == 0;
|
||||
}
|
||||
|
||||
static int
|
||||
match_never (const struct riscv_opcode *op ATTRIBUTE_UNUSED,
|
||||
insn_t insn ATTRIBUTE_UNUSED)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
match_rs1_eq_rs2 (const struct riscv_opcode *op, insn_t insn)
|
||||
{
|
||||
int rs1 = (insn & MASK_RS1) >> OP_SH_RS1;
|
||||
int rs2 = (insn & MASK_RS2) >> OP_SH_RS2;
|
||||
return match_opcode (op, insn) && rs1 == rs2;
|
||||
}
|
||||
|
||||
static int
|
||||
match_rd_nonzero (const struct riscv_opcode *op, insn_t insn)
|
||||
{
|
||||
return match_opcode (op, insn) && ((insn & MASK_RD) != 0);
|
||||
}
|
||||
|
||||
static int
|
||||
match_c_add (const struct riscv_opcode *op, insn_t insn)
|
||||
{
|
||||
return match_rd_nonzero (op, insn) && ((insn & MASK_CRS2) != 0);
|
||||
}
|
||||
|
||||
static int
|
||||
match_c_lui (const struct riscv_opcode *op, insn_t insn)
|
||||
{
|
||||
return match_rd_nonzero (op, insn) && (((insn & MASK_RD) >> OP_SH_RD) != 2);
|
||||
}
|
||||
|
||||
const struct riscv_opcode riscv_opcodes[] =
|
||||
{
|
||||
/* name, isa, operands, match, mask, match_func, pinfo. */
|
||||
{"unimp", "C", "", 0, 0xffffU, match_opcode, 0 },
|
||||
{"unimp", "I", "", MATCH_CSRRW | (CSR_CYCLE << OP_SH_CSR), 0xffffffffU, match_opcode, 0 }, /* csrw cycle, x0 */
|
||||
{"ebreak", "C", "", MATCH_C_EBREAK, MASK_C_EBREAK, match_opcode, INSN_ALIAS },
|
||||
{"ebreak", "I", "", MATCH_EBREAK, MASK_EBREAK, match_opcode, 0 },
|
||||
{"sbreak", "C", "", MATCH_C_EBREAK, MASK_C_EBREAK, match_opcode, INSN_ALIAS },
|
||||
{"sbreak", "I", "", MATCH_EBREAK, MASK_EBREAK, match_opcode, INSN_ALIAS },
|
||||
{"ret", "C", "", MATCH_C_JR | (X_RA << OP_SH_RD), MASK_C_JR | MASK_RD, match_opcode, INSN_ALIAS },
|
||||
{"ret", "I", "", MATCH_JALR | (X_RA << OP_SH_RS1), MASK_JALR | MASK_RD | MASK_RS1 | MASK_IMM, match_opcode, INSN_ALIAS },
|
||||
{"jr", "C", "d", MATCH_C_JR, MASK_C_JR, match_rd_nonzero, INSN_ALIAS },
|
||||
{"jr", "I", "s", MATCH_JALR, MASK_JALR | MASK_RD | MASK_IMM, match_opcode, INSN_ALIAS },
|
||||
{"jr", "I", "s,j", MATCH_JALR, MASK_JALR | MASK_RD, match_opcode, INSN_ALIAS },
|
||||
{"jalr", "C", "d", MATCH_C_JALR, MASK_C_JALR, match_rd_nonzero, INSN_ALIAS },
|
||||
{"jalr", "I", "s", MATCH_JALR | (X_RA << OP_SH_RD), MASK_JALR | MASK_RD | MASK_IMM, match_opcode, INSN_ALIAS },
|
||||
{"jalr", "I", "s,j", MATCH_JALR | (X_RA << OP_SH_RD), MASK_JALR | MASK_RD, match_opcode, INSN_ALIAS },
|
||||
{"jalr", "I", "d,s", MATCH_JALR, MASK_JALR | MASK_IMM, match_opcode, INSN_ALIAS },
|
||||
{"jalr", "I", "d,s,j", MATCH_JALR, MASK_JALR, match_opcode, 0 },
|
||||
{"j", "C", "Ca", MATCH_C_J, MASK_C_J, match_opcode, INSN_ALIAS },
|
||||
{"j", "I", "a", MATCH_JAL, MASK_JAL | MASK_RD, match_opcode, INSN_ALIAS },
|
||||
{"jal", "32C", "Ca", MATCH_C_JAL, MASK_C_JAL, match_opcode, INSN_ALIAS },
|
||||
{"jal", "I", "a", MATCH_JAL | (X_RA << OP_SH_RD), MASK_JAL | MASK_RD, match_opcode, INSN_ALIAS },
|
||||
{"jal", "I", "d,a", MATCH_JAL, MASK_JAL, match_opcode, 0 },
|
||||
{"call", "I", "c", (X_T1 << OP_SH_RS1) | (X_RA << OP_SH_RD), (int) M_CALL, match_never, INSN_MACRO },
|
||||
{"call", "I", "d,c", (X_T1 << OP_SH_RS1), (int) M_CALL, match_never, INSN_MACRO },
|
||||
{"tail", "I", "c", (X_T1 << OP_SH_RS1), (int) M_CALL, match_never, INSN_MACRO },
|
||||
{"jump", "I", "c,s", 0, (int) M_CALL, match_never, INSN_MACRO },
|
||||
{"nop", "C", "", MATCH_C_ADDI, 0xffff, match_opcode, INSN_ALIAS },
|
||||
{"nop", "I", "", MATCH_ADDI, MASK_ADDI | MASK_RD | MASK_RS1 | MASK_IMM, match_opcode, INSN_ALIAS },
|
||||
{"lui", "C", "d,Cu", MATCH_C_LUI, MASK_C_LUI, match_c_lui, INSN_ALIAS },
|
||||
{"lui", "I", "d,u", MATCH_LUI, MASK_LUI, match_opcode, 0 },
|
||||
{"li", "C", "d,Cv", MATCH_C_LUI, MASK_C_LUI, match_c_lui, INSN_ALIAS },
|
||||
{"li", "C", "d,Cj", MATCH_C_LI, MASK_C_LI, match_rd_nonzero, INSN_ALIAS },
|
||||
{"li", "C", "d,0", MATCH_C_LI, MASK_C_LI | MASK_RVC_IMM, match_rd_nonzero, INSN_ALIAS },
|
||||
{"li", "I", "d,j", MATCH_ADDI, MASK_ADDI | MASK_RS1, match_opcode, INSN_ALIAS }, /* addi */
|
||||
{"li", "I", "d,I", 0, (int) M_LI, match_never, INSN_MACRO },
|
||||
{"mv", "C", "d,CV", MATCH_C_MV, MASK_C_MV, match_c_add, INSN_ALIAS },
|
||||
{"mv", "I", "d,s", MATCH_ADDI, MASK_ADDI | MASK_IMM, match_opcode, INSN_ALIAS },
|
||||
{"move", "C", "d,CV", MATCH_C_MV, MASK_C_MV, match_c_add, INSN_ALIAS },
|
||||
{"move", "I", "d,s", MATCH_ADDI, MASK_ADDI | MASK_IMM, match_opcode, INSN_ALIAS },
|
||||
{"andi", "C", "Cs,Cw,Cj", MATCH_C_ANDI, MASK_C_ANDI, match_opcode, INSN_ALIAS },
|
||||
{"andi", "I", "d,s,j", MATCH_ANDI, MASK_ANDI, match_opcode, 0 },
|
||||
{"and", "C", "Cs,Cw,Ct", MATCH_C_AND, MASK_C_AND, match_opcode, INSN_ALIAS },
|
||||
{"and", "C", "Cs,Ct,Cw", MATCH_C_AND, MASK_C_AND, match_opcode, INSN_ALIAS },
|
||||
{"and", "C", "Cs,Cw,Cj", MATCH_C_ANDI, MASK_C_ANDI, match_opcode, INSN_ALIAS },
|
||||
{"and", "I", "d,s,t", MATCH_AND, MASK_AND, match_opcode, 0 },
|
||||
{"and", "I", "d,s,j", MATCH_ANDI, MASK_ANDI, match_opcode, INSN_ALIAS },
|
||||
{"beqz", "C", "Cs,Cp", MATCH_C_BEQZ, MASK_C_BEQZ, match_opcode, INSN_ALIAS },
|
||||
{"beqz", "I", "s,p", MATCH_BEQ, MASK_BEQ | MASK_RS2, match_opcode, INSN_ALIAS },
|
||||
{"beq", "I", "s,t,p", MATCH_BEQ, MASK_BEQ, match_opcode, 0 },
|
||||
{"blez", "I", "t,p", MATCH_BGE, MASK_BGE | MASK_RS1, match_opcode, INSN_ALIAS },
|
||||
{"bgez", "I", "s,p", MATCH_BGE, MASK_BGE | MASK_RS2, match_opcode, INSN_ALIAS },
|
||||
{"ble", "I", "t,s,p", MATCH_BGE, MASK_BGE, match_opcode, INSN_ALIAS },
|
||||
{"bleu", "I", "t,s,p", MATCH_BGEU, MASK_BGEU, match_opcode, INSN_ALIAS },
|
||||
{"bge", "I", "s,t,p", MATCH_BGE, MASK_BGE, match_opcode, 0 },
|
||||
{"bgeu", "I", "s,t,p", MATCH_BGEU, MASK_BGEU, match_opcode, 0 },
|
||||
{"bltz", "I", "s,p", MATCH_BLT, MASK_BLT | MASK_RS2, match_opcode, INSN_ALIAS },
|
||||
{"bgtz", "I", "t,p", MATCH_BLT, MASK_BLT | MASK_RS1, match_opcode, INSN_ALIAS },
|
||||
{"blt", "I", "s,t,p", MATCH_BLT, MASK_BLT, match_opcode, 0 },
|
||||
{"bltu", "I", "s,t,p", MATCH_BLTU, MASK_BLTU, match_opcode, 0 },
|
||||
{"bgt", "I", "t,s,p", MATCH_BLT, MASK_BLT, match_opcode, INSN_ALIAS },
|
||||
{"bgtu", "I", "t,s,p", MATCH_BLTU, MASK_BLTU, match_opcode, INSN_ALIAS },
|
||||
{"bnez", "C", "Cs,Cp", MATCH_C_BNEZ, MASK_C_BNEZ, match_opcode, INSN_ALIAS },
|
||||
{"bnez", "I", "s,p", MATCH_BNE, MASK_BNE | MASK_RS2, match_opcode, INSN_ALIAS },
|
||||
{"bne", "I", "s,t,p", MATCH_BNE, MASK_BNE, match_opcode, 0 },
|
||||
{"addi", "C", "Ct,Cc,CK", MATCH_C_ADDI4SPN, MASK_C_ADDI4SPN, match_opcode, INSN_ALIAS },
|
||||
{"addi", "C", "d,CU,Cj", MATCH_C_ADDI, MASK_C_ADDI, match_rd_nonzero, INSN_ALIAS },
|
||||
{"addi", "C", "Cc,Cc,CL", MATCH_C_ADDI16SP, MASK_C_ADDI16SP, match_opcode, INSN_ALIAS },
|
||||
{"addi", "I", "d,s,j", MATCH_ADDI, MASK_ADDI, match_opcode, 0 },
|
||||
{"add", "C", "d,CU,CV", MATCH_C_ADD, MASK_C_ADD, match_c_add, INSN_ALIAS },
|
||||
{"add", "C", "d,CV,CU", MATCH_C_ADD, MASK_C_ADD, match_c_add, INSN_ALIAS },
|
||||
{"add", "C", "d,CU,Cj", MATCH_C_ADDI, MASK_C_ADDI, match_rd_nonzero, INSN_ALIAS },
|
||||
{"add", "C", "Ct,Cc,CK", MATCH_C_ADDI4SPN, MASK_C_ADDI4SPN, match_opcode, INSN_ALIAS },
|
||||
{"add", "C", "Cc,Cc,CL", MATCH_C_ADDI16SP, MASK_C_ADDI16SP, match_opcode, INSN_ALIAS },
|
||||
{"add", "I", "d,s,t", MATCH_ADD, MASK_ADD, match_opcode, 0 },
|
||||
{"add", "I", "d,s,t,0",MATCH_ADD, MASK_ADD, match_opcode, 0 },
|
||||
{"add", "I", "d,s,j", MATCH_ADDI, MASK_ADDI, match_opcode, INSN_ALIAS },
|
||||
{"la", "I", "d,A", 0, (int) M_LA, match_never, INSN_MACRO },
|
||||
{"lla", "I", "d,A", 0, (int) M_LLA, match_never, INSN_MACRO },
|
||||
{"la.tls.gd", "I", "d,A", 0, (int) M_LA_TLS_GD, match_never, INSN_MACRO },
|
||||
{"la.tls.ie", "I", "d,A", 0, (int) M_LA_TLS_IE, match_never, INSN_MACRO },
|
||||
{"neg", "I", "d,t", MATCH_SUB, MASK_SUB | MASK_RS1, match_opcode, INSN_ALIAS }, /* sub 0 */
|
||||
{"slli", "C", "d,CU,C>", MATCH_C_SLLI, MASK_C_SLLI, match_rd_nonzero, INSN_ALIAS },
|
||||
{"slli", "I", "d,s,>", MATCH_SLLI, MASK_SLLI, match_opcode, 0 },
|
||||
{"sll", "C", "d,CU,C>", MATCH_C_SLLI, MASK_C_SLLI, match_rd_nonzero, INSN_ALIAS },
|
||||
{"sll", "I", "d,s,t", MATCH_SLL, MASK_SLL, match_opcode, 0 },
|
||||
{"sll", "I", "d,s,>", MATCH_SLLI, MASK_SLLI, match_opcode, INSN_ALIAS },
|
||||
{"srli", "C", "Cs,Cw,C>", MATCH_C_SRLI, MASK_C_SRLI, match_rd_nonzero, INSN_ALIAS },
|
||||
{"srli", "I", "d,s,>", MATCH_SRLI, MASK_SRLI, match_opcode, 0 },
|
||||
{"srl", "C", "Cs,Cw,C>", MATCH_C_SRLI, MASK_C_SRLI, match_rd_nonzero, INSN_ALIAS },
|
||||
{"srl", "I", "d,s,t", MATCH_SRL, MASK_SRL, match_opcode, 0 },
|
||||
{"srl", "I", "d,s,>", MATCH_SRLI, MASK_SRLI, match_opcode, INSN_ALIAS },
|
||||
{"srai", "C", "Cs,Cw,C>", MATCH_C_SRAI, MASK_C_SRAI, match_rd_nonzero, INSN_ALIAS },
|
||||
{"srai", "I", "d,s,>", MATCH_SRAI, MASK_SRAI, match_opcode, 0 },
|
||||
{"sra", "C", "Cs,Cw,C>", MATCH_C_SRAI, MASK_C_SRAI, match_rd_nonzero, INSN_ALIAS },
|
||||
{"sra", "I", "d,s,t", MATCH_SRA, MASK_SRA, match_opcode, 0 },
|
||||
{"sra", "I", "d,s,>", MATCH_SRAI, MASK_SRAI, match_opcode, INSN_ALIAS },
|
||||
{"sub", "C", "Cs,Cw,Ct", MATCH_C_SUB, MASK_C_SUB, match_opcode, INSN_ALIAS },
|
||||
{"sub", "I", "d,s,t", MATCH_SUB, MASK_SUB, match_opcode, 0 },
|
||||
{"lb", "I", "d,o(s)", MATCH_LB, MASK_LB, match_opcode, 0 },
|
||||
{"lb", "I", "d,A", 0, (int) M_LB, match_never, INSN_MACRO },
|
||||
{"lbu", "I", "d,o(s)", MATCH_LBU, MASK_LBU, match_opcode, 0 },
|
||||
{"lbu", "I", "d,A", 0, (int) M_LBU, match_never, INSN_MACRO },
|
||||
{"lh", "I", "d,o(s)", MATCH_LH, MASK_LH, match_opcode, 0 },
|
||||
{"lh", "I", "d,A", 0, (int) M_LH, match_never, INSN_MACRO },
|
||||
{"lhu", "I", "d,o(s)", MATCH_LHU, MASK_LHU, match_opcode, 0 },
|
||||
{"lhu", "I", "d,A", 0, (int) M_LHU, match_never, INSN_MACRO },
|
||||
{"lw", "C", "d,Cm(Cc)", MATCH_C_LWSP, MASK_C_LWSP, match_rd_nonzero, INSN_ALIAS },
|
||||
{"lw", "C", "Ct,Ck(Cs)", MATCH_C_LW, MASK_C_LW, match_opcode, INSN_ALIAS },
|
||||
{"lw", "I", "d,o(s)", MATCH_LW, MASK_LW, match_opcode, 0 },
|
||||
{"lw", "I", "d,A", 0, (int) M_LW, match_never, INSN_MACRO },
|
||||
{"not", "I", "d,s", MATCH_XORI | MASK_IMM, MASK_XORI | MASK_IMM, match_opcode, INSN_ALIAS },
|
||||
{"ori", "I", "d,s,j", MATCH_ORI, MASK_ORI, match_opcode, 0 },
|
||||
{"or", "C", "Cs,Cw,Ct", MATCH_C_OR, MASK_C_OR, match_opcode, INSN_ALIAS },
|
||||
{"or", "C", "Cs,Ct,Cw", MATCH_C_OR, MASK_C_OR, match_opcode, INSN_ALIAS },
|
||||
{"or", "I", "d,s,t", MATCH_OR, MASK_OR, match_opcode, 0 },
|
||||
{"or", "I", "d,s,j", MATCH_ORI, MASK_ORI, match_opcode, INSN_ALIAS },
|
||||
{"auipc", "I", "d,u", MATCH_AUIPC, MASK_AUIPC, match_opcode, 0 },
|
||||
{"seqz", "I", "d,s", MATCH_SLTIU | ENCODE_ITYPE_IMM(1), MASK_SLTIU | MASK_IMM, match_opcode, INSN_ALIAS },
|
||||
{"snez", "I", "d,t", MATCH_SLTU, MASK_SLTU | MASK_RS1, match_opcode, INSN_ALIAS },
|
||||
{"sltz", "I", "d,s", MATCH_SLT, MASK_SLT | MASK_RS2, match_opcode, INSN_ALIAS },
|
||||
{"sgtz", "I", "d,t", MATCH_SLT, MASK_SLT | MASK_RS1, match_opcode, INSN_ALIAS },
|
||||
{"slti", "I", "d,s,j", MATCH_SLTI, MASK_SLTI, match_opcode, INSN_ALIAS },
|
||||
{"slt", "I", "d,s,t", MATCH_SLT, MASK_SLT, match_opcode, 0 },
|
||||
{"slt", "I", "d,s,j", MATCH_SLTI, MASK_SLTI, match_opcode, 0 },
|
||||
{"sltiu", "I", "d,s,j", MATCH_SLTIU, MASK_SLTIU, match_opcode, 0 },
|
||||
{"sltu", "I", "d,s,t", MATCH_SLTU, MASK_SLTU, match_opcode, 0 },
|
||||
{"sltu", "I", "d,s,j", MATCH_SLTIU, MASK_SLTIU, match_opcode, INSN_ALIAS },
|
||||
{"sgt", "I", "d,t,s", MATCH_SLT, MASK_SLT, match_opcode, INSN_ALIAS },
|
||||
{"sgtu", "I", "d,t,s", MATCH_SLTU, MASK_SLTU, match_opcode, INSN_ALIAS },
|
||||
{"sb", "I", "t,q(s)", MATCH_SB, MASK_SB, match_opcode, 0 },
|
||||
{"sb", "I", "t,A,s", 0, (int) M_SB, match_never, INSN_MACRO },
|
||||
{"sh", "I", "t,q(s)", MATCH_SH, MASK_SH, match_opcode, 0 },
|
||||
{"sh", "I", "t,A,s", 0, (int) M_SH, match_never, INSN_MACRO },
|
||||
{"sw", "C", "CV,CM(Cc)", MATCH_C_SWSP, MASK_C_SWSP, match_opcode, INSN_ALIAS },
|
||||
{"sw", "C", "Ct,Ck(Cs)", MATCH_C_SW, MASK_C_SW, match_opcode, INSN_ALIAS },
|
||||
{"sw", "I", "t,q(s)", MATCH_SW, MASK_SW, match_opcode, 0 },
|
||||
{"sw", "I", "t,A,s", 0, (int) M_SW, match_never, INSN_MACRO },
|
||||
{"fence", "I", "", MATCH_FENCE | MASK_PRED | MASK_SUCC, MASK_FENCE | MASK_RD | MASK_RS1 | MASK_IMM, match_opcode, INSN_ALIAS },
|
||||
{"fence", "I", "P,Q", MATCH_FENCE, MASK_FENCE | MASK_RD | MASK_RS1 | (MASK_IMM & ~MASK_PRED & ~MASK_SUCC), match_opcode, 0 },
|
||||
{"fence.i", "I", "", MATCH_FENCE_I, MASK_FENCE | MASK_RD | MASK_RS1 | MASK_IMM, match_opcode, 0 },
|
||||
{"rdcycle", "I", "d", MATCH_RDCYCLE, MASK_RDCYCLE, match_opcode, 0 },
|
||||
{"rdinstret", "I", "d", MATCH_RDINSTRET, MASK_RDINSTRET, match_opcode, 0 },
|
||||
{"rdtime", "I", "d", MATCH_RDTIME, MASK_RDTIME, match_opcode, 0 },
|
||||
{"rdcycleh", "32I", "d", MATCH_RDCYCLEH, MASK_RDCYCLEH, match_opcode, 0 },
|
||||
{"rdinstreth","32I", "d", MATCH_RDINSTRETH, MASK_RDINSTRETH, match_opcode, 0 },
|
||||
{"rdtimeh", "32I", "d", MATCH_RDTIMEH, MASK_RDTIMEH, match_opcode, 0 },
|
||||
{"ecall", "I", "", MATCH_SCALL, MASK_SCALL, match_opcode, 0 },
|
||||
{"scall", "I", "", MATCH_SCALL, MASK_SCALL, match_opcode, 0 },
|
||||
{"xori", "I", "d,s,j", MATCH_XORI, MASK_XORI, match_opcode, 0 },
|
||||
{"xor", "C", "Cs,Cw,Ct", MATCH_C_XOR, MASK_C_XOR, match_opcode, INSN_ALIAS },
|
||||
{"xor", "C", "Cs,Ct,Cw", MATCH_C_XOR, MASK_C_XOR, match_opcode, INSN_ALIAS },
|
||||
{"xor", "I", "d,s,t", MATCH_XOR, MASK_XOR, match_opcode, 0 },
|
||||
{"xor", "I", "d,s,j", MATCH_XORI, MASK_XORI, match_opcode, INSN_ALIAS },
|
||||
{"lwu", "64I", "d,o(s)", MATCH_LWU, MASK_LWU, match_opcode, 0 },
|
||||
{"lwu", "64I", "d,A", 0, (int) M_LWU, match_never, INSN_MACRO },
|
||||
{"ld", "64C", "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, INSN_ALIAS },
|
||||
{"ld", "64C", "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, INSN_ALIAS },
|
||||
{"ld", "64I", "d,o(s)", MATCH_LD, MASK_LD, match_opcode, 0 },
|
||||
{"ld", "64I", "d,A", 0, (int) M_LD, match_never, INSN_MACRO },
|
||||
{"sd", "64C", "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, INSN_ALIAS },
|
||||
{"sd", "64C", "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, INSN_ALIAS },
|
||||
{"sd", "64I", "t,q(s)", MATCH_SD, MASK_SD, match_opcode, 0 },
|
||||
{"sd", "64I", "t,A,s", 0, (int) M_SD, match_never, INSN_MACRO },
|
||||
{"sext.w", "64C", "d,CU", MATCH_C_ADDIW, MASK_C_ADDIW | MASK_RVC_IMM, match_rd_nonzero, INSN_ALIAS },
|
||||
{"sext.w", "64I", "d,s", MATCH_ADDIW, MASK_ADDIW | MASK_IMM, match_opcode, INSN_ALIAS },
|
||||
{"addiw", "64C", "d,CU,Cj", MATCH_C_ADDIW, MASK_C_ADDIW, match_rd_nonzero, INSN_ALIAS },
|
||||
{"addiw", "64I", "d,s,j", MATCH_ADDIW, MASK_ADDIW, match_opcode, 0 },
|
||||
{"addw", "64C", "Cs,Cw,Ct", MATCH_C_ADDW, MASK_C_ADDW, match_opcode, INSN_ALIAS },
|
||||
{"addw", "64C", "Cs,Ct,Cw", MATCH_C_ADDW, MASK_C_ADDW, match_opcode, INSN_ALIAS },
|
||||
{"addw", "64C", "d,CU,Cj", MATCH_C_ADDIW, MASK_C_ADDIW, match_rd_nonzero, INSN_ALIAS },
|
||||
{"addw", "64I", "d,s,t", MATCH_ADDW, MASK_ADDW, match_opcode, 0 },
|
||||
{"addw", "64I", "d,s,j", MATCH_ADDIW, MASK_ADDIW, match_opcode, INSN_ALIAS },
|
||||
{"negw", "64I", "d,t", MATCH_SUBW, MASK_SUBW | MASK_RS1, match_opcode, INSN_ALIAS }, /* sub 0 */
|
||||
{"slliw", "64I", "d,s,<", MATCH_SLLIW, MASK_SLLIW, match_opcode, 0 },
|
||||
{"sllw", "64I", "d,s,t", MATCH_SLLW, MASK_SLLW, match_opcode, 0 },
|
||||
{"sllw", "64I", "d,s,<", MATCH_SLLIW, MASK_SLLIW, match_opcode, INSN_ALIAS },
|
||||
{"srliw", "64I", "d,s,<", MATCH_SRLIW, MASK_SRLIW, match_opcode, 0 },
|
||||
{"srlw", "64I", "d,s,t", MATCH_SRLW, MASK_SRLW, match_opcode, 0 },
|
||||
{"srlw", "64I", "d,s,<", MATCH_SRLIW, MASK_SRLIW, match_opcode, INSN_ALIAS },
|
||||
{"sraiw", "64I", "d,s,<", MATCH_SRAIW, MASK_SRAIW, match_opcode, 0 },
|
||||
{"sraw", "64I", "d,s,t", MATCH_SRAW, MASK_SRAW, match_opcode, 0 },
|
||||
{"sraw", "64I", "d,s,<", MATCH_SRAIW, MASK_SRAIW, match_opcode, INSN_ALIAS },
|
||||
{"subw", "64C", "Cs,Cw,Ct", MATCH_C_SUBW, MASK_C_SUBW, match_opcode, INSN_ALIAS },
|
||||
{"subw", "64I", "d,s,t", MATCH_SUBW, MASK_SUBW, match_opcode, 0 },
|
||||
|
||||
/* Atomic memory operation instruction subset */
|
||||
{"lr.w", "A", "d,0(s)", MATCH_LR_W, MASK_LR_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"sc.w", "A", "d,t,0(s)", MATCH_SC_W, MASK_SC_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoadd.w", "A", "d,t,0(s)", MATCH_AMOADD_W, MASK_AMOADD_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoswap.w", "A", "d,t,0(s)", MATCH_AMOSWAP_W, MASK_AMOSWAP_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoand.w", "A", "d,t,0(s)", MATCH_AMOAND_W, MASK_AMOAND_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoor.w", "A", "d,t,0(s)", MATCH_AMOOR_W, MASK_AMOOR_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoxor.w", "A", "d,t,0(s)", MATCH_AMOXOR_W, MASK_AMOXOR_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomax.w", "A", "d,t,0(s)", MATCH_AMOMAX_W, MASK_AMOMAX_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomaxu.w", "A", "d,t,0(s)", MATCH_AMOMAXU_W, MASK_AMOMAXU_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomin.w", "A", "d,t,0(s)", MATCH_AMOMIN_W, MASK_AMOMIN_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amominu.w", "A", "d,t,0(s)", MATCH_AMOMINU_W, MASK_AMOMINU_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"lr.w.aq", "A", "d,0(s)", MATCH_LR_W | MASK_AQ, MASK_LR_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"sc.w.aq", "A", "d,t,0(s)", MATCH_SC_W | MASK_AQ, MASK_SC_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoadd.w.aq", "A", "d,t,0(s)", MATCH_AMOADD_W | MASK_AQ, MASK_AMOADD_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoswap.w.aq", "A", "d,t,0(s)", MATCH_AMOSWAP_W | MASK_AQ, MASK_AMOSWAP_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoand.w.aq", "A", "d,t,0(s)", MATCH_AMOAND_W | MASK_AQ, MASK_AMOAND_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoor.w.aq", "A", "d,t,0(s)", MATCH_AMOOR_W | MASK_AQ, MASK_AMOOR_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoxor.w.aq", "A", "d,t,0(s)", MATCH_AMOXOR_W | MASK_AQ, MASK_AMOXOR_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomax.w.aq", "A", "d,t,0(s)", MATCH_AMOMAX_W | MASK_AQ, MASK_AMOMAX_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomaxu.w.aq", "A", "d,t,0(s)", MATCH_AMOMAXU_W | MASK_AQ, MASK_AMOMAXU_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomin.w.aq", "A", "d,t,0(s)", MATCH_AMOMIN_W | MASK_AQ, MASK_AMOMIN_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amominu.w.aq", "A", "d,t,0(s)", MATCH_AMOMINU_W | MASK_AQ, MASK_AMOMINU_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"lr.w.rl", "A", "d,0(s)", MATCH_LR_W | MASK_RL, MASK_LR_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"sc.w.rl", "A", "d,t,0(s)", MATCH_SC_W | MASK_RL, MASK_SC_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoadd.w.rl", "A", "d,t,0(s)", MATCH_AMOADD_W | MASK_RL, MASK_AMOADD_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoswap.w.rl", "A", "d,t,0(s)", MATCH_AMOSWAP_W | MASK_RL, MASK_AMOSWAP_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoand.w.rl", "A", "d,t,0(s)", MATCH_AMOAND_W | MASK_RL, MASK_AMOAND_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoor.w.rl", "A", "d,t,0(s)", MATCH_AMOOR_W | MASK_RL, MASK_AMOOR_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoxor.w.rl", "A", "d,t,0(s)", MATCH_AMOXOR_W | MASK_RL, MASK_AMOXOR_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomax.w.rl", "A", "d,t,0(s)", MATCH_AMOMAX_W | MASK_RL, MASK_AMOMAX_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomaxu.w.rl", "A", "d,t,0(s)", MATCH_AMOMAXU_W | MASK_RL, MASK_AMOMAXU_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomin.w.rl", "A", "d,t,0(s)", MATCH_AMOMIN_W | MASK_RL, MASK_AMOMIN_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amominu.w.rl", "A", "d,t,0(s)", MATCH_AMOMINU_W | MASK_RL, MASK_AMOMINU_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"lr.w.sc", "A", "d,0(s)", MATCH_LR_W | MASK_AQRL, MASK_LR_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"sc.w.sc", "A", "d,t,0(s)", MATCH_SC_W | MASK_AQRL, MASK_SC_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoadd.w.sc", "A", "d,t,0(s)", MATCH_AMOADD_W | MASK_AQRL, MASK_AMOADD_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoswap.w.sc", "A", "d,t,0(s)", MATCH_AMOSWAP_W | MASK_AQRL, MASK_AMOSWAP_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoand.w.sc", "A", "d,t,0(s)", MATCH_AMOAND_W | MASK_AQRL, MASK_AMOAND_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoor.w.sc", "A", "d,t,0(s)", MATCH_AMOOR_W | MASK_AQRL, MASK_AMOOR_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoxor.w.sc", "A", "d,t,0(s)", MATCH_AMOXOR_W | MASK_AQRL, MASK_AMOXOR_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomax.w.sc", "A", "d,t,0(s)", MATCH_AMOMAX_W | MASK_AQRL, MASK_AMOMAX_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomaxu.w.sc", "A", "d,t,0(s)", MATCH_AMOMAXU_W | MASK_AQRL, MASK_AMOMAXU_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomin.w.sc", "A", "d,t,0(s)", MATCH_AMOMIN_W | MASK_AQRL, MASK_AMOMIN_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"amominu.w.sc", "A", "d,t,0(s)", MATCH_AMOMINU_W | MASK_AQRL, MASK_AMOMINU_W | MASK_AQRL, match_opcode, 0 },
|
||||
{"lr.d", "64A", "d,0(s)", MATCH_LR_D, MASK_LR_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"sc.d", "64A", "d,t,0(s)", MATCH_SC_D, MASK_SC_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoadd.d", "64A", "d,t,0(s)", MATCH_AMOADD_D, MASK_AMOADD_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoswap.d", "64A", "d,t,0(s)", MATCH_AMOSWAP_D, MASK_AMOSWAP_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoand.d", "64A", "d,t,0(s)", MATCH_AMOAND_D, MASK_AMOAND_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoor.d", "64A", "d,t,0(s)", MATCH_AMOOR_D, MASK_AMOOR_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoxor.d", "64A", "d,t,0(s)", MATCH_AMOXOR_D, MASK_AMOXOR_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomax.d", "64A", "d,t,0(s)", MATCH_AMOMAX_D, MASK_AMOMAX_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomaxu.d", "64A", "d,t,0(s)", MATCH_AMOMAXU_D, MASK_AMOMAXU_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomin.d", "64A", "d,t,0(s)", MATCH_AMOMIN_D, MASK_AMOMIN_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amominu.d", "64A", "d,t,0(s)", MATCH_AMOMINU_D, MASK_AMOMINU_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"lr.d.aq", "64A", "d,0(s)", MATCH_LR_D | MASK_AQ, MASK_LR_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"sc.d.aq", "64A", "d,t,0(s)", MATCH_SC_D | MASK_AQ, MASK_SC_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoadd.d.aq", "64A", "d,t,0(s)", MATCH_AMOADD_D | MASK_AQ, MASK_AMOADD_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoswap.d.aq", "64A", "d,t,0(s)", MATCH_AMOSWAP_D | MASK_AQ, MASK_AMOSWAP_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoand.d.aq", "64A", "d,t,0(s)", MATCH_AMOAND_D | MASK_AQ, MASK_AMOAND_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoor.d.aq", "64A", "d,t,0(s)", MATCH_AMOOR_D | MASK_AQ, MASK_AMOOR_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoxor.d.aq", "64A", "d,t,0(s)", MATCH_AMOXOR_D | MASK_AQ, MASK_AMOXOR_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomax.d.aq", "64A", "d,t,0(s)", MATCH_AMOMAX_D | MASK_AQ, MASK_AMOMAX_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomaxu.d.aq", "64A", "d,t,0(s)", MATCH_AMOMAXU_D | MASK_AQ, MASK_AMOMAXU_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomin.d.aq", "64A", "d,t,0(s)", MATCH_AMOMIN_D | MASK_AQ, MASK_AMOMIN_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amominu.d.aq", "64A", "d,t,0(s)", MATCH_AMOMINU_D | MASK_AQ, MASK_AMOMINU_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"lr.d.rl", "64A", "d,0(s)", MATCH_LR_D | MASK_RL, MASK_LR_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"sc.d.rl", "64A", "d,t,0(s)", MATCH_SC_D | MASK_RL, MASK_SC_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoadd.d.rl", "64A", "d,t,0(s)", MATCH_AMOADD_D | MASK_RL, MASK_AMOADD_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoswap.d.rl", "64A", "d,t,0(s)", MATCH_AMOSWAP_D | MASK_RL, MASK_AMOSWAP_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoand.d.rl", "64A", "d,t,0(s)", MATCH_AMOAND_D | MASK_RL, MASK_AMOAND_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoor.d.rl", "64A", "d,t,0(s)", MATCH_AMOOR_D | MASK_RL, MASK_AMOOR_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoxor.d.rl", "64A", "d,t,0(s)", MATCH_AMOXOR_D | MASK_RL, MASK_AMOXOR_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomax.d.rl", "64A", "d,t,0(s)", MATCH_AMOMAX_D | MASK_RL, MASK_AMOMAX_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomaxu.d.rl", "64A", "d,t,0(s)", MATCH_AMOMAXU_D | MASK_RL, MASK_AMOMAXU_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomin.d.rl", "64A", "d,t,0(s)", MATCH_AMOMIN_D | MASK_RL, MASK_AMOMIN_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amominu.d.rl", "64A", "d,t,0(s)", MATCH_AMOMINU_D | MASK_RL, MASK_AMOMINU_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"lr.d.sc", "64A", "d,0(s)", MATCH_LR_D | MASK_AQRL, MASK_LR_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"sc.d.sc", "64A", "d,t,0(s)", MATCH_SC_D | MASK_AQRL, MASK_SC_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoadd.d.sc", "64A", "d,t,0(s)", MATCH_AMOADD_D | MASK_AQRL, MASK_AMOADD_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoswap.d.sc", "64A", "d,t,0(s)", MATCH_AMOSWAP_D | MASK_AQRL, MASK_AMOSWAP_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoand.d.sc", "64A", "d,t,0(s)", MATCH_AMOAND_D | MASK_AQRL, MASK_AMOAND_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoor.d.sc", "64A", "d,t,0(s)", MATCH_AMOOR_D | MASK_AQRL, MASK_AMOOR_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amoxor.d.sc", "64A", "d,t,0(s)", MATCH_AMOXOR_D | MASK_AQRL, MASK_AMOXOR_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomax.d.sc", "64A", "d,t,0(s)", MATCH_AMOMAX_D | MASK_AQRL, MASK_AMOMAX_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomaxu.d.sc", "64A", "d,t,0(s)", MATCH_AMOMAXU_D | MASK_AQRL, MASK_AMOMAXU_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amomin.d.sc", "64A", "d,t,0(s)", MATCH_AMOMIN_D | MASK_AQRL, MASK_AMOMIN_D | MASK_AQRL, match_opcode, 0 },
|
||||
{"amominu.d.sc", "64A", "d,t,0(s)", MATCH_AMOMINU_D | MASK_AQRL, MASK_AMOMINU_D | MASK_AQRL, match_opcode, 0 },
|
||||
|
||||
/* Multiply/Divide instruction subset */
|
||||
{"mul", "M", "d,s,t", MATCH_MUL, MASK_MUL, match_opcode, 0 },
|
||||
{"mulh", "M", "d,s,t", MATCH_MULH, MASK_MULH, match_opcode, 0 },
|
||||
{"mulhu", "M", "d,s,t", MATCH_MULHU, MASK_MULHU, match_opcode, 0 },
|
||||
{"mulhsu", "M", "d,s,t", MATCH_MULHSU, MASK_MULHSU, match_opcode, 0 },
|
||||
{"div", "M", "d,s,t", MATCH_DIV, MASK_DIV, match_opcode, 0 },
|
||||
{"divu", "M", "d,s,t", MATCH_DIVU, MASK_DIVU, match_opcode, 0 },
|
||||
{"rem", "M", "d,s,t", MATCH_REM, MASK_REM, match_opcode, 0 },
|
||||
{"remu", "M", "d,s,t", MATCH_REMU, MASK_REMU, match_opcode, 0 },
|
||||
{"mulw", "64M", "d,s,t", MATCH_MULW, MASK_MULW, match_opcode, 0 },
|
||||
{"divw", "64M", "d,s,t", MATCH_DIVW, MASK_DIVW, match_opcode, 0 },
|
||||
{"divuw", "64M", "d,s,t", MATCH_DIVUW, MASK_DIVUW, match_opcode, 0 },
|
||||
{"remw", "64M", "d,s,t", MATCH_REMW, MASK_REMW, match_opcode, 0 },
|
||||
{"remuw", "64M", "d,s,t", MATCH_REMUW, MASK_REMUW, match_opcode, 0 },
|
||||
|
||||
/* Single-precision floating-point instruction subset */
|
||||
{"frsr", "F", "d", MATCH_FRCSR, MASK_FRCSR, match_opcode, 0 },
|
||||
{"fssr", "F", "s", MATCH_FSCSR, MASK_FSCSR | MASK_RD, match_opcode, 0 },
|
||||
{"fssr", "F", "d,s", MATCH_FSCSR, MASK_FSCSR, match_opcode, 0 },
|
||||
{"frcsr", "F", "d", MATCH_FRCSR, MASK_FRCSR, match_opcode, 0 },
|
||||
{"fscsr", "F", "s", MATCH_FSCSR, MASK_FSCSR | MASK_RD, match_opcode, 0 },
|
||||
{"fscsr", "F", "d,s", MATCH_FSCSR, MASK_FSCSR, match_opcode, 0 },
|
||||
{"frrm", "F", "d", MATCH_FRRM, MASK_FRRM, match_opcode, 0 },
|
||||
{"fsrm", "F", "s", MATCH_FSRM, MASK_FSRM | MASK_RD, match_opcode, 0 },
|
||||
{"fsrm", "F", "d,s", MATCH_FSRM, MASK_FSRM, match_opcode, 0 },
|
||||
{"frflags", "F", "d", MATCH_FRFLAGS, MASK_FRFLAGS, match_opcode, 0 },
|
||||
{"fsflags", "F", "s", MATCH_FSFLAGS, MASK_FSFLAGS | MASK_RD, match_opcode, 0 },
|
||||
{"fsflags", "F", "d,s", MATCH_FSFLAGS, MASK_FSFLAGS, match_opcode, 0 },
|
||||
{"flw", "32C", "D,Cm(Cc)", MATCH_C_FLWSP, MASK_C_FLWSP, match_opcode, INSN_ALIAS },
|
||||
{"flw", "32C", "CD,Ck(Cs)", MATCH_C_FLW, MASK_C_FLW, match_opcode, INSN_ALIAS },
|
||||
{"flw", "F", "D,o(s)", MATCH_FLW, MASK_FLW, match_opcode, 0 },
|
||||
{"flw", "F", "D,A,s", 0, (int) M_FLW, match_never, INSN_MACRO },
|
||||
{"fsw", "32C", "CT,CM(Cc)", MATCH_C_FSWSP, MASK_C_FSWSP, match_opcode, INSN_ALIAS },
|
||||
{"fsw", "32C", "CD,Ck(Cs)", MATCH_C_FSW, MASK_C_FSW, match_opcode, INSN_ALIAS },
|
||||
{"fsw", "F", "T,q(s)", MATCH_FSW, MASK_FSW, match_opcode, 0 },
|
||||
{"fsw", "F", "T,A,s", 0, (int) M_FSW, match_never, INSN_MACRO },
|
||||
{"fmv.x.s", "F", "d,S", MATCH_FMV_X_S, MASK_FMV_X_S, match_opcode, 0 },
|
||||
{"fmv.s.x", "F", "D,s", MATCH_FMV_S_X, MASK_FMV_S_X, match_opcode, 0 },
|
||||
{"fmv.s", "F", "D,U", MATCH_FSGNJ_S, MASK_FSGNJ_S, match_rs1_eq_rs2, INSN_ALIAS },
|
||||
{"fneg.s", "F", "D,U", MATCH_FSGNJN_S, MASK_FSGNJN_S, match_rs1_eq_rs2, INSN_ALIAS },
|
||||
{"fabs.s", "F", "D,U", MATCH_FSGNJX_S, MASK_FSGNJX_S, match_rs1_eq_rs2, INSN_ALIAS },
|
||||
{"fsgnj.s", "F", "D,S,T", MATCH_FSGNJ_S, MASK_FSGNJ_S, match_opcode, 0 },
|
||||
{"fsgnjn.s", "F", "D,S,T", MATCH_FSGNJN_S, MASK_FSGNJN_S, match_opcode, 0 },
|
||||
{"fsgnjx.s", "F", "D,S,T", MATCH_FSGNJX_S, MASK_FSGNJX_S, match_opcode, 0 },
|
||||
{"fadd.s", "F", "D,S,T", MATCH_FADD_S | MASK_RM, MASK_FADD_S | MASK_RM, match_opcode, 0 },
|
||||
{"fadd.s", "F", "D,S,T,m", MATCH_FADD_S, MASK_FADD_S, match_opcode, 0 },
|
||||
{"fsub.s", "F", "D,S,T", MATCH_FSUB_S | MASK_RM, MASK_FSUB_S | MASK_RM, match_opcode, 0 },
|
||||
{"fsub.s", "F", "D,S,T,m", MATCH_FSUB_S, MASK_FSUB_S, match_opcode, 0 },
|
||||
{"fmul.s", "F", "D,S,T", MATCH_FMUL_S | MASK_RM, MASK_FMUL_S | MASK_RM, match_opcode, 0 },
|
||||
{"fmul.s", "F", "D,S,T,m", MATCH_FMUL_S, MASK_FMUL_S, match_opcode, 0 },
|
||||
{"fdiv.s", "F", "D,S,T", MATCH_FDIV_S | MASK_RM, MASK_FDIV_S | MASK_RM, match_opcode, 0 },
|
||||
{"fdiv.s", "F", "D,S,T,m", MATCH_FDIV_S, MASK_FDIV_S, match_opcode, 0 },
|
||||
{"fsqrt.s", "F", "D,S", MATCH_FSQRT_S | MASK_RM, MASK_FSQRT_S | MASK_RM, match_opcode, 0 },
|
||||
{"fsqrt.s", "F", "D,S,m", MATCH_FSQRT_S, MASK_FSQRT_S, match_opcode, 0 },
|
||||
{"fmin.s", "F", "D,S,T", MATCH_FMIN_S, MASK_FMIN_S, match_opcode, 0 },
|
||||
{"fmax.s", "F", "D,S,T", MATCH_FMAX_S, MASK_FMAX_S, match_opcode, 0 },
|
||||
{"fmadd.s", "F", "D,S,T,R", MATCH_FMADD_S | MASK_RM, MASK_FMADD_S | MASK_RM, match_opcode, 0 },
|
||||
{"fmadd.s", "F", "D,S,T,R,m", MATCH_FMADD_S, MASK_FMADD_S, match_opcode, 0 },
|
||||
{"fnmadd.s", "F", "D,S,T,R", MATCH_FNMADD_S | MASK_RM, MASK_FNMADD_S | MASK_RM, match_opcode, 0 },
|
||||
{"fnmadd.s", "F", "D,S,T,R,m", MATCH_FNMADD_S, MASK_FNMADD_S, match_opcode, 0 },
|
||||
{"fmsub.s", "F", "D,S,T,R", MATCH_FMSUB_S | MASK_RM, MASK_FMSUB_S | MASK_RM, match_opcode, 0 },
|
||||
{"fmsub.s", "F", "D,S,T,R,m", MATCH_FMSUB_S, MASK_FMSUB_S, match_opcode, 0 },
|
||||
{"fnmsub.s", "F", "D,S,T,R", MATCH_FNMSUB_S | MASK_RM, MASK_FNMSUB_S | MASK_RM, match_opcode, 0 },
|
||||
{"fnmsub.s", "F", "D,S,T,R,m", MATCH_FNMSUB_S, MASK_FNMSUB_S, match_opcode, 0 },
|
||||
{"fcvt.w.s", "F", "d,S", MATCH_FCVT_W_S | MASK_RM, MASK_FCVT_W_S | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.w.s", "F", "d,S,m", MATCH_FCVT_W_S, MASK_FCVT_W_S, match_opcode, 0 },
|
||||
{"fcvt.wu.s", "F", "d,S", MATCH_FCVT_WU_S | MASK_RM, MASK_FCVT_WU_S | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.wu.s", "F", "d,S,m", MATCH_FCVT_WU_S, MASK_FCVT_WU_S, match_opcode, 0 },
|
||||
{"fcvt.s.w", "F", "D,s", MATCH_FCVT_S_W | MASK_RM, MASK_FCVT_S_W | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.s.w", "F", "D,s,m", MATCH_FCVT_S_W, MASK_FCVT_S_W, match_opcode, 0 },
|
||||
{"fcvt.s.wu", "F", "D,s", MATCH_FCVT_S_WU | MASK_RM, MASK_FCVT_S_W | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.s.wu", "F", "D,s,m", MATCH_FCVT_S_WU, MASK_FCVT_S_WU, match_opcode, 0 },
|
||||
{"fclass.s", "F", "d,S", MATCH_FCLASS_S, MASK_FCLASS_S, match_opcode, 0 },
|
||||
{"feq.s", "F", "d,S,T", MATCH_FEQ_S, MASK_FEQ_S, match_opcode, 0 },
|
||||
{"flt.s", "F", "d,S,T", MATCH_FLT_S, MASK_FLT_S, match_opcode, 0 },
|
||||
{"fle.s", "F", "d,S,T", MATCH_FLE_S, MASK_FLE_S, match_opcode, 0 },
|
||||
{"fgt.s", "F", "d,T,S", MATCH_FLT_S, MASK_FLT_S, match_opcode, 0 },
|
||||
{"fge.s", "F", "d,T,S", MATCH_FLE_S, MASK_FLE_S, match_opcode, 0 },
|
||||
{"fcvt.l.s", "64F", "d,S", MATCH_FCVT_L_S | MASK_RM, MASK_FCVT_L_S | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.l.s", "64F", "d,S,m", MATCH_FCVT_L_S, MASK_FCVT_L_S, match_opcode, 0 },
|
||||
{"fcvt.lu.s", "64F", "d,S", MATCH_FCVT_LU_S | MASK_RM, MASK_FCVT_LU_S | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.lu.s", "64F", "d,S,m", MATCH_FCVT_LU_S, MASK_FCVT_LU_S, match_opcode, 0 },
|
||||
{"fcvt.s.l", "64F", "D,s", MATCH_FCVT_S_L | MASK_RM, MASK_FCVT_S_L | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.s.l", "64F", "D,s,m", MATCH_FCVT_S_L, MASK_FCVT_S_L, match_opcode, 0 },
|
||||
{"fcvt.s.lu", "64F", "D,s", MATCH_FCVT_S_LU | MASK_RM, MASK_FCVT_S_L | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.s.lu", "64F", "D,s,m", MATCH_FCVT_S_LU, MASK_FCVT_S_LU, match_opcode, 0 },
|
||||
|
||||
/* Double-precision floating-point instruction subset */
|
||||
{"fld", "C", "D,Cn(Cc)", MATCH_C_FLDSP, MASK_C_FLDSP, match_opcode, INSN_ALIAS },
|
||||
{"fld", "C", "CD,Cl(Cs)", MATCH_C_FLD, MASK_C_FLD, match_opcode, INSN_ALIAS },
|
||||
{"fld", "D", "D,o(s)", MATCH_FLD, MASK_FLD, match_opcode, 0 },
|
||||
{"fld", "D", "D,A,s", 0, (int) M_FLD, match_never, INSN_MACRO },
|
||||
{"fsd", "C", "CT,CN(Cc)", MATCH_C_FSDSP, MASK_C_FSDSP, match_opcode, INSN_ALIAS },
|
||||
{"fsd", "C", "CD,Cl(Cs)", MATCH_C_FSD, MASK_C_FSD, match_opcode, INSN_ALIAS },
|
||||
{"fsd", "D", "T,q(s)", MATCH_FSD, MASK_FSD, match_opcode, 0 },
|
||||
{"fsd", "D", "T,A,s", 0, (int) M_FSD, match_never, INSN_MACRO },
|
||||
{"fmv.d", "D", "D,U", MATCH_FSGNJ_D, MASK_FSGNJ_D, match_rs1_eq_rs2, INSN_ALIAS },
|
||||
{"fneg.d", "D", "D,U", MATCH_FSGNJN_D, MASK_FSGNJN_D, match_rs1_eq_rs2, INSN_ALIAS },
|
||||
{"fabs.d", "D", "D,U", MATCH_FSGNJX_D, MASK_FSGNJX_D, match_rs1_eq_rs2, INSN_ALIAS },
|
||||
{"fsgnj.d", "D", "D,S,T", MATCH_FSGNJ_D, MASK_FSGNJ_D, match_opcode, 0 },
|
||||
{"fsgnjn.d", "D", "D,S,T", MATCH_FSGNJN_D, MASK_FSGNJN_D, match_opcode, 0 },
|
||||
{"fsgnjx.d", "D", "D,S,T", MATCH_FSGNJX_D, MASK_FSGNJX_D, match_opcode, 0 },
|
||||
{"fadd.d", "D", "D,S,T", MATCH_FADD_D | MASK_RM, MASK_FADD_D | MASK_RM, match_opcode, 0 },
|
||||
{"fadd.d", "D", "D,S,T,m", MATCH_FADD_D, MASK_FADD_D, match_opcode, 0 },
|
||||
{"fsub.d", "D", "D,S,T", MATCH_FSUB_D | MASK_RM, MASK_FSUB_D | MASK_RM, match_opcode, 0 },
|
||||
{"fsub.d", "D", "D,S,T,m", MATCH_FSUB_D, MASK_FSUB_D, match_opcode, 0 },
|
||||
{"fmul.d", "D", "D,S,T", MATCH_FMUL_D | MASK_RM, MASK_FMUL_D | MASK_RM, match_opcode, 0 },
|
||||
{"fmul.d", "D", "D,S,T,m", MATCH_FMUL_D, MASK_FMUL_D, match_opcode, 0 },
|
||||
{"fdiv.d", "D", "D,S,T", MATCH_FDIV_D | MASK_RM, MASK_FDIV_D | MASK_RM, match_opcode, 0 },
|
||||
{"fdiv.d", "D", "D,S,T,m", MATCH_FDIV_D, MASK_FDIV_D, match_opcode, 0 },
|
||||
{"fsqrt.d", "D", "D,S", MATCH_FSQRT_D | MASK_RM, MASK_FSQRT_D | MASK_RM, match_opcode, 0 },
|
||||
{"fsqrt.d", "D", "D,S,m", MATCH_FSQRT_D, MASK_FSQRT_D, match_opcode, 0 },
|
||||
{"fmin.d", "D", "D,S,T", MATCH_FMIN_D, MASK_FMIN_D, match_opcode, 0 },
|
||||
{"fmax.d", "D", "D,S,T", MATCH_FMAX_D, MASK_FMAX_D, match_opcode, 0 },
|
||||
{"fmadd.d", "D", "D,S,T,R", MATCH_FMADD_D | MASK_RM, MASK_FMADD_D | MASK_RM, match_opcode, 0 },
|
||||
{"fmadd.d", "D", "D,S,T,R,m", MATCH_FMADD_D, MASK_FMADD_D, match_opcode, 0 },
|
||||
{"fnmadd.d", "D", "D,S,T,R", MATCH_FNMADD_D | MASK_RM, MASK_FNMADD_D | MASK_RM, match_opcode, 0 },
|
||||
{"fnmadd.d", "D", "D,S,T,R,m", MATCH_FNMADD_D, MASK_FNMADD_D, match_opcode, 0 },
|
||||
{"fmsub.d", "D", "D,S,T,R", MATCH_FMSUB_D | MASK_RM, MASK_FMSUB_D | MASK_RM, match_opcode, 0 },
|
||||
{"fmsub.d", "D", "D,S,T,R,m", MATCH_FMSUB_D, MASK_FMSUB_D, match_opcode, 0 },
|
||||
{"fnmsub.d", "D", "D,S,T,R", MATCH_FNMSUB_D | MASK_RM, MASK_FNMSUB_D | MASK_RM, match_opcode, 0 },
|
||||
{"fnmsub.d", "D", "D,S,T,R,m", MATCH_FNMSUB_D, MASK_FNMSUB_D, match_opcode, 0 },
|
||||
{"fcvt.w.d", "D", "d,S", MATCH_FCVT_W_D | MASK_RM, MASK_FCVT_W_D | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.w.d", "D", "d,S,m", MATCH_FCVT_W_D, MASK_FCVT_W_D, match_opcode, 0 },
|
||||
{"fcvt.wu.d", "D", "d,S", MATCH_FCVT_WU_D | MASK_RM, MASK_FCVT_WU_D | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.wu.d", "D", "d,S,m", MATCH_FCVT_WU_D, MASK_FCVT_WU_D, match_opcode, 0 },
|
||||
{"fcvt.d.w", "D", "D,s", MATCH_FCVT_D_W, MASK_FCVT_D_W | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.d.wu", "D", "D,s", MATCH_FCVT_D_WU, MASK_FCVT_D_WU | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.d.s", "D", "D,S", MATCH_FCVT_D_S, MASK_FCVT_D_S | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.s.d", "D", "D,S", MATCH_FCVT_S_D | MASK_RM, MASK_FCVT_S_D | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.s.d", "D", "D,S,m", MATCH_FCVT_S_D, MASK_FCVT_S_D, match_opcode, 0 },
|
||||
{"fclass.d", "D", "d,S", MATCH_FCLASS_D, MASK_FCLASS_D, match_opcode, 0 },
|
||||
{"feq.d", "D", "d,S,T", MATCH_FEQ_D, MASK_FEQ_D, match_opcode, 0 },
|
||||
{"flt.d", "D", "d,S,T", MATCH_FLT_D, MASK_FLT_D, match_opcode, 0 },
|
||||
{"fle.d", "D", "d,S,T", MATCH_FLE_D, MASK_FLE_D, match_opcode, 0 },
|
||||
{"fgt.d", "D", "d,T,S", MATCH_FLT_D, MASK_FLT_D, match_opcode, 0 },
|
||||
{"fge.d", "D", "d,T,S", MATCH_FLE_D, MASK_FLE_D, match_opcode, 0 },
|
||||
{"fmv.x.d", "64D", "d,S", MATCH_FMV_X_D, MASK_FMV_X_D, match_opcode, 0 },
|
||||
{"fmv.d.x", "64D", "D,s", MATCH_FMV_D_X, MASK_FMV_D_X, match_opcode, 0 },
|
||||
{"fcvt.l.d", "64D", "d,S", MATCH_FCVT_L_D | MASK_RM, MASK_FCVT_L_D | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.l.d", "64D", "d,S,m", MATCH_FCVT_L_D, MASK_FCVT_L_D, match_opcode, 0 },
|
||||
{"fcvt.lu.d", "64D", "d,S", MATCH_FCVT_LU_D | MASK_RM, MASK_FCVT_LU_D | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.lu.d", "64D", "d,S,m", MATCH_FCVT_LU_D, MASK_FCVT_LU_D, match_opcode, 0 },
|
||||
{"fcvt.d.l", "64D", "D,s", MATCH_FCVT_D_L | MASK_RM, MASK_FCVT_D_L | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.d.l", "64D", "D,s,m", MATCH_FCVT_D_L, MASK_FCVT_D_L, match_opcode, 0 },
|
||||
{"fcvt.d.lu", "64D", "D,s", MATCH_FCVT_D_LU | MASK_RM, MASK_FCVT_D_L | MASK_RM, match_opcode, 0 },
|
||||
{"fcvt.d.lu", "64D", "D,s,m", MATCH_FCVT_D_LU, MASK_FCVT_D_LU, match_opcode, 0 },
|
||||
|
||||
/* Compressed instructions. */
|
||||
{"c.ebreak", "C", "", MATCH_C_EBREAK, MASK_C_EBREAK, match_opcode, 0 },
|
||||
{"c.jr", "C", "d", MATCH_C_JR, MASK_C_JR, match_rd_nonzero, 0 },
|
||||
{"c.jalr", "C", "d", MATCH_C_JALR, MASK_C_JALR, match_rd_nonzero, 0 },
|
||||
{"c.j", "C", "Ca", MATCH_C_J, MASK_C_J, match_opcode, 0 },
|
||||
{"c.jal", "32C", "Ca", MATCH_C_JAL, MASK_C_JAL, match_opcode, 0 },
|
||||
{"c.beqz", "C", "Cs,Cp", MATCH_C_BEQZ, MASK_C_BEQZ, match_opcode, 0 },
|
||||
{"c.bnez", "C", "Cs,Cp", MATCH_C_BNEZ, MASK_C_BNEZ, match_opcode, 0 },
|
||||
{"c.lwsp", "C", "d,Cm(Cc)", MATCH_C_LWSP, MASK_C_LWSP, match_rd_nonzero, 0 },
|
||||
{"c.lw", "C", "Ct,Ck(Cs)", MATCH_C_LW, MASK_C_LW, match_opcode, 0 },
|
||||
{"c.swsp", "C", "CV,CM(Cc)", MATCH_C_SWSP, MASK_C_SWSP, match_opcode, 0 },
|
||||
{"c.sw", "C", "Ct,Ck(Cs)", MATCH_C_SW, MASK_C_SW, match_opcode, 0 },
|
||||
{"c.nop", "C", "", MATCH_C_ADDI, 0xffff, match_opcode, 0 },
|
||||
{"c.mv", "C", "d,CV", MATCH_C_MV, MASK_C_MV, match_c_add, 0 },
|
||||
{"c.lui", "C", "d,Cu", MATCH_C_LUI, MASK_C_LUI, match_c_lui, 0 },
|
||||
{"c.li", "C", "d,Cj", MATCH_C_LI, MASK_C_LI, match_rd_nonzero, 0 },
|
||||
{"c.addi4spn","C", "Ct,Cc,CK", MATCH_C_ADDI4SPN, MASK_C_ADDI4SPN, match_opcode, 0 },
|
||||
{"c.addi16sp","C", "Cc,CL", MATCH_C_ADDI16SP, MASK_C_ADDI16SP, match_opcode, 0 },
|
||||
{"c.addi", "C", "d,Cj", MATCH_C_ADDI, MASK_C_ADDI, match_rd_nonzero, 0 },
|
||||
{"c.add", "C", "d,CV", MATCH_C_ADD, MASK_C_ADD, match_c_add, 0 },
|
||||
{"c.sub", "C", "Cs,Ct", MATCH_C_SUB, MASK_C_SUB, match_opcode, 0 },
|
||||
{"c.and", "C", "Cs,Ct", MATCH_C_AND, MASK_C_AND, match_opcode, 0 },
|
||||
{"c.or", "C", "Cs,Ct", MATCH_C_OR, MASK_C_OR, match_opcode, 0 },
|
||||
{"c.xor", "C", "Cs,Ct", MATCH_C_XOR, MASK_C_XOR, match_opcode, 0 },
|
||||
{"c.slli", "C", "d,C>", MATCH_C_SLLI, MASK_C_SLLI, match_rd_nonzero, 0 },
|
||||
{"c.srli", "C", "Cs,C>", MATCH_C_SRLI, MASK_C_SRLI, match_opcode, 0 },
|
||||
{"c.srai", "C", "Cs,C>", MATCH_C_SRAI, MASK_C_SRAI, match_opcode, 0 },
|
||||
{"c.andi", "C", "Cs,Cj", MATCH_C_ANDI, MASK_C_ANDI, match_opcode, 0 },
|
||||
{"c.addiw", "64C", "d,Cj", MATCH_C_ADDIW, MASK_C_ADDIW, match_rd_nonzero, 0 },
|
||||
{"c.addw", "64C", "Cs,Ct", MATCH_C_ADDW, MASK_C_ADDW, match_opcode, 0 },
|
||||
{"c.subw", "64C", "Cs,Ct", MATCH_C_SUBW, MASK_C_SUBW, match_opcode, 0 },
|
||||
{"c.ldsp", "64C", "d,Cn(Cc)", MATCH_C_LDSP, MASK_C_LDSP, match_rd_nonzero, 0 },
|
||||
{"c.ld", "64C", "Ct,Cl(Cs)", MATCH_C_LD, MASK_C_LD, match_opcode, 0 },
|
||||
{"c.sdsp", "64C", "CV,CN(Cc)", MATCH_C_SDSP, MASK_C_SDSP, match_opcode, 0 },
|
||||
{"c.sd", "64C", "Ct,Cl(Cs)", MATCH_C_SD, MASK_C_SD, match_opcode, 0 },
|
||||
{"c.fldsp", "C", "D,Cn(Cc)", MATCH_C_FLDSP, MASK_C_FLDSP, match_opcode, 0 },
|
||||
{"c.fld", "C", "CD,Cl(Cs)", MATCH_C_FLD, MASK_C_FLD, match_opcode, 0 },
|
||||
{"c.fsdsp", "C", "CT,CN(Cc)", MATCH_C_FSDSP, MASK_C_FSDSP, match_opcode, 0 },
|
||||
{"c.fsd", "C", "CD,Cl(Cs)", MATCH_C_FSD, MASK_C_FSD, match_opcode, 0 },
|
||||
{"c.flwsp", "32C", "D,Cm(Cc)", MATCH_C_FLWSP, MASK_C_FLWSP, match_opcode, 0 },
|
||||
{"c.flw", "32C", "CD,Ck(Cs)", MATCH_C_FLW, MASK_C_FLW, match_opcode, 0 },
|
||||
{"c.fswsp", "32C", "CT,CM(Cc)", MATCH_C_FSWSP, MASK_C_FSWSP, match_opcode, 0 },
|
||||
{"c.fsw", "32C", "CD,Ck(Cs)", MATCH_C_FSW, MASK_C_FSW, match_opcode, 0 },
|
||||
|
||||
/* Supervisor instructions */
|
||||
{"csrr", "I", "d,E", MATCH_CSRRS, MASK_CSRRS | MASK_RS1, match_opcode, 0 },
|
||||
{"csrwi", "I", "E,Z", MATCH_CSRRWI, MASK_CSRRWI | MASK_RD, match_opcode, 0 },
|
||||
{"csrw", "I", "E,s", MATCH_CSRRW, MASK_CSRRW | MASK_RD, match_opcode, 0 },
|
||||
{"csrw", "I", "E,Z", MATCH_CSRRWI, MASK_CSRRWI | MASK_RD, match_opcode, 0 },
|
||||
{"csrsi", "I", "E,Z", MATCH_CSRRSI, MASK_CSRRSI | MASK_RD, match_opcode, 0 },
|
||||
{"csrs", "I", "E,s", MATCH_CSRRS, MASK_CSRRS | MASK_RD, match_opcode, 0 },
|
||||
{"csrs", "I", "E,Z", MATCH_CSRRSI, MASK_CSRRSI | MASK_RD, match_opcode, 0 },
|
||||
{"csrci", "I", "E,Z", MATCH_CSRRCI, MASK_CSRRCI | MASK_RD, match_opcode, 0 },
|
||||
{"csrc", "I", "E,s", MATCH_CSRRC, MASK_CSRRC | MASK_RD, match_opcode, 0 },
|
||||
{"csrc", "I", "E,Z", MATCH_CSRRCI, MASK_CSRRCI | MASK_RD, match_opcode, 0 },
|
||||
{"csrrw", "I", "d,E,s", MATCH_CSRRW, MASK_CSRRW, match_opcode, 0 },
|
||||
{"csrrw", "I", "d,E,Z", MATCH_CSRRWI, MASK_CSRRWI, match_opcode, 0 },
|
||||
{"csrrs", "I", "d,E,s", MATCH_CSRRS, MASK_CSRRS, match_opcode, 0 },
|
||||
{"csrrs", "I", "d,E,Z", MATCH_CSRRSI, MASK_CSRRSI, match_opcode, 0 },
|
||||
{"csrrc", "I", "d,E,s", MATCH_CSRRC, MASK_CSRRC, match_opcode, 0 },
|
||||
{"csrrc", "I", "d,E,Z", MATCH_CSRRCI, MASK_CSRRCI, match_opcode, 0 },
|
||||
{"csrrwi", "I", "d,E,Z", MATCH_CSRRWI, MASK_CSRRWI, match_opcode, 0 },
|
||||
{"csrrsi", "I", "d,E,Z", MATCH_CSRRSI, MASK_CSRRSI, match_opcode, 0 },
|
||||
{"csrrci", "I", "d,E,Z", MATCH_CSRRCI, MASK_CSRRCI, match_opcode, 0 },
|
||||
{"uret", "I", "", MATCH_URET, MASK_URET, match_opcode, 0 },
|
||||
{"sret", "I", "", MATCH_SRET, MASK_SRET, match_opcode, 0 },
|
||||
{"hret", "I", "", MATCH_HRET, MASK_HRET, match_opcode, 0 },
|
||||
{"mret", "I", "", MATCH_MRET, MASK_MRET, match_opcode, 0 },
|
||||
{"dret", "I", "", MATCH_DRET, MASK_DRET, match_opcode, 0 },
|
||||
{"sfence.vm", "I", "", MATCH_SFENCE_VM, MASK_SFENCE_VM | MASK_RS1, match_opcode, 0 },
|
||||
{"sfence.vm", "I", "s", MATCH_SFENCE_VM, MASK_SFENCE_VM, match_opcode, 0 },
|
||||
{"wfi", "I", "", MATCH_WFI, MASK_WFI, match_opcode, 0 },
|
||||
|
||||
/* Terminate the list. */
|
||||
{0, 0, 0, 0, 0, 0, 0}
|
||||
};
|
Loading…
Add table
Reference in a new issue