@@ -1998,7 +1998,8 @@ struct RISCVHwProbe {
1998
1998
};
1999
1999
const StringMap<bool > sys::getHostCPUFeatures () {
2000
2000
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 }};
2002
2003
int Ret = syscall (/* __NR_riscv_hwprobe=*/ 258 , /* pairs=*/ Query,
2003
2004
/* pair_count=*/ std::size (Query), /* cpu_count=*/ 0 ,
2004
2005
/* cpus=*/ 0 , /* flags=*/ 0 );
@@ -2054,9 +2055,26 @@ const StringMap<bool> sys::getHostCPUFeatures() {
2054
2055
Features[" zicond" ] = ExtMask & (1ULL << 35 ); // RISCV_HWPROBE_EXT_ZICOND
2055
2056
Features[" zihintpause" ] =
2056
2057
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 ;
2060
2078
2061
2079
return Features;
2062
2080
}
0 commit comments