riscv-c-api-doc PR #187 defines the RISC-V C API feature bit
for zicfiss as group 1, bit 27. GCC already supports zicfiss,
so add the missing feature-bit metadata and libgcc copy of the
definition.
Upstream Linux exposes zicfiss through RISCV_HWPROBE_KEY_IMA_EXT_1.
Copy the upstream Linux hwprobe constants and map the zicfiss bit
directly to the matching feature bit.
This patch only adds metadata and runtime feature-bit probing. It
does not add ISA extension support.
gcc/ChangeLog:
* common/config/riscv/riscv-ext-bitmask.def: Add zicfiss.
* config/riscv/riscv-ext.def: Add C API bit position for
zicfiss.
libgcc/ChangeLog:
* config/riscv/feature_bits.c (ZICFISS_GROUPID,
ZICFISS_BITMASK, RISCV_HWPROBE_KEY_IMA_EXT_1,
RISCV_HWPROBE_EXT_ZICFISS): Define.
(SET_FROM_IMA_EXT_1): Define.
(__init_riscv_features_bits_linux): Query IMA_EXT_1 and set
zicfiss from the corresponding upstream Linux hwprobe bit.
Signed-off-by: Christoph Müllner <[email protected]>
---
gcc/common/config/riscv/riscv-ext-bitmask.def | 1 +
gcc/config/riscv/riscv-ext.def | 4 ++--
libgcc/config/riscv/feature_bits.c | 11 +++++++++++
3 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/gcc/common/config/riscv/riscv-ext-bitmask.def
b/gcc/common/config/riscv/riscv-ext-bitmask.def
index 315ae8fde08..be12e4bea72 100644
--- a/gcc/common/config/riscv/riscv-ext-bitmask.def
+++ b/gcc/common/config/riscv/riscv-ext-bitmask.def
@@ -98,6 +98,7 @@ RISCV_EXT_BITMASK ("zicbop", 1, 25)
RISCV_EXT_BITMASK ("zilsd", 1, 8)
RISCV_EXT_BITMASK ("zclsd", 1, 9)
RISCV_EXT_BITMASK ("zicfilp", 1, 26)
+RISCV_EXT_BITMASK ("zicfiss", 1, 27)
RISCV_EXT_BITMASK ("zcmp", 1, 10)
RISCV_EXT_BITMASK ("zifencei", 1, 11)
diff --git a/gcc/config/riscv/riscv-ext.def b/gcc/config/riscv/riscv-ext.def
index bfa27e72515..71d34470848 100644
--- a/gcc/config/riscv/riscv-ext.def
+++ b/gcc/config/riscv/riscv-ext.def
@@ -346,8 +346,8 @@ DEFINE_RISCV_EXT(
/* DEP_EXTS */ ({"zicsr", "zimop"}),
/* SUPPORTED_VERSIONS */ ({{1, 0}}),
/* FLAG_GROUP */ zi,
- /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
- /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
+ /* BITMASK_GROUP_ID */ 1,
+ /* BITMASK_BIT_POSITION*/ 27,
/* EXTRA_EXTENSION_FLAGS */ 0)
DEFINE_RISCV_EXT(
diff --git a/libgcc/config/riscv/feature_bits.c
b/libgcc/config/riscv/feature_bits.c
index 367473050b4..8d226502eb7 100644
--- a/libgcc/config/riscv/feature_bits.c
+++ b/libgcc/config/riscv/feature_bits.c
@@ -184,6 +184,8 @@ struct {
#define ZICBOP_BITMASK (1ULL << 25)
#define ZICFILP_GROUPID 1
#define ZICFILP_BITMASK (1ULL << 26)
+#define ZICFISS_GROUPID 1
+#define ZICFISS_BITMASK (1ULL << 27)
#define SET_EXT(EXT) features[EXT##_GROUPID] |= EXT##_BITMASK
@@ -268,6 +270,8 @@ struct {
#define RISCV_HWPROBE_MISALIGNED_UNSUPPORTED (4 << 0)
#define RISCV_HWPROBE_MISALIGNED_MASK (7 << 0)
#define RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE 6
+#define RISCV_HWPROBE_KEY_IMA_EXT_1 16
+#define RISCV_HWPROBE_EXT_ZICFISS (1ULL << 0)
struct riscv_hwprobe {
long long key;
@@ -297,6 +301,9 @@ static long syscall_5_args (long number, long arg1, long
arg2, long arg3,
#define SET_FROM_IMA_EXT(EXT) \
SET_FROM_HWPROBE (hwprobe_ima_ext, EXT)
+#define SET_FROM_IMA_EXT_1(EXT) \
+ SET_FROM_HWPROBE (hwprobe_ima_ext_1, EXT)
+
static void __init_riscv_features_bits_linux ()
{
struct riscv_hwprobe hwprobes[] = {
@@ -305,6 +312,7 @@ static void __init_riscv_features_bits_linux ()
{RISCV_HWPROBE_KEY_MIMPID, 0},
{RISCV_HWPROBE_KEY_BASE_BEHAVIOR, 0},
{RISCV_HWPROBE_KEY_IMA_EXT_0, 0},
+ {RISCV_HWPROBE_KEY_IMA_EXT_1, 0},
};
long res = syscall_5_args (__NR_riscv_hwprobe, (long)&hwprobes,
@@ -443,6 +451,9 @@ static void __init_riscv_features_bits_linux ()
SET_FROM_IMA_EXT (ZCLSD);
SET_FROM_IMA_EXT (ZICFILP);
+ const struct riscv_hwprobe hwprobe_ima_ext_1 = hwprobes[5];
+ SET_FROM_IMA_EXT_1 (ZICFISS);
+
for (i = 0; i < RISCV_FEATURE_BITS_LENGTH; ++i)
__riscv_feature_bits.features[i] = features[i];
--
2.54.0