mirror of
https://github.com/google/cpu_features.git
synced 2025-04-27 15:12:30 +02:00
Add RISCV vector extension (#289)
Co-authored-by: Michael Roe <michael-roe@users.noreply.github.com>
This commit is contained in:
parent
5607a689e0
commit
75ec988188
@ -36,6 +36,7 @@ typedef struct {
|
|||||||
int D : 1; // Standard Extension for Double-Precision Floating-Point
|
int D : 1; // Standard Extension for Double-Precision Floating-Point
|
||||||
int Q : 1; // Standard Extension for Quad-Precision Floating-Point
|
int Q : 1; // Standard Extension for Quad-Precision Floating-Point
|
||||||
int C : 1; // Standard Extension for Compressed Instructions
|
int C : 1; // Standard Extension for Compressed Instructions
|
||||||
|
int V : 1; // Standard Extension for Vector Instructions
|
||||||
int Zicsr : 1; // Control and Status Register (CSR)
|
int Zicsr : 1; // Control and Status Register (CSR)
|
||||||
int Zifencei : 1; // Instruction-Fetch Fence
|
int Zifencei : 1; // Instruction-Fetch Fence
|
||||||
} RiscvFeatures;
|
} RiscvFeatures;
|
||||||
@ -55,6 +56,7 @@ typedef enum {
|
|||||||
RISCV_D,
|
RISCV_D,
|
||||||
RISCV_Q,
|
RISCV_Q,
|
||||||
RISCV_C,
|
RISCV_C,
|
||||||
|
RISCV_V,
|
||||||
RISCV_Zicsr,
|
RISCV_Zicsr,
|
||||||
RISCV_Zifencei,
|
RISCV_Zifencei,
|
||||||
RISCV_LAST_,
|
RISCV_LAST_,
|
||||||
|
@ -214,6 +214,7 @@ CPU_FEATURES_START_CPP_NAMESPACE
|
|||||||
#define RISCV_HWCAP_D (1UL << ('D' - 'A'))
|
#define RISCV_HWCAP_D (1UL << ('D' - 'A'))
|
||||||
#define RISCV_HWCAP_Q (1UL << ('Q' - 'A'))
|
#define RISCV_HWCAP_Q (1UL << ('Q' - 'A'))
|
||||||
#define RISCV_HWCAP_C (1UL << ('C' - 'A'))
|
#define RISCV_HWCAP_C (1UL << ('C' - 'A'))
|
||||||
|
#define RISCV_HWCAP_V (1UL << ('V' - 'A'))
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned long hwcaps;
|
unsigned long hwcaps;
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
LINE(RISCV_D, D, "d", RISCV_HWCAP_D, 0) \
|
LINE(RISCV_D, D, "d", RISCV_HWCAP_D, 0) \
|
||||||
LINE(RISCV_Q, Q, "q", RISCV_HWCAP_Q, 0) \
|
LINE(RISCV_Q, Q, "q", RISCV_HWCAP_Q, 0) \
|
||||||
LINE(RISCV_C, C, "c", RISCV_HWCAP_C, 0) \
|
LINE(RISCV_C, C, "c", RISCV_HWCAP_C, 0) \
|
||||||
|
LINE(RISCV_V, V, "v", RISCV_HWCAP_V, 0) \
|
||||||
LINE(RISCV_Zicsr, Zicsr, "_zicsr", 0, 0) \
|
LINE(RISCV_Zicsr, Zicsr, "_zicsr", 0, 0) \
|
||||||
LINE(RISCV_Zifencei, Zifencei, "_zifencei", 0, 0)
|
LINE(RISCV_Zifencei, Zifencei, "_zifencei", 0, 0)
|
||||||
#define INTROSPECTION_PREFIX Riscv
|
#define INTROSPECTION_PREFIX Riscv
|
||||||
|
@ -41,6 +41,7 @@ uarch : thead,c906)");
|
|||||||
EXPECT_TRUE(info.features.D);
|
EXPECT_TRUE(info.features.D);
|
||||||
EXPECT_FALSE(info.features.Q);
|
EXPECT_FALSE(info.features.Q);
|
||||||
EXPECT_TRUE(info.features.C);
|
EXPECT_TRUE(info.features.C);
|
||||||
|
EXPECT_FALSE(info.features.V);
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://github.com/ThomasKaiser/sbc-bench/blob/284e82b016ec1beeac42a5fcbe556b670f68441a/results/Kendryte-K510-4.17.0.cpuinfo
|
// https://github.com/ThomasKaiser/sbc-bench/blob/284e82b016ec1beeac42a5fcbe556b670f68441a/results/Kendryte-K510-4.17.0.cpuinfo
|
||||||
@ -67,6 +68,7 @@ mmu : sv39");
|
|||||||
EXPECT_TRUE(info.features.D);
|
EXPECT_TRUE(info.features.D);
|
||||||
EXPECT_FALSE(info.features.Q);
|
EXPECT_FALSE(info.features.Q);
|
||||||
EXPECT_TRUE(info.features.C);
|
EXPECT_TRUE(info.features.C);
|
||||||
|
EXPECT_FALSE(info.features.V);
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://github.com/ThomasKaiser/sbc-bench/blob/284e82b016ec1beeac42a5fcbe556b670f68441a/results/T-Head-C910-5.10.4.cpuinfo
|
// https://github.com/ThomasKaiser/sbc-bench/blob/284e82b016ec1beeac42a5fcbe556b670f68441a/results/T-Head-C910-5.10.4.cpuinfo
|
||||||
@ -109,6 +111,7 @@ cpu-vector : 0.7.1");
|
|||||||
EXPECT_TRUE(info.features.D);
|
EXPECT_TRUE(info.features.D);
|
||||||
EXPECT_FALSE(info.features.Q);
|
EXPECT_FALSE(info.features.Q);
|
||||||
EXPECT_TRUE(info.features.C);
|
EXPECT_TRUE(info.features.C);
|
||||||
|
EXPECT_FALSE(info.features.V);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(CpuinfoRiscvTest, UnknownFromCpuInfo) {
|
TEST(CpuinfoRiscvTest, UnknownFromCpuInfo) {
|
||||||
@ -150,6 +153,27 @@ uarch : sifive,bullet0)");
|
|||||||
EXPECT_TRUE(info.features.D);
|
EXPECT_TRUE(info.features.D);
|
||||||
EXPECT_FALSE(info.features.Q);
|
EXPECT_FALSE(info.features.Q);
|
||||||
EXPECT_TRUE(info.features.C);
|
EXPECT_TRUE(info.features.C);
|
||||||
|
EXPECT_FALSE(info.features.V);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(CpuinfoRiscvTest, QemuCpuInfo) {
|
||||||
|
ResetHwcaps();
|
||||||
|
auto& fs = GetEmptyFilesystem();
|
||||||
|
fs.CreateFile("/proc/cpuinfo", R"(
|
||||||
|
processor : 0
|
||||||
|
hart : 0
|
||||||
|
isa : rv64imafdcvh_zba_zbb_zbc_zbs
|
||||||
|
mmu : sv48)");
|
||||||
|
const auto info = GetRiscvInfo();
|
||||||
|
EXPECT_FALSE(info.features.RV32I);
|
||||||
|
EXPECT_TRUE(info.features.RV64I);
|
||||||
|
EXPECT_TRUE(info.features.M);
|
||||||
|
EXPECT_TRUE(info.features.A);
|
||||||
|
EXPECT_TRUE(info.features.F);
|
||||||
|
EXPECT_TRUE(info.features.D);
|
||||||
|
EXPECT_FALSE(info.features.Q);
|
||||||
|
EXPECT_TRUE(info.features.C);
|
||||||
|
EXPECT_TRUE(info.features.V);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
Loading…
x
Reference in New Issue
Block a user