@@ -1969,7 +1969,8 @@ struct RISCVHwProbe {
19691969};
19701970const StringMap<bool > sys::getHostCPUFeatures () {
19711971 RISCVHwProbe Query[]{{/* RISCV_HWPROBE_KEY_BASE_BEHAVIOR=*/ 3 , 0 },
1972- {/* RISCV_HWPROBE_KEY_IMA_EXT_0=*/ 4 , 0 }};
1972+ {/* RISCV_HWPROBE_KEY_IMA_EXT_0=*/ 4 , 0 },
1973+ {/* RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF=*/ 9 , 0 }};
19731974 int Ret = syscall (/* __NR_riscv_hwprobe=*/ 258 , /* pairs=*/ Query,
19741975 /* pair_count=*/ std::size (Query), /* cpu_count=*/ 0 ,
19751976 /* cpus=*/ 0 , /* flags=*/ 0 );
@@ -2026,9 +2027,26 @@ const StringMap<bool> sys::getHostCPUFeatures() {
20262027 Features[" zicond" ] = ExtMask & (1ULL << 35 ); // RISCV_HWPROBE_EXT_ZICOND
20272028 Features[" zihintpause" ] =
20282029 ExtMask & (1ULL << 36 ); // RISCV_HWPROBE_EXT_ZIHINTPAUSE
2029-
2030- // TODO: set unaligned-scalar-mem if RISCV_HWPROBE_KEY_MISALIGNED_PERF returns
2031- // RISCV_HWPROBE_MISALIGNED_FAST.
2030+ Features[" zve32x" ] = ExtMask & (1ULL << 37 ); // RISCV_HWPROBE_EXT_ZVE32X
2031+ Features[" zve32f" ] = ExtMask & (1ULL << 38 ); // RISCV_HWPROBE_EXT_ZVE32F
2032+ Features[" zve64x" ] = ExtMask & (1ULL << 39 ); // RISCV_HWPROBE_EXT_ZVE64X
2033+ Features[" zve64f" ] = ExtMask & (1ULL << 40 ); // RISCV_HWPROBE_EXT_ZVE64F
2034+ Features[" zve64d" ] = ExtMask & (1ULL << 41 ); // RISCV_HWPROBE_EXT_ZVE64D
2035+ Features[" zimop" ] = ExtMask & (1ULL << 42 ); // RISCV_HWPROBE_EXT_ZIMOP
2036+ Features[" zca" ] = ExtMask & (1ULL << 43 ); // RISCV_HWPROBE_EXT_ZCA
2037+ Features[" zcb" ] = ExtMask & (1ULL << 44 ); // RISCV_HWPROBE_EXT_ZCB
2038+ Features[" zcd" ] = ExtMask & (1ULL << 45 ); // RISCV_HWPROBE_EXT_ZCD
2039+ Features[" zcf" ] = ExtMask & (1ULL << 46 ); // RISCV_HWPROBE_EXT_ZCF
2040+ Features[" zcmop" ] = ExtMask & (1ULL << 47 ); // RISCV_HWPROBE_EXT_ZCMOP
2041+ Features[" zawrs" ] = ExtMask & (1ULL << 48 ); // RISCV_HWPROBE_EXT_ZAWRS
2042+
2043+ // Check whether the processor supports fast misaligned scalar memory access.
2044+ // NOTE: RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF is only available on
2045+ // Linux 6.11 or later. If it is not recognized, the key field will be cleared
2046+ // to -1.
2047+ if (Query[2 ].Key != -1 &&
2048+ Query[2 ].Value == /* RISCV_HWPROBE_MISALIGNED_SCALAR_FAST=*/ 3 )
2049+ Features[" unaligned-scalar-mem" ] = true ;
20322050
20332051 return Features;
20342052}
0 commit comments