@@ -1988,7 +1988,8 @@ struct RISCVHwProbe {
19881988};
19891989const StringMap<bool > sys::getHostCPUFeatures () {
19901990 RISCVHwProbe Query[]{{/* RISCV_HWPROBE_KEY_BASE_BEHAVIOR=*/ 3 , 0 },
1991- {/* RISCV_HWPROBE_KEY_IMA_EXT_0=*/ 4 , 0 }};
1991+ {/* RISCV_HWPROBE_KEY_IMA_EXT_0=*/ 4 , 0 },
1992+ {/* RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF=*/ 9 , 0 }};
19921993 int Ret = syscall (/* __NR_riscv_hwprobe=*/ 258 , /* pairs=*/ Query,
19931994 /* pair_count=*/ std::size (Query), /* cpu_count=*/ 0 ,
19941995 /* cpus=*/ 0 , /* flags=*/ 0 );
@@ -2044,9 +2045,26 @@ const StringMap<bool> sys::getHostCPUFeatures() {
20442045 Features[" zicond" ] = ExtMask & (1ULL << 35 ); // RISCV_HWPROBE_EXT_ZICOND
20452046 Features[" zihintpause" ] =
20462047 ExtMask & (1ULL << 36 ); // RISCV_HWPROBE_EXT_ZIHINTPAUSE
2047-
2048- // TODO: set unaligned-scalar-mem if RISCV_HWPROBE_KEY_MISALIGNED_PERF returns
2049- // RISCV_HWPROBE_MISALIGNED_FAST.
2048+ Features[" zve32x" ] = ExtMask & (1ULL << 37 ); // RISCV_HWPROBE_EXT_ZVE32X
2049+ Features[" zve32f" ] = ExtMask & (1ULL << 38 ); // RISCV_HWPROBE_EXT_ZVE32F
2050+ Features[" zve64x" ] = ExtMask & (1ULL << 39 ); // RISCV_HWPROBE_EXT_ZVE64X
2051+ Features[" zve64f" ] = ExtMask & (1ULL << 40 ); // RISCV_HWPROBE_EXT_ZVE64F
2052+ Features[" zve64d" ] = ExtMask & (1ULL << 41 ); // RISCV_HWPROBE_EXT_ZVE64D
2053+ Features[" zimop" ] = ExtMask & (1ULL << 42 ); // RISCV_HWPROBE_EXT_ZIMOP
2054+ Features[" zca" ] = ExtMask & (1ULL << 43 ); // RISCV_HWPROBE_EXT_ZCA
2055+ Features[" zcb" ] = ExtMask & (1ULL << 44 ); // RISCV_HWPROBE_EXT_ZCB
2056+ Features[" zcd" ] = ExtMask & (1ULL << 45 ); // RISCV_HWPROBE_EXT_ZCD
2057+ Features[" zcf" ] = ExtMask & (1ULL << 46 ); // RISCV_HWPROBE_EXT_ZCF
2058+ Features[" zcmop" ] = ExtMask & (1ULL << 47 ); // RISCV_HWPROBE_EXT_ZCMOP
2059+ Features[" zawrs" ] = ExtMask & (1ULL << 48 ); // RISCV_HWPROBE_EXT_ZAWRS
2060+
2061+ // Check whether the processor supports fast misaligned scalar memory access.
2062+ // NOTE: RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF is only available on
2063+ // Linux 6.11 or later. If it is not recognized, the key field will be cleared
2064+ // to -1.
2065+ if (Query[2 ].Key != -1 &&
2066+ Query[2 ].Value == /* RISCV_HWPROBE_MISALIGNED_SCALAR_FAST=*/ 3 )
2067+ Features[" unaligned-scalar-mem" ] = true ;
20502068
20512069 return Features;
20522070}
0 commit comments