@@ -131,21 +131,18 @@ pub enum __Feature {
131
131
#[ doc( hidden) ] __NonExhaustive,
132
132
}
133
133
134
+ /// Sets the `bit`-th bit of `x`.
134
135
fn set_bit ( x : usize , bit : u32 ) -> usize {
135
136
debug_assert ! ( 32 > bit) ;
136
137
x | 1 << bit
137
138
}
138
139
140
+ /// Tests the `bit`-th bit of `x`.
139
141
fn test_bit ( x : usize , bit : u32 ) -> bool {
140
142
debug_assert ! ( 32 > bit) ;
141
143
x & ( 1 << bit) != 0
142
144
}
143
145
144
- fn inv_test_bit ( v : usize , idx : u32 ) -> bool {
145
- debug_assert ! ( 32 > idx) ;
146
- ( ( v >> idx) & 1 ) != 0
147
- }
148
-
149
146
/// Run-time feature detection on x86 works by using the CPUID instruction.
150
147
///
151
148
/// The [CPUID Wikipedia page][wiki_cpuid] contains
@@ -174,20 +171,21 @@ fn detect_features() -> usize {
174
171
/// below),
175
172
asm ! ( "cpuid"
176
173
: "={ecx}" ( ecx) , "={edx}" ( edx)
177
- : "{eax}" ( 0x00000001u32 ) , "{ecx}" ( 0 as u32 )
174
+ : "{eax}" ( 0x0000_0001_u32 ) , "{ecx}" ( 0 as u32 )
178
175
: : ) ;
179
176
180
177
/// 2. EAX=7, ECX=0: Queries "Extended Features"
181
178
/// This gives us information about bmi,bmi2, and avx2 support
182
179
/// (see below).
183
180
asm ! ( "cpuid"
184
181
: "={ebx}" ( ebx)
185
- : "{eax}" ( 0x00000007u32 ) , "{ecx}" ( 0 as u32 )
182
+ : "{eax}" ( 0x0000_0007_u32 ) , "{ecx}" ( 0 as u32 )
186
183
: : ) ;
187
184
}
188
185
189
186
let mut value: usize = 0 ;
190
187
188
+ <<<<<<< HEAD
191
189
// CPUID call with EAX=7, ECX=0 => Extended Features in EBX and ECX
192
190
// (the result in ECX is not currently needed):
193
191
if inv_test_bit( ebx , 3 ) {
@@ -235,6 +233,26 @@ fn detect_features() -> usize {
235
233
if inv_test_bit( edx, 26 ) {
236
234
value = set_bit( value, __Feature:: sse2 as u32 ) ;
237
235
}
236
+ =======
237
+ // CPUID call with EAX=7, ECX=0 => Extended Features in EBX and ECX (unneeded):
238
+ if test_bit( ebx, 3 ) { value = set_bit( value, __Feature:: bmi as u32 ) ; }
239
+ if test_bit( ebx, 5 ) { value = set_bit( value, __Feature:: avx2 as u32 ) ; }
240
+ if test_bit( ebx, 8 ) { value = set_bit( value, __Feature:: bmi2 as u32 ) ; }
241
+
242
+ // CPUID call with EAX=1 => feature bits in ECX and EDX:
243
+ if test_bit( ecx, 0 ) { value = set_bit( value, __Feature:: sse3 as u32 ) ; }
244
+ if test_bit( ecx, 5 ) { value = set_bit( value, __Feature:: abm as u32 ) ; }
245
+ if test_bit( ecx, 9 ) { value = set_bit( value, __Feature:: ssse3 as u32 ) ; }
246
+ if test_bit( ecx, 12 ) { value = set_bit( value, __Feature:: fma as u32 ) ; }
247
+ if test_bit( ecx, 19 ) { value = set_bit( value, __Feature:: sse4_1 as u32 ) ; }
248
+ if test_bit( ecx, 20 ) { value = set_bit( value, __Feature:: sse4_2 as u32 ) ; }
249
+ if test_bit( ecx, 21 ) { value = set_bit( value, __Feature:: tbm as u32 ) ; }
250
+ if test_bit( ecx, 23 ) { value = set_bit( value, __Feature:: popcnt as u32 ) ; }
251
+ if test_bit( ecx, 28 ) { value = set_bit( value, __Feature:: avx as u32 ) ; }
252
+
253
+ if test_bit( edx, 25 ) { value = set_bit( value, __Feature:: sse as u32 ) ; }
254
+ if test_bit( edx, 26 ) { value = set_bit( value, __Feature:: sse2 as u32 ) ; }
255
+ >>>>>>> [ clippy] fix clippy issues
238
256
239
257
value
240
258
}
0 commit comments