diff options
author | Kito Cheng <kito.cheng@sifive.com> | 2020-11-11 14:04:34 +0800 |
---|---|---|
committer | Kito Cheng <kito.cheng@sifive.com> | 2020-11-18 15:02:22 +0800 |
commit | b03be74bad08c382da47e048007a78fa3fb4ef49 (patch) | |
tree | 80fe3a8af8a760238fb992f7859bbc643f428feb /gcc | |
parent | 6a5bb4705fb75fd3afdde938193c59938cc7bfde (diff) | |
download | gcc-b03be74bad08c382da47e048007a78fa3fb4ef49.zip gcc-b03be74bad08c382da47e048007a78fa3fb4ef49.tar.gz gcc-b03be74bad08c382da47e048007a78fa3fb4ef49.tar.bz2 |
RISC-V: Support zicsr and zifencei extension for -march.
- CSR related instructions and fence instructions has to be splitted from
baseline ISA, zicsr and zifencei are corresponding sub-extension.
gcc/ChangeLog:
* common/config/riscv/riscv-common.c (riscv_implied_info):
d and f implied zicsr.
(riscv_ext_flag_table): Handle zicsr and zifencei.
* config/riscv/riscv-opts.h (MASK_ZICSR): New.
(MASK_ZIFENCEI): Ditto.
(TARGET_ZICSR): Ditto.
(TARGET_ZIFENCEI): Ditto.
* config/riscv/riscv.md (clear_cache): Check TARGET_ZIFENCEI.
(fence_i): Ditto.
* config/riscv/riscv.opt (riscv_zi_subext): New.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/arch-8.c: New.
* gcc.target/riscv/attribute-14.c: Ditto.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/common/config/riscv/riscv-common.c | 6 | ||||
-rw-r--r-- | gcc/config/riscv/riscv-opts.h | 6 | ||||
-rw-r--r-- | gcc/config/riscv/riscv.md | 5 | ||||
-rw-r--r-- | gcc/config/riscv/riscv.opt | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/riscv/arch-8.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/riscv/attribute-14.c | 6 |
6 files changed, 29 insertions, 2 deletions
diff --git a/gcc/common/config/riscv/riscv-common.c b/gcc/common/config/riscv/riscv-common.c index f5f7be3..ca88ca1 100644 --- a/gcc/common/config/riscv/riscv-common.c +++ b/gcc/common/config/riscv/riscv-common.c @@ -57,6 +57,8 @@ struct riscv_implied_info_t static const riscv_implied_info_t riscv_implied_info[] = { {"d", "f"}, + {"f", "zicsr"}, + {"d", "zicsr"}, {NULL, NULL} }; @@ -812,6 +814,10 @@ static const riscv_ext_flag_table_t riscv_ext_flag_table[] = {"f", &gcc_options::x_target_flags, MASK_HARD_FLOAT}, {"d", &gcc_options::x_target_flags, MASK_DOUBLE_FLOAT}, {"c", &gcc_options::x_target_flags, MASK_RVC}, + + {"zicsr", &gcc_options::x_riscv_zi_subext, MASK_ZICSR}, + {"zifencei", &gcc_options::x_riscv_zi_subext, MASK_ZIFENCEI}, + {NULL, NULL, 0} }; diff --git a/gcc/config/riscv/riscv-opts.h b/gcc/config/riscv/riscv-opts.h index 2a3f9d9..de8ac0e 100644 --- a/gcc/config/riscv/riscv-opts.h +++ b/gcc/config/riscv/riscv-opts.h @@ -57,4 +57,10 @@ enum stack_protector_guard { SSP_GLOBAL /* global canary */ }; +#define MASK_ZICSR (1 << 0) +#define MASK_ZIFENCEI (1 << 1) + +#define TARGET_ZICSR ((riscv_zi_subext & MASK_ZICSR) != 0) +#define TARGET_ZIFENCEI ((riscv_zi_subext & MASK_ZIFENCEI) != 0) + #endif /* ! GCC_RISCV_OPTS_H */ diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md index f15bad3..254147c 100644 --- a/gcc/config/riscv/riscv.md +++ b/gcc/config/riscv/riscv.md @@ -1543,7 +1543,8 @@ LCT_NORMAL, VOIDmode, operands[0], Pmode, operands[1], Pmode, const0_rtx, Pmode); #else - emit_insn (gen_fence_i ()); + if (TARGET_ZIFENCEI) + emit_insn (gen_fence_i ()); #endif DONE; }) @@ -1555,7 +1556,7 @@ (define_insn "fence_i" [(unspec_volatile [(const_int 0)] UNSPECV_FENCE_I)] - "" + "TARGET_ZIFENCEI" "fence.i") ;; diff --git a/gcc/config/riscv/riscv.opt b/gcc/config/riscv/riscv.opt index 808b4a0..ca2fc7c 100644 --- a/gcc/config/riscv/riscv.opt +++ b/gcc/config/riscv/riscv.opt @@ -183,3 +183,6 @@ Use the given offset for addressing the stack-protector guard. TargetVariable long riscv_stack_protector_guard_offset = 0 + +TargetVariable +int riscv_zi_subext diff --git a/gcc/testsuite/gcc.target/riscv/arch-8.c b/gcc/testsuite/gcc.target/riscv/arch-8.c new file mode 100644 index 0000000..d7760fc --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/arch-8.c @@ -0,0 +1,5 @@ +/* { dg-do compile } */ +/* { dg-options "-O -march=rv32id_zicsr_zifence -mabi=ilp32" } */ +int foo() +{ +} diff --git a/gcc/testsuite/gcc.target/riscv/attribute-14.c b/gcc/testsuite/gcc.target/riscv/attribute-14.c new file mode 100644 index 0000000..4845627 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/attribute-14.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-options "-O -mriscv-attribute -march=rv32if -mabi=ilp32" } */ +int foo() +{ +} +/* { dg-final { scan-assembler ".attribute arch, \"rv32i2p0_f2p0_zicsr2p0\"" } } */ |