2
2
3
3
use super :: auxvec;
4
4
use crate :: detect:: { bit, cache, Feature } ;
5
+ use core:: arch:: asm;
5
6
6
7
/// Try to read the features from the auxiliary vector.
7
8
pub ( crate ) fn detect_features ( ) -> cache:: Initializer {
@@ -12,22 +13,42 @@ pub(crate) fn detect_features() -> cache::Initializer {
12
13
}
13
14
} ;
14
15
16
+ // The values are part of the platform-specific [cpucfg]
17
+ //
18
+ // [cpucfg]: LoongArch Reference Manual Volume 1: Basic Architecture v1.1
19
+ let cpucfg2: usize ;
20
+ unsafe {
21
+ asm ! (
22
+ "cpucfg {}, {}" ,
23
+ out( reg) cpucfg2, in( reg) 2 ,
24
+ options( pure, nomem, preserves_flags, nostack)
25
+ ) ;
26
+ }
27
+ enable_feature ( & mut value, Feature :: frecipe, bit:: test ( cpucfg2, 25 ) ) ;
28
+
15
29
// The values are part of the platform-specific [asm/hwcap.h][hwcap]
16
30
//
17
31
// [hwcap]: https://github.com/torvalds/linux/blob/master/arch/loongarch/include/uapi/asm/hwcap.h
18
32
if let Ok ( auxv) = auxvec:: auxv ( ) {
19
- enable_feature ( & mut value, Feature :: lam, bit:: test ( auxv. hwcap , 1 ) ) ;
20
- enable_feature ( & mut value, Feature :: ual, bit:: test ( auxv. hwcap , 2 ) ) ;
21
- enable_feature ( & mut value, Feature :: fpu, bit:: test ( auxv. hwcap , 3 ) ) ;
33
+ enable_feature (
34
+ & mut value,
35
+ Feature :: f,
36
+ bit:: test ( cpucfg2, 1 ) && bit:: test ( auxv. hwcap , 3 ) ,
37
+ ) ;
38
+ enable_feature (
39
+ & mut value,
40
+ Feature :: d,
41
+ bit:: test ( cpucfg2, 2 ) && bit:: test ( auxv. hwcap , 3 ) ,
42
+ ) ;
22
43
enable_feature ( & mut value, Feature :: lsx, bit:: test ( auxv. hwcap , 4 ) ) ;
23
44
enable_feature ( & mut value, Feature :: lasx, bit:: test ( auxv. hwcap , 5 ) ) ;
24
- enable_feature ( & mut value, Feature :: crc32, bit:: test ( auxv. hwcap , 6 ) ) ;
25
- enable_feature ( & mut value, Feature :: complex, bit:: test ( auxv. hwcap , 7 ) ) ;
26
- enable_feature ( & mut value, Feature :: crypto, bit:: test ( auxv. hwcap , 8 ) ) ;
45
+ enable_feature (
46
+ & mut value,
47
+ Feature :: lbt,
48
+ bit:: test ( auxv. hwcap , 10 ) && bit:: test ( auxv. hwcap , 11 ) && bit:: test ( auxv. hwcap , 12 ) ,
49
+ ) ;
27
50
enable_feature ( & mut value, Feature :: lvz, bit:: test ( auxv. hwcap , 9 ) ) ;
28
- enable_feature ( & mut value, Feature :: lbtx86, bit:: test ( auxv. hwcap , 10 ) ) ;
29
- enable_feature ( & mut value, Feature :: lbtarm, bit:: test ( auxv. hwcap , 11 ) ) ;
30
- enable_feature ( & mut value, Feature :: lbtmips, bit:: test ( auxv. hwcap , 12 ) ) ;
51
+ enable_feature ( & mut value, Feature :: ual, bit:: test ( auxv. hwcap , 2 ) ) ;
31
52
return value;
32
53
}
33
54
value
0 commit comments