@@ -1998,7 +1998,8 @@ struct RISCVHwProbe {
19981998};
19991999const 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