Skip to content

Commit bf895c7

Browse files
authored
[RISCV] Bump hwprobe support to Linux 6.11 (#108578)
This patch is the follow-up of #94352 with some updates: 1. Add support for more extensions for `zve*`, `zimop`, `zc*`, `zcmop` and `zawrs`. 2. Use `RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF` to check whether the processor supports fast misaligned scalar memory access. #108551 reminds me that the patch https://lore.kernel.org/all/[email protected]/T/ has been merged. Address comment #94352 (comment). References: 1. constants: https://github.com/torvalds/linux/blame/v6.11-rc7/arch/riscv/include/uapi/asm/hwprobe.h 2. https://docs.kernel.org/arch/riscv/hwprobe.html 3. Related commits: 1. `zve*` support: torvalds/linux@de8f828 2. `zimop` support: torvalds/linux@36f8960 3. `zc*` support: torvalds/linux@0ad70db 4. `zcmop` support: torvalds/linux@fc078ea 5. `zawrs` support: torvalds/linux@244c18f 6. scalar misaligned perf: torvalds/linux@c42e2f0 and torvalds/linux@1f52888
1 parent e6549b8 commit bf895c7

File tree

1 file changed

+22
-4
lines changed

1 file changed

+22
-4
lines changed

llvm/lib/TargetParser/Host.cpp

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1998,7 +1998,8 @@ struct RISCVHwProbe {
19981998
};
19991999
const StringMap<bool> sys::getHostCPUFeatures() {
20002000
RISCVHwProbe Query[]{{/*RISCV_HWPROBE_KEY_BASE_BEHAVIOR=*/3, 0},
2001-
{/*RISCV_HWPROBE_KEY_IMA_EXT_0=*/4, 0}};
2001+
{/*RISCV_HWPROBE_KEY_IMA_EXT_0=*/4, 0},
2002+
{/*RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF=*/9, 0}};
20022003
int Ret = syscall(/*__NR_riscv_hwprobe=*/258, /*pairs=*/Query,
20032004
/*pair_count=*/std::size(Query), /*cpu_count=*/0,
20042005
/*cpus=*/0, /*flags=*/0);
@@ -2054,9 +2055,26 @@ const StringMap<bool> sys::getHostCPUFeatures() {
20542055
Features["zicond"] = ExtMask & (1ULL << 35); // RISCV_HWPROBE_EXT_ZICOND
20552056
Features["zihintpause"] =
20562057
ExtMask & (1ULL << 36); // RISCV_HWPROBE_EXT_ZIHINTPAUSE
2057-
2058-
// TODO: set unaligned-scalar-mem if RISCV_HWPROBE_KEY_MISALIGNED_PERF returns
2059-
// RISCV_HWPROBE_MISALIGNED_FAST.
2058+
Features["zve32x"] = ExtMask & (1ULL << 37); // RISCV_HWPROBE_EXT_ZVE32X
2059+
Features["zve32f"] = ExtMask & (1ULL << 38); // RISCV_HWPROBE_EXT_ZVE32F
2060+
Features["zve64x"] = ExtMask & (1ULL << 39); // RISCV_HWPROBE_EXT_ZVE64X
2061+
Features["zve64f"] = ExtMask & (1ULL << 40); // RISCV_HWPROBE_EXT_ZVE64F
2062+
Features["zve64d"] = ExtMask & (1ULL << 41); // RISCV_HWPROBE_EXT_ZVE64D
2063+
Features["zimop"] = ExtMask & (1ULL << 42); // RISCV_HWPROBE_EXT_ZIMOP
2064+
Features["zca"] = ExtMask & (1ULL << 43); // RISCV_HWPROBE_EXT_ZCA
2065+
Features["zcb"] = ExtMask & (1ULL << 44); // RISCV_HWPROBE_EXT_ZCB
2066+
Features["zcd"] = ExtMask & (1ULL << 45); // RISCV_HWPROBE_EXT_ZCD
2067+
Features["zcf"] = ExtMask & (1ULL << 46); // RISCV_HWPROBE_EXT_ZCF
2068+
Features["zcmop"] = ExtMask & (1ULL << 47); // RISCV_HWPROBE_EXT_ZCMOP
2069+
Features["zawrs"] = ExtMask & (1ULL << 48); // RISCV_HWPROBE_EXT_ZAWRS
2070+
2071+
// Check whether the processor supports fast misaligned scalar memory access.
2072+
// NOTE: RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF is only available on
2073+
// Linux 6.11 or later. If it is not recognized, the key field will be cleared
2074+
// to -1.
2075+
if (Query[2].Key != -1 &&
2076+
Query[2].Value == /*RISCV_HWPROBE_MISALIGNED_SCALAR_FAST=*/3)
2077+
Features["unaligned-scalar-mem"] = true;
20602078

20612079
return Features;
20622080
}

0 commit comments

Comments
 (0)