@@ -1988,7 +1988,8 @@ struct RISCVHwProbe {
1988
1988
};
1989
1989
const StringMap<bool > sys::getHostCPUFeatures () {
1990
1990
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 }};
1992
1993
int Ret = syscall (/* __NR_riscv_hwprobe=*/ 258 , /* pairs=*/ Query,
1993
1994
/* pair_count=*/ std::size (Query), /* cpu_count=*/ 0 ,
1994
1995
/* cpus=*/ 0 , /* flags=*/ 0 );
@@ -2044,9 +2045,26 @@ const StringMap<bool> sys::getHostCPUFeatures() {
2044
2045
Features[" zicond" ] = ExtMask & (1ULL << 35 ); // RISCV_HWPROBE_EXT_ZICOND
2045
2046
Features[" zihintpause" ] =
2046
2047
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 ;
2050
2068
2051
2069
return Features;
2052
2070
}
0 commit comments