RISC-V: Update march parser
- The arch string rule has changed in latest spec, it introduced new multi-letter extension prefix with 'h' and 'z', and drop `sx`. also adjust parsing order for 's' and 'x'. gcc/ChangeLog * riscv-common.c (parse_sv_or_non_std_ext): Rename to parse_multiletter_ext. (parse_multiletter_ext): Add parsing `h` and `z`, drop `sx`, adjust parsing order for 's' and 'x'. gcc/testsuite/ChangeLog * gcc.target/riscv/arch-3.c: Adjust option. * gcc.target/riscv/arch-5.c: New. * gcc.target/riscv/attribute-9.c: Adjust option and test condition.
This commit is contained in:
parent
a4b48fc47c
commit
ca1a9763a1
6 changed files with 45 additions and 26 deletions
|
@ -1,3 +1,10 @@
|
|||
2020-05-19 Kito Cheng <kito.cheng@sifive.com>
|
||||
|
||||
* riscv-common.c (parse_sv_or_non_std_ext): Rename to
|
||||
parse_multiletter_ext.
|
||||
(parse_multiletter_ext): Add parsing `h` and `z`, drop `sx`,
|
||||
adjust parsing order for 's' and 'x'.
|
||||
|
||||
2020-05-19 Richard Biener <rguenther@suse.de>
|
||||
|
||||
* tree-vectorizer.h (_slp_tree::vectype): Add field.
|
||||
|
|
|
@ -70,8 +70,8 @@ private:
|
|||
|
||||
const char *parse_std_ext (const char *);
|
||||
|
||||
const char *parse_sv_or_non_std_ext (const char *, const char *,
|
||||
const char *);
|
||||
const char *parse_multiletter_ext (const char *, const char *,
|
||||
const char *);
|
||||
|
||||
public:
|
||||
~riscv_subset_list ();
|
||||
|
@ -357,7 +357,7 @@ riscv_subset_list::parse_std_ext (const char *p)
|
|||
{
|
||||
char subset[2] = {0, 0};
|
||||
|
||||
if (*p == 'x' || *p == 's')
|
||||
if (*p == 'x' || *p == 's' || *p == 'h' || *p == 'z')
|
||||
break;
|
||||
|
||||
if (*p == '_')
|
||||
|
@ -399,20 +399,20 @@ riscv_subset_list::parse_std_ext (const char *p)
|
|||
return p;
|
||||
}
|
||||
|
||||
/* Parsing function for non-standard and supervisor extensions.
|
||||
/* Parsing function for multi-letter extensions.
|
||||
|
||||
Return Value:
|
||||
Points to the end of extensions.
|
||||
|
||||
Arguments:
|
||||
`p`: Current parsing position.
|
||||
`ext_type`: What kind of extensions, 'x', 's' or 'sx'.
|
||||
`ext_type`: What kind of extensions, 's', 'h', 'z' or 'x'.
|
||||
`ext_type_str`: Full name for kind of extension. */
|
||||
|
||||
const char *
|
||||
riscv_subset_list::parse_sv_or_non_std_ext (const char *p,
|
||||
const char *ext_type,
|
||||
const char *ext_type_str)
|
||||
riscv_subset_list::parse_multiletter_ext (const char *p,
|
||||
const char *ext_type,
|
||||
const char *ext_type_str)
|
||||
{
|
||||
unsigned major_version = 0;
|
||||
unsigned minor_version = 0;
|
||||
|
@ -429,11 +429,6 @@ riscv_subset_list::parse_sv_or_non_std_ext (const char *p,
|
|||
if (strncmp (p, ext_type, ext_type_len) != 0)
|
||||
break;
|
||||
|
||||
/* It's non-standard supervisor extension if it prefix with sx. */
|
||||
if ((ext_type[0] == 's') && (ext_type_len == 1)
|
||||
&& (*(p + 1) == 'x'))
|
||||
break;
|
||||
|
||||
char *subset = xstrdup (p);
|
||||
char *q = subset;
|
||||
const char *end_of_version;
|
||||
|
@ -491,24 +486,29 @@ riscv_subset_list::parse (const char *arch, location_t loc)
|
|||
/* Parsing standard extension. */
|
||||
p = subset_list->parse_std_ext (p);
|
||||
|
||||
if (p == NULL)
|
||||
goto fail;
|
||||
|
||||
/* Parsing non-standard extension. */
|
||||
p = subset_list->parse_sv_or_non_std_ext (p, "x", "non-standard extension");
|
||||
|
||||
if (p == NULL)
|
||||
goto fail;
|
||||
|
||||
/* Parsing supervisor extension. */
|
||||
p = subset_list->parse_sv_or_non_std_ext (p, "s", "supervisor extension");
|
||||
p = subset_list->parse_multiletter_ext (p, "s", "supervisor extension");
|
||||
|
||||
if (p == NULL)
|
||||
goto fail;
|
||||
|
||||
/* Parsing non-standard supervisor extension. */
|
||||
p = subset_list->parse_sv_or_non_std_ext
|
||||
(p, "sx", "non-standard supervisor extension");
|
||||
/* Parsing hypervisor extension. */
|
||||
p = subset_list->parse_multiletter_ext (p, "h", "hypervisor extension");
|
||||
|
||||
if (p == NULL)
|
||||
goto fail;
|
||||
|
||||
/* Parsing sub-extensions. */
|
||||
p = subset_list->parse_multiletter_ext (p, "z", "sub-extension");
|
||||
|
||||
if (p == NULL)
|
||||
goto fail;
|
||||
|
||||
/* Parsing non-standard extension. */
|
||||
p = subset_list->parse_multiletter_ext (p, "x", "non-standard extension");
|
||||
|
||||
if (p == NULL)
|
||||
goto fail;
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
2020-05-19 Kito Cheng <kito.cheng@sifive.com>
|
||||
|
||||
* gcc.target/riscv/arch-3.c: Adjust option.
|
||||
* gcc.target/riscv/arch-5.c: New.
|
||||
* gcc.target/riscv/attribute-9.c: Adjust option and test
|
||||
condition.
|
||||
|
||||
2020-05-19 Patrick Palka <ppalka@redhat.com>
|
||||
|
||||
PR c++/66439
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O -march=rv32ixbar_sabc_sxfoo -mabi=ilp32" } */
|
||||
/* { dg-options "-O -march=rv32isabc_xbar -mabi=ilp32" } */
|
||||
int foo()
|
||||
{
|
||||
}
|
||||
|
|
5
gcc/testsuite/gcc.target/riscv/arch-5.c
Normal file
5
gcc/testsuite/gcc.target/riscv/arch-5.c
Normal file
|
@ -0,0 +1,5 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O -march=rv32isabc_hghi_zfoo_xbar -mabi=ilp32" } */
|
||||
int foo()
|
||||
{
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O -mriscv-attribute -march=rv32i2p0xbar_sabc_sxfoo -mabi=ilp32e" } */
|
||||
/* { dg-options "-O -mriscv-attribute -march=rv32i2p0sabc_xbar -mabi=ilp32e" } */
|
||||
int foo()
|
||||
{
|
||||
}
|
||||
/* { dg-final { scan-assembler ".attribute arch, \"rv32i2p0_xbar2p0_sabc2p0_sxfoo2p0\"" } } */
|
||||
/* { dg-final { scan-assembler ".attribute arch, \"rv32i2p0_sabc2p0_xbar2p0\"" } } */
|
||||
|
|
Loading…
Add table
Reference in a new issue