forked from Imagelibrary/binutils-gdb
RISC-V: Add zifencei and prefixed h class extensions.
bfd/ * elfxx-riscv.c (riscv_parse_std_ext): Stop parsing standard extensions when parsed h keyword. (riscv_get_prefix_class): Support prefixed h class. (riscv_std_h_ext_strtab): Likewise. (riscv_ext_h_valid_p): Likewise. (parse_config): Likewise. (riscv_std_z_ext_strtab): Add zifencei. * elfxx-riscv.h (riscv_isa_ext_class): Add RV_ISA_CLASS_H. gas/ * testsuite/gas/riscv/march-fail-order-z.d: New testcase, check orders of prefixed z extensions. * testsuite/gas/riscv/march-fail-order-z.l: Likewise. * testsuite/gas/riscv/march-fail-single-char-h.d: New testcase. * testsuite/gas/riscv/march-fail-single-char.l: Updated. * testsuite/gas/riscv/march-fail-unknown-h.d: New testcase. * testsuite/gas/riscv/march-fail-unknown.l: Updated. opcodes/ * riscv-opc.c (riscv_ext_version_table): Add zifencei.
This commit is contained in:
@@ -1,3 +1,14 @@
|
||||
2020-12-01 Nelson Chu <nelson.chu@sifive.com>
|
||||
|
||||
* elfxx-riscv.c (riscv_parse_std_ext): Stop parsing standard
|
||||
extensions when parsed h keyword.
|
||||
(riscv_get_prefix_class): Support prefixed h class.
|
||||
(riscv_std_h_ext_strtab): Likewise.
|
||||
(riscv_ext_h_valid_p): Likewise.
|
||||
(parse_config): Likewise.
|
||||
(riscv_std_z_ext_strtab): Add zifencei.
|
||||
* elfxx-riscv.h (riscv_isa_ext_class): Add RV_ISA_CLASS_H.
|
||||
|
||||
2020-12-01 Nelson Chu <nelson.chu@sifive.com>
|
||||
|
||||
* elfxx-riscv.c (riscv_parse_subset): ISA string cannot contain
|
||||
|
||||
@@ -1225,7 +1225,7 @@ riscv_parse_std_ext (riscv_parse_subset_t *rps,
|
||||
|
||||
while (p != NULL && *p != '\0')
|
||||
{
|
||||
if (*p == 'x' || *p == 's' || *p == 'z')
|
||||
if (*p == 'x' || *p == 's' || *p == 'h' || *p == 'z')
|
||||
break;
|
||||
|
||||
if (*p == '_')
|
||||
@@ -1281,6 +1281,7 @@ riscv_get_prefix_class (const char *arch)
|
||||
switch (*arch)
|
||||
{
|
||||
case 's': return RV_ISA_CLASS_S;
|
||||
case 'h': return RV_ISA_CLASS_H;
|
||||
case 'x': return RV_ISA_CLASS_X;
|
||||
case 'z': return RV_ISA_CLASS_Z;
|
||||
default: return RV_ISA_CLASS_UNKNOWN;
|
||||
@@ -1362,6 +1363,7 @@ riscv_parse_prefixed_ext (riscv_parse_subset_t *rps,
|
||||
/* Check that the prefix extension is known.
|
||||
For 'x', anything goes but it cannot simply be 'x'.
|
||||
For 's', it must be known from a list and cannot simply be 's'.
|
||||
For 'h', it must be known from a list and cannot simply be 'h'.
|
||||
For 'z', it must be known from a list and cannot simply be 'z'. */
|
||||
|
||||
/* Check that the extension name is well-formed. */
|
||||
@@ -1432,7 +1434,7 @@ riscv_parse_prefixed_ext (riscv_parse_subset_t *rps,
|
||||
|
||||
static const char * const riscv_std_z_ext_strtab[] =
|
||||
{
|
||||
"zicsr", NULL
|
||||
"zicsr", "zifencei", NULL
|
||||
};
|
||||
|
||||
static const char * const riscv_std_s_ext_strtab[] =
|
||||
@@ -1440,6 +1442,11 @@ static const char * const riscv_std_s_ext_strtab[] =
|
||||
NULL
|
||||
};
|
||||
|
||||
static const char * const riscv_std_h_ext_strtab[] =
|
||||
{
|
||||
NULL
|
||||
};
|
||||
|
||||
/* For the extension `ext`, search through the list of known extensions
|
||||
`known_exts` for a match, and return TRUE if found. */
|
||||
|
||||
@@ -1486,12 +1493,22 @@ riscv_ext_s_valid_p (const char *arg)
|
||||
return riscv_multi_letter_ext_valid_p (arg, riscv_std_s_ext_strtab);
|
||||
}
|
||||
|
||||
/* Predicator function for 'h' prefixed extensions.
|
||||
Only known h-extensions are permitted. */
|
||||
|
||||
static bfd_boolean
|
||||
riscv_ext_h_valid_p (const char *arg)
|
||||
{
|
||||
return riscv_multi_letter_ext_valid_p (arg, riscv_std_h_ext_strtab);
|
||||
}
|
||||
|
||||
/* Parsing order of the prefixed extensions that is specified by
|
||||
the ISA spec. */
|
||||
|
||||
static const riscv_parse_config_t parse_config[] =
|
||||
{
|
||||
{RV_ISA_CLASS_S, "s", riscv_ext_s_valid_p},
|
||||
{RV_ISA_CLASS_H, "h", riscv_ext_h_valid_p},
|
||||
{RV_ISA_CLASS_Z, "z", riscv_ext_z_valid_p},
|
||||
{RV_ISA_CLASS_X, "x", riscv_ext_x_valid_p},
|
||||
{RV_ISA_CLASS_UNKNOWN, NULL, NULL}
|
||||
|
||||
@@ -102,6 +102,7 @@ riscv_estimate_digit (unsigned);
|
||||
typedef enum riscv_isa_ext_class
|
||||
{
|
||||
RV_ISA_CLASS_S,
|
||||
RV_ISA_CLASS_H,
|
||||
RV_ISA_CLASS_Z,
|
||||
RV_ISA_CLASS_X,
|
||||
RV_ISA_CLASS_UNKNOWN
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
2020-12-01 Nelson Chu <nelson.chu@sifive.com>
|
||||
|
||||
* testsuite/gas/riscv/march-fail-order-z.d: New testcase, check
|
||||
orders of prefixed z extensions.
|
||||
* testsuite/gas/riscv/march-fail-order-z.l: Likewise.
|
||||
* testsuite/gas/riscv/march-fail-single-char-h.d: New testcase.
|
||||
* testsuite/gas/riscv/march-fail-single-char.l: Updated.
|
||||
* testsuite/gas/riscv/march-fail-unknown-h.d: New testcase.
|
||||
* testsuite/gas/riscv/march-fail-unknown.l: Updated.
|
||||
|
||||
2020-12-01 Nelson Chu <nelson.chu@sifive.com>
|
||||
|
||||
* testsuite/gas/riscv/march-fail-uppercase-base.d: Updated.
|
||||
|
||||
3
gas/testsuite/gas/riscv/march-fail-order-z.d
Normal file
3
gas/testsuite/gas/riscv/march-fail-order-z.d
Normal file
@@ -0,0 +1,3 @@
|
||||
#as: -march=rv32i_zifencei2p0_zicsr2p0
|
||||
#source: empty.s
|
||||
#error_output: march-fail-order-z.l
|
||||
2
gas/testsuite/gas/riscv/march-fail-order-z.l
Normal file
2
gas/testsuite/gas/riscv/march-fail-order-z.l
Normal file
@@ -0,0 +1,2 @@
|
||||
.*Assembler messages:
|
||||
.*Fatal error: .*z ISA extension `zicsr' is not in alphabetical order. It must come before `zifencei'
|
||||
3
gas/testsuite/gas/riscv/march-fail-single-char-h.d
Normal file
3
gas/testsuite/gas/riscv/march-fail-single-char-h.d
Normal file
@@ -0,0 +1,3 @@
|
||||
#as: -march=rv32ih
|
||||
#source: empty.s
|
||||
#error_output: march-fail-single-char.l
|
||||
@@ -1,2 +1,2 @@
|
||||
.*Assembler messages:
|
||||
.*Fatal error: .*unknown (s|z|x) ISA extension `(s|z|x)'
|
||||
.*Fatal error: .*unknown (s|h|z|x) ISA extension `(s|h|z|x)'
|
||||
|
||||
3
gas/testsuite/gas/riscv/march-fail-unknown-h.d
Normal file
3
gas/testsuite/gas/riscv/march-fail-unknown-h.d
Normal file
@@ -0,0 +1,3 @@
|
||||
#as: -march=rv32ihfoo2p0
|
||||
#source: empty.s
|
||||
#error_output: march-fail-unknown.l
|
||||
@@ -1,2 +1,2 @@
|
||||
.*Assembler messages:
|
||||
.*Fatal error: .*unknown (s|z) ISA extension `(s|z)foo'
|
||||
.*Fatal error: .*unknown (s|h|z) ISA extension `(s|h|z)foo'
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
2020-12-01 Nelson Chu <nelson.chu@sifive.com>
|
||||
|
||||
* riscv-opc.c (riscv_ext_version_table): Add zifencei.
|
||||
|
||||
2020-11-28 Borislav Petkov <bp@suse.de>
|
||||
|
||||
* i386-dis.c (print_insn): Set active_seg_prefix for branch hint insns
|
||||
|
||||
@@ -935,6 +935,9 @@ const struct riscv_ext_version riscv_ext_version_table[] =
|
||||
{"zicsr", ISA_SPEC_CLASS_20191213, 2, 0},
|
||||
{"zicsr", ISA_SPEC_CLASS_20190608, 2, 0},
|
||||
|
||||
{"zifencei", ISA_SPEC_CLASS_20191213, 2, 0},
|
||||
{"zifencei", ISA_SPEC_CLASS_20190608, 2, 0},
|
||||
|
||||
/* Terminate the list. */
|
||||
{NULL, 0, 0, 0}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user