@@ -85,21 +85,18 @@ pub enum __Feature {
85
85
__NonExhaustive
86
86
}
87
87
88
+ /// Sets the `bit`-th bit of `x`.
88
89
fn set_bit ( x : usize , bit : u32 ) -> usize {
89
90
debug_assert ! ( 32 > bit) ;
90
91
x | 1 << bit
91
92
}
92
93
94
+ /// Tests the `bit`-th bit of `x`.
93
95
fn test_bit ( x : usize , bit : u32 ) -> bool {
94
96
debug_assert ! ( 32 > bit) ;
95
97
x & ( 1 << bit) != 0
96
98
}
97
99
98
- fn inv_test_bit ( v : usize , idx : u32 ) -> bool {
99
- debug_assert ! ( 32 > idx) ;
100
- ( ( v >> idx) & 1 ) != 0
101
- }
102
-
103
100
/// Run-time feature detection on x86 works by using the CPUID instruction.
104
101
///
105
102
/// The [CPUID Wikipedia page](https://en.wikipedia.org/wiki/CPUID) contains all
@@ -122,37 +119,37 @@ fn detect_features() -> usize {
122
119
/// This gives us most of the CPU features in ECX and EDX (see below),
123
120
asm ! ( "cpuid"
124
121
: "={ecx}" ( ecx) , "={edx}" ( edx)
125
- : "{eax}" ( 0x00000001u32 ) , "{ecx}" ( 0 as u32 )
122
+ : "{eax}" ( 0x0000_0001_u32 ) , "{ecx}" ( 0 as u32 )
126
123
: : ) ;
127
124
128
125
/// 2. EAX=7, ECX=0: Queries "Extended Features"
129
126
/// This gives us information about bmi,bmi2, and avx2 support (see below).
130
127
asm ! ( "cpuid"
131
128
: "={ebx}" ( ebx)
132
- : "{eax}" ( 0x00000007u32 ) , "{ecx}" ( 0 as u32 )
129
+ : "{eax}" ( 0x0000_0007_u32 ) , "{ecx}" ( 0 as u32 )
133
130
: : ) ;
134
131
}
135
132
136
133
let mut value: usize = 0 ;
137
134
138
135
// CPUID call with EAX=7, ECX=0 => Extended Features in EBX and ECX (unneeded):
139
- if inv_test_bit ( ebx, 3 ) { value = set_bit ( value, __Feature:: bmi as u32 ) ; }
140
- if inv_test_bit ( ebx, 5 ) { value = set_bit ( value, __Feature:: avx2 as u32 ) ; }
141
- if inv_test_bit ( ebx, 8 ) { value = set_bit ( value, __Feature:: bmi2 as u32 ) ; }
136
+ if test_bit ( ebx, 3 ) { value = set_bit ( value, __Feature:: bmi as u32 ) ; }
137
+ if test_bit ( ebx, 5 ) { value = set_bit ( value, __Feature:: avx2 as u32 ) ; }
138
+ if test_bit ( ebx, 8 ) { value = set_bit ( value, __Feature:: bmi2 as u32 ) ; }
142
139
143
140
// CPUID call with EAX=1 => feature bits in ECX and EDX:
144
- if inv_test_bit ( ecx, 0 ) { value = set_bit ( value, __Feature:: sse3 as u32 ) ; }
145
- if inv_test_bit ( ecx, 5 ) { value = set_bit ( value, __Feature:: abm as u32 ) ; }
146
- if inv_test_bit ( ecx, 9 ) { value = set_bit ( value, __Feature:: ssse3 as u32 ) ; }
147
- if inv_test_bit ( ecx, 12 ) { value = set_bit ( value, __Feature:: fma as u32 ) ; }
148
- if inv_test_bit ( ecx, 19 ) { value = set_bit ( value, __Feature:: sse4_1 as u32 ) ; }
149
- if inv_test_bit ( ecx, 20 ) { value = set_bit ( value, __Feature:: sse4_2 as u32 ) ; }
150
- if inv_test_bit ( ecx, 21 ) { value = set_bit ( value, __Feature:: tbm as u32 ) ; }
151
- if inv_test_bit ( ecx, 23 ) { value = set_bit ( value, __Feature:: popcnt as u32 ) ; }
152
- if inv_test_bit ( ecx, 28 ) { value = set_bit ( value, __Feature:: avx as u32 ) ; }
153
-
154
- if inv_test_bit ( edx, 25 ) { value = set_bit ( value, __Feature:: sse as u32 ) ; }
155
- if inv_test_bit ( edx, 26 ) { value = set_bit ( value, __Feature:: sse2 as u32 ) ; }
141
+ if test_bit ( ecx, 0 ) { value = set_bit ( value, __Feature:: sse3 as u32 ) ; }
142
+ if test_bit ( ecx, 5 ) { value = set_bit ( value, __Feature:: abm as u32 ) ; }
143
+ if test_bit ( ecx, 9 ) { value = set_bit ( value, __Feature:: ssse3 as u32 ) ; }
144
+ if test_bit ( ecx, 12 ) { value = set_bit ( value, __Feature:: fma as u32 ) ; }
145
+ if test_bit ( ecx, 19 ) { value = set_bit ( value, __Feature:: sse4_1 as u32 ) ; }
146
+ if test_bit ( ecx, 20 ) { value = set_bit ( value, __Feature:: sse4_2 as u32 ) ; }
147
+ if test_bit ( ecx, 21 ) { value = set_bit ( value, __Feature:: tbm as u32 ) ; }
148
+ if test_bit ( ecx, 23 ) { value = set_bit ( value, __Feature:: popcnt as u32 ) ; }
149
+ if test_bit ( ecx, 28 ) { value = set_bit ( value, __Feature:: avx as u32 ) ; }
150
+
151
+ if test_bit ( edx, 25 ) { value = set_bit ( value, __Feature:: sse as u32 ) ; }
152
+ if test_bit ( edx, 26 ) { value = set_bit ( value, __Feature:: sse2 as u32 ) ; }
156
153
157
154
value
158
155
}
0 commit comments