Ping, I will rebase if the change is fine to you, thanks!
On 2023-03-01 09:46 Feng Wang<wangf...@eswincomputing.com> wrote: > >The Mask flag in the single TargetVariable is not enough due to more >and more extensions were added.So I optimize the defination of Mask >flag, please refer to the below case: >There are some new MASK flags for 'v' extension(ZVL32B,ZVL64B,...,ZVL65536B), >but these MASK flags can't store into x_target_flags,because the total number >of MASK flags exceed 32. In this patch we can write it like this in this >scence. > >TargetVariable >int riscv_zvl_flags > >Mask(ZVL32B) in TargetVariable(riscv_zvl_flags) > >The corresponding MASK and TARGET will be automatically generated. > >gcc/ChangeLog: > > * config/riscv/riscv-opts.h Delete below definations > (MASK_ZICSR): Delete; > (MASK_ZIFENCEI): Delete; > (TARGET_ZICSR): Delete; > (TARGET_ZIFENCEI): Delete; > (MASK_ZAWRS): Delete; > (TARGET_ZAWRS): Delete; > (MASK_ZBA): Delete; > (MASK_ZBB): Delete; > (MASK_ZBC): Delete; > (MASK_ZBS): Delete; > (TARGET_ZBA): Delete; > (TARGET_ZBB): Delete; > (TARGET_ZBC): Delete; > (TARGET_ZBS): Delete; > (MASK_ZFINX): Delete; > (MASK_ZDINX): Delete; > (MASK_ZHINX): Delete; > (MASK_ZHINXMIN): Delete; > (TARGET_ZFINX): Delete; > (TARGET_ZDINX): Delete; > (TARGET_ZHINX): Delete; > (TARGET_ZHINXMIN): Delete; > (MASK_ZBKB): Delete; > (MASK_ZBKC): Delete; > (MASK_ZBKX): Delete; > (MASK_ZKNE): Delete; > (MASK_ZKND): Delete; > (MASK_ZKNH): Delete; > (MASK_ZKR): Delete; > (MASK_ZKSED): Delete; > (MASK_ZKSH): Delete; > (MASK_ZKT): Delete; > (TARGET_ZBKB): Delete; > (TARGET_ZBKC): Delete; > (TARGET_ZBKX): Delete; > (TARGET_ZKNE): Delete; > (TARGET_ZKND): Delete; > (TARGET_ZKNH): Delete; > (TARGET_ZKR): Delete; > (TARGET_ZKSED): Delete; > (TARGET_ZKSH): Delete; > (TARGET_ZKT): Delete; > (MASK_VECTOR_ELEN_32): Delete; > (MASK_VECTOR_ELEN_64): Delete; > (MASK_VECTOR_ELEN_FP_32): Delete; > (MASK_VECTOR_ELEN_FP_64): Delete; > (TARGET_VECTOR_ELEN_32): Delete; > (TARGET_VECTOR_ELEN_64): Delete; > (TARGET_VECTOR_ELEN_FP_32): Delete; > (TARGET_VECTOR_ELEN_FP_64): Delete; > (MASK_ZVL32B): Delete; > (MASK_ZVL64B): Delete; > (MASK_ZVL128B): Delete; > (MASK_ZVL256B): Delete; > (MASK_ZVL512B): Delete; > (MASK_ZVL1024B): Delete; > (MASK_ZVL2048B): Delete; > (MASK_ZVL4096B): Delete; > (MASK_ZVL8192B): Delete; > (MASK_ZVL16384B): Delete; > (MASK_ZVL32768B): Delete; > (MASK_ZVL65536B): Delete; > (TARGET_ZVL32B): Delete; > (TARGET_ZVL64B): Delete; > (TARGET_ZVL128B): Delete; > (TARGET_ZVL256B): Delete; > (TARGET_ZVL512B): Delete; > (TARGET_ZVL1024B): Delete; > (TARGET_ZVL2048B): Delete; > (TARGET_ZVL4096B): Delete; > (TARGET_ZVL8192B): Delete; > (TARGET_ZVL16384B): Delete; > (TARGET_ZVL32768B): Delete; > (TARGET_ZVL65536B): Delete; > (MASK_ZICBOZ): Delete; > (MASK_ZICBOM): Delete; > (MASK_ZICBOP): Delete; > (TARGET_ZICBOZ): Delete; > (TARGET_ZICBOM): Delete; > (TARGET_ZICBOP): Delete; > (MASK_ZFHMIN): Delete; > (MASK_ZFH): Delete; > (TARGET_ZFHMIN): Delete; > (TARGET_ZFH): Delete; > (MASK_ZMMUL): Delete; > (TARGET_ZMMUL): Delete; > (MASK_SVINVAL): Delete; > (MASK_SVNAPOT): Delete; > (TARGET_SVINVAL): Delete; > (TARGET_SVNAPOT): Delete; > * config/riscv/riscv.opt: Add new Mask defination. > * opt-functions.awk: Add new function to find the index > of target variable from extra_target_vars. > * opt-read.awk: Add new function to store the Mask flags. > * opth-gen.awk: Add new function to output the defination of > Mask Macro and Target Macro. >--- > gcc/config/riscv/riscv-opts.h | 115 ---------------------------------- > gcc/config/riscv/riscv.opt | 90 ++++++++++++++++++++++++++ > gcc/opt-functions.awk | 11 ++++ > gcc/opt-read.awk | 16 ++++- > gcc/opth-gen.awk | 22 +++++++ > 5 files changed, 138 insertions(+), 116 deletions(-) > >diff --git a/gcc/config/riscv/riscv-opts.h b/gcc/config/riscv/riscv-opts.h >index 25fd85b09b1..7cf28838cb5 100644 >--- a/gcc/config/riscv/riscv-opts.h >+++ b/gcc/config/riscv/riscv-opts.h >@@ -66,121 +66,6 @@ enum stack_protector_guard { > SSP_TLS, /* per-thread canary in TLS block */ > 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) >- >-#define MASK_ZAWRS (1 << 0) >-#define TARGET_ZAWRS ((riscv_za_subext & MASK_ZAWRS) != 0) >- >-#define MASK_ZBA (1 << 0) >-#define MASK_ZBB (1 << 1) >-#define MASK_ZBC (1 << 2) >-#define MASK_ZBS (1 << 3) >- >-#define TARGET_ZBA ((riscv_zb_subext & MASK_ZBA) != 0) >-#define TARGET_ZBB ((riscv_zb_subext & MASK_ZBB) != 0) >-#define TARGET_ZBC ((riscv_zb_subext & MASK_ZBC) != 0) >-#define TARGET_ZBS ((riscv_zb_subext & MASK_ZBS) != 0) >- >-#define MASK_ZFINX (1 << 0) >-#define MASK_ZDINX (1 << 1) >-#define MASK_ZHINX (1 << 2) >-#define MASK_ZHINXMIN (1 << 3) >- >-#define TARGET_ZFINX ((riscv_zinx_subext & MASK_ZFINX) != 0) >-#define TARGET_ZDINX ((riscv_zinx_subext & MASK_ZDINX) != 0) >-#define TARGET_ZHINX ((riscv_zinx_subext & MASK_ZHINX) != 0) >-#define TARGET_ZHINXMIN ((riscv_zinx_subext & MASK_ZHINXMIN) != 0) >- >-#define MASK_ZBKB (1 << 0) >-#define MASK_ZBKC (1 << 1) >-#define MASK_ZBKX (1 << 2) >-#define MASK_ZKNE (1 << 3) >-#define MASK_ZKND (1 << 4) >-#define MASK_ZKNH (1 << 5) >-#define MASK_ZKR (1 << 6) >-#define MASK_ZKSED (1 << 7) >-#define MASK_ZKSH (1 << 8) >-#define MASK_ZKT (1 << 9) >- >-#define TARGET_ZBKB ((riscv_zk_subext & MASK_ZBKB) != 0) >-#define TARGET_ZBKC ((riscv_zk_subext & MASK_ZBKC) != 0) >-#define TARGET_ZBKX ((riscv_zk_subext & MASK_ZBKX) != 0) >-#define TARGET_ZKNE ((riscv_zk_subext & MASK_ZKNE) != 0) >-#define TARGET_ZKND ((riscv_zk_subext & MASK_ZKND) != 0) >-#define TARGET_ZKNH ((riscv_zk_subext & MASK_ZKNH) != 0) >-#define TARGET_ZKR ((riscv_zk_subext & MASK_ZKR) != 0) >-#define TARGET_ZKSED ((riscv_zk_subext & MASK_ZKSED) != 0) >-#define TARGET_ZKSH ((riscv_zk_subext & MASK_ZKSH) != 0) >-#define TARGET_ZKT ((riscv_zk_subext & MASK_ZKT) != 0) >- >-#define MASK_VECTOR_ELEN_32 (1 << 0) >-#define MASK_VECTOR_ELEN_64 (1 << 1) >-#define MASK_VECTOR_ELEN_FP_32 (1 << 2) >-#define MASK_VECTOR_ELEN_FP_64 (1 << 3) >- >-#define TARGET_VECTOR_ELEN_32 \ >- ((riscv_vector_elen_flags & MASK_VECTOR_ELEN_32) != 0) >-#define TARGET_VECTOR_ELEN_64 \ >- ((riscv_vector_elen_flags & MASK_VECTOR_ELEN_64) != 0) >-#define TARGET_VECTOR_ELEN_FP_32 \ >- ((riscv_vector_elen_flags & MASK_VECTOR_ELEN_FP_32) != 0) >-#define TARGET_VECTOR_ELEN_FP_64 \ >- ((riscv_vector_elen_flags & MASK_VECTOR_ELEN_FP_64) != 0) >- >-#define MASK_ZVL32B (1 << 0) >-#define MASK_ZVL64B (1 << 1) >-#define MASK_ZVL128B (1 << 2) >-#define MASK_ZVL256B (1 << 3) >-#define MASK_ZVL512B (1 << 4) >-#define MASK_ZVL1024B (1 << 5) >-#define MASK_ZVL2048B (1 << 6) >-#define MASK_ZVL4096B (1 << 7) >-#define MASK_ZVL8192B (1 << 8) >-#define MASK_ZVL16384B (1 << 9) >-#define MASK_ZVL32768B (1 << 10) >-#define MASK_ZVL65536B (1 << 11) >- >-#define TARGET_ZVL32B ((riscv_zvl_flags & MASK_ZVL32B) != 0) >-#define TARGET_ZVL64B ((riscv_zvl_flags & MASK_ZVL64B) != 0) >-#define TARGET_ZVL128B ((riscv_zvl_flags & MASK_ZVL128B) != 0) >-#define TARGET_ZVL256B ((riscv_zvl_flags & MASK_ZVL256B) != 0) >-#define TARGET_ZVL512B ((riscv_zvl_flags & MASK_ZVL512B) != 0) >-#define TARGET_ZVL1024B ((riscv_zvl_flags & MASK_ZVL1024B) != 0) >-#define TARGET_ZVL2048B ((riscv_zvl_flags & MASK_ZVL2048B) != 0) >-#define TARGET_ZVL4096B ((riscv_zvl_flags & MASK_ZVL4096B) != 0) >-#define TARGET_ZVL8192B ((riscv_zvl_flags & MASK_ZVL8192B) != 0) >-#define TARGET_ZVL16384B ((riscv_zvl_flags & MASK_ZVL16384B) != 0) >-#define TARGET_ZVL32768B ((riscv_zvl_flags & MASK_ZVL32768B) != 0) >-#define TARGET_ZVL65536B ((riscv_zvl_flags & MASK_ZVL65536B) != 0) >- >-#define MASK_ZICBOZ (1 << 0) >-#define MASK_ZICBOM (1 << 1) >-#define MASK_ZICBOP (1 << 2) >- >-#define TARGET_ZICBOZ ((riscv_zicmo_subext & MASK_ZICBOZ) != 0) >-#define TARGET_ZICBOM ((riscv_zicmo_subext & MASK_ZICBOM) != 0) >-#define TARGET_ZICBOP ((riscv_zicmo_subext & MASK_ZICBOP) != 0) >- >-#define MASK_ZFHMIN (1 << 0) >-#define MASK_ZFH (1 << 1) >- >-#define TARGET_ZFHMIN ((riscv_zf_subext & MASK_ZFHMIN) != 0) >-#define TARGET_ZFH ((riscv_zf_subext & MASK_ZFH) != 0) >- >-#define MASK_ZMMUL (1 << 0) >-#define TARGET_ZMMUL ((riscv_zm_subext & MASK_ZMMUL) != 0) >- >-#define MASK_SVINVAL (1 << 0) >-#define MASK_SVNAPOT (1 << 1) >- >-#define TARGET_SVINVAL ((riscv_sv_subext & MASK_SVINVAL) != 0) >-#define TARGET_SVNAPOT ((riscv_sv_subext & MASK_SVNAPOT) != 0) >- > /* Bit of riscv_zvl_flags will set contintuly, N-1 bit will set if N-bit is > set, e.g. MASK_ZVL64B has set then MASK_ZVL32B is set, so we can use > popcount to caclulate the minimal VLEN. */ >diff --git a/gcc/config/riscv/riscv.opt b/gcc/config/riscv/riscv.opt >index 7c3ca48d1cc..77f553356b1 100644 >--- a/gcc/config/riscv/riscv.opt >+++ b/gcc/config/riscv/riscv.opt >@@ -203,36 +203,126 @@ long riscv_stack_protector_guard_offset = 0 > TargetVariable > int riscv_zi_subext > >+Mask(ZICSR) in TargetVariable(riscv_zi_subext) >+ >+Mask(ZIFENCEI) in TargetVariable(riscv_zi_subext) >+ > TargetVariable > int riscv_za_subext > >+Mask(ZAWRS) in TargetVariable(riscv_za_subext) >+ > TargetVariable > int riscv_zb_subext > >+Mask(ZBA) in TargetVariable(riscv_zb_subext) >+ >+Mask(ZBB) in TargetVariable(riscv_zb_subext) >+ >+Mask(ZBC) in TargetVariable(riscv_zb_subext) >+ >+Mask(ZBS) in TargetVariable(riscv_zb_subext) >+ > TargetVariable > int riscv_zinx_subext > >+Mask(ZFINX) in TargetVariable(riscv_zinx_subext) >+ >+Mask(ZDINX) in TargetVariable(riscv_zinx_subext) >+ >+Mask(ZHINX) in TargetVariable(riscv_zinx_subext) >+ >+Mask(ZHINXMIN) in TargetVariable(riscv_zinx_subext) >+ > TargetVariable > int riscv_zk_subext > >+Mask(ZBKB) in TargetVariable(riscv_zk_subext) >+ >+Mask(ZBKC) in TargetVariable(riscv_zk_subext) >+ >+Mask(ZBKX) in TargetVariable(riscv_zk_subext) >+ >+Mask(ZKNE) in TargetVariable(riscv_zk_subext) >+ >+Mask(ZKND) in TargetVariable(riscv_zk_subext) >+ >+Mask(ZKNH) in TargetVariable(riscv_zk_subext) >+ >+Mask(ZKR) in TargetVariable(riscv_zk_subext) >+ >+Mask(ZKSED) in TargetVariable(riscv_zk_subext) >+ >+Mask(ZKSH) in TargetVariable(riscv_zk_subext) >+ >+Mask(ZKT) in TargetVariable(riscv_zk_subext) >+ > TargetVariable > int riscv_vector_elen_flags > >+Mask(VECTOR_ELEN_32) in TargetVariable(riscv_vector_elen_flags) >+ >+Mask(VECTOR_ELEN_64) in TargetVariable(riscv_vector_elen_flags) >+ >+Mask(VECTOR_ELEN_FP_32) in TargetVariable(riscv_vector_elen_flags) >+ >+Mask(VECTOR_ELEN_FP_64) in TargetVariable(riscv_vector_elen_flags) >+ > TargetVariable > int riscv_zvl_flags > >+Mask(ZVL32B) in TargetVariable(riscv_zvl_flags) >+ >+Mask(ZVL64B) in TargetVariable(riscv_zvl_flags) >+ >+Mask(ZVL128B) in TargetVariable(riscv_zvl_flags) >+ >+Mask(ZVL256B) in TargetVariable(riscv_zvl_flags) >+ >+Mask(ZVL512B) in TargetVariable(riscv_zvl_flags) >+ >+Mask(ZVL1024B) in TargetVariable(riscv_zvl_flags) >+ >+Mask(ZVL2048B) in TargetVariable(riscv_zvl_flags) >+ >+Mask(ZVL4096B) in TargetVariable(riscv_zvl_flags) >+ >+Mask(ZVL8192B) in TargetVariable(riscv_zvl_flags) >+ >+Mask(ZVL16384B) in TargetVariable(riscv_zvl_flags) >+ >+Mask(ZVL32768B) in TargetVariable(riscv_zvl_flags) >+ >+Mask(ZVL65536B) in TargetVariable(riscv_zvl_flags) >+ > TargetVariable > int riscv_zicmo_subext > >+Mask(ZICBOZ) in TargetVariable(riscv_zicmo_subext) >+ >+Mask(ZICBOM) in TargetVariable(riscv_zicmo_subext) >+ >+Mask(ZICBOP) in TargetVariable(riscv_zicmo_subext) >+ > TargetVariable > int riscv_zf_subext > >+Mask(ZFHMIN) in TargetVariable(riscv_zf_subext) >+ >+Mask(ZFH) in TargetVariable(riscv_zf_subext) >+ > TargetVariable > int riscv_zm_subext > >+Mask(ZMMUL) in TargetVariable(riscv_zm_subext) >+ > TargetVariable > int riscv_sv_subext > >+Mask(SVINVAL) in TargetVariable(riscv_sv_subext) >+ >+Mask(SVNAPOT) in TargetVariable(riscv_sv_subext) >+ > Enum > Name(isa_spec_class) Type(enum riscv_isa_spec_class) > Supported ISA specs (for use with the -misa-spec= option): >diff --git a/gcc/opt-functions.awk b/gcc/opt-functions.awk >index 2aee0b9f1c3..9d6080d64a8 100644 >--- a/gcc/opt-functions.awk >+++ b/gcc/opt-functions.awk >@@ -387,3 +387,14 @@ function integer_range_info(range_option, init, option, >uinteger_used) > else > return "-1, -1" > } >+ >+# Find the index of target variable from extra_target_vars >+function find_index(var, var_arry, n_var_arry) >+{ >+ for (var_index = 0; var_index < n_var_arry; var_index++) >+ { >+ if (var_arry[var_index] == var) >+ break >+ } >+ return var_index >+} >\ No newline at end of file >diff --git a/gcc/opt-read.awk b/gcc/opt-read.awk >index ce3617c8d4a..ebe48db968b 100644 >--- a/gcc/opt-read.awk >+++ b/gcc/opt-read.awk >@@ -22,6 +22,7 @@ BEGIN { > n_opts = 0 > n_langs = 0 > n_target_save = 0 >+ n_target_vars = 0 > n_extra_vars = 0 > n_extra_target_vars = 0 > n_extra_masks = 0 >@@ -121,7 +122,20 @@ BEGIN { > n_opts++; > } > else { >- extra_masks[n_extra_masks++] = name >+ if($0 ~ "in") >+ { >+ target_var = opt_args("TargetVariable", $1) >+ var_index = find_index(target_var, target_vars, n_target_vars) >+ if (var_index == n_target_vars) >+ { >+ target_vars[n_target_vars++] = target_var >+ } >+ other_masks[var_index][n_other_mask[var_index]++] = name >+ } >+ else >+ { >+ extra_masks[n_extra_masks++] = name >+ } > } > } > } >diff --git a/gcc/opth-gen.awk b/gcc/opth-gen.awk >index 8bba8ec4549..247a9fb8944 100644 >--- a/gcc/opth-gen.awk >+++ b/gcc/opth-gen.awk >@@ -406,6 +406,18 @@ for (i = 0; i < n_extra_masks; i++) { > print "#define MASK_" extra_masks[i] " (1U << " masknum[""]++ ")" > } > >+for (i = 0; i < n_target_vars; i++) >+{ >+ if (find_index(target_vars[i], extra_target_vars, n_extra_target_vars) >== n_extra_target_vars) >+ continue >+ for (j = 0; j < n_other_mask[i]; j++) >+ { >+ print "#define MASK_" other_masks[i][j] " (1U << " >other_masknum[i][""]++ ")" >+ } >+ if (other_masknum[i][""] > 32) >+ print "#error too many target masks for" extra_target_vars[i] >+} >+ > for (var in masknum) { > if (var != "" && host_wide_int[var] == "yes") { > print "#if defined(HOST_BITS_PER_WIDE_INT) && " masknum[var] " > > HOST_BITS_PER_WIDE_INT" >@@ -457,6 +469,16 @@ for (i = 0; i < n_extra_masks; i++) { > print "#define TARGET_" extra_masks[i] \ > " ((target_flags & MASK_" extra_masks[i] ") != 0)" > } >+for (i = 0; i < n_target_vars; i++) >+{ >+ if (find_index(target_vars[i], extra_target_vars, n_extra_target_vars) >== n_extra_target_vars) >+ continue >+ for (j = 0; j < n_other_mask[i]; j++) >+ { >+ print "#define TARGET_" other_masks[i][j] \ >+ " ((" target_vars[i] " & MASK_" other_masks[i][j] ") != 0)" >+ } >+} > print "" > > for (i = 0; i < n_opts; i++) { >-- >2.17.1