OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cpu.h" | 5 #include "cpu.h" |
6 | 6 |
7 #if V8_LIBC_MSVCRT | 7 #if V8_LIBC_MSVCRT |
8 #include <intrin.h> // __cpuid() | 8 #include <intrin.h> // __cpuid() |
9 #endif | 9 #endif |
10 #if V8_OS_POSIX | 10 #if V8_OS_POSIX |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 has_cmov_ = (cpu_info[3] & 0x00008000) != 0; | 293 has_cmov_ = (cpu_info[3] & 0x00008000) != 0; |
294 has_mmx_ = (cpu_info[3] & 0x00800000) != 0; | 294 has_mmx_ = (cpu_info[3] & 0x00800000) != 0; |
295 has_sse_ = (cpu_info[3] & 0x02000000) != 0; | 295 has_sse_ = (cpu_info[3] & 0x02000000) != 0; |
296 has_sse2_ = (cpu_info[3] & 0x04000000) != 0; | 296 has_sse2_ = (cpu_info[3] & 0x04000000) != 0; |
297 has_sse3_ = (cpu_info[2] & 0x00000001) != 0; | 297 has_sse3_ = (cpu_info[2] & 0x00000001) != 0; |
298 has_ssse3_ = (cpu_info[2] & 0x00000200) != 0; | 298 has_ssse3_ = (cpu_info[2] & 0x00000200) != 0; |
299 has_sse41_ = (cpu_info[2] & 0x00080000) != 0; | 299 has_sse41_ = (cpu_info[2] & 0x00080000) != 0; |
300 has_sse42_ = (cpu_info[2] & 0x00100000) != 0; | 300 has_sse42_ = (cpu_info[2] & 0x00100000) != 0; |
301 } | 301 } |
302 | 302 |
| 303 #if V8_HOST_ARCH_IA32 |
| 304 // SAHF is always available in compat/legacy mode, |
| 305 has_sahf_ = true; |
| 306 #else |
303 // Query extended IDs. | 307 // Query extended IDs. |
304 __cpuid(cpu_info, 0x80000000); | 308 __cpuid(cpu_info, 0x80000000); |
305 unsigned num_ext_ids = cpu_info[0]; | 309 unsigned num_ext_ids = cpu_info[0]; |
306 | 310 |
307 // Interpret extended CPU feature information. | 311 // Interpret extended CPU feature information. |
308 if (num_ext_ids > 0x80000000) { | 312 if (num_ext_ids > 0x80000000) { |
309 __cpuid(cpu_info, 0x80000001); | 313 __cpuid(cpu_info, 0x80000001); |
310 // SAHF is always available in compat/legacy mode, | 314 // SAHF must be probed in long mode. |
311 // but must be probed in long mode. | |
312 #if V8_HOST_ARCH_IA32 | |
313 has_sahf_ = true; | |
314 #else | |
315 has_sahf_ = (cpu_info[2] & 0x00000001) != 0; | 315 has_sahf_ = (cpu_info[2] & 0x00000001) != 0; |
| 316 } |
316 #endif | 317 #endif |
317 } | |
318 | 318 |
319 #elif V8_HOST_ARCH_ARM | 319 #elif V8_HOST_ARCH_ARM |
320 | 320 |
321 #if V8_OS_LINUX | 321 #if V8_OS_LINUX |
322 | 322 |
323 CPUInfo cpu_info; | 323 CPUInfo cpu_info; |
324 | 324 |
325 // Extract implementor from the "CPU implementer" field. | 325 // Extract implementor from the "CPU implementer" field. |
326 char* implementer = cpu_info.ExtractField("CPU implementer"); | 326 char* implementer = cpu_info.ExtractField("CPU implementer"); |
327 if (implementer != NULL) { | 327 if (implementer != NULL) { |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 #if V8_OS_WIN | 502 #if V8_OS_WIN |
503 SYSTEM_INFO info; | 503 SYSTEM_INFO info; |
504 GetSystemInfo(&info); | 504 GetSystemInfo(&info); |
505 return info.dwNumberOfProcessors; | 505 return info.dwNumberOfProcessors; |
506 #else | 506 #else |
507 return static_cast<int>(sysconf(_SC_NPROCESSORS_ONLN)); | 507 return static_cast<int>(sysconf(_SC_NPROCESSORS_ONLN)); |
508 #endif | 508 #endif |
509 } | 509 } |
510 | 510 |
511 } } // namespace v8::internal | 511 } } // namespace v8::internal |
OLD | NEW |