Chromium Code Reviews| 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 "src/base/cpu.h" | 5 #include "src/base/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_LINUX | 10 #if V8_OS_LINUX |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 57 __asm__ volatile ( | 57 __asm__ volatile ( |
| 58 "cpuid \n\t" | 58 "cpuid \n\t" |
| 59 : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3]) | 59 : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3]) |
| 60 : "a"(info_type) | 60 : "a"(info_type) |
| 61 ); | 61 ); |
| 62 #endif // defined(__i386__) && defined(__pic__) | 62 #endif // defined(__i386__) && defined(__pic__) |
| 63 } | 63 } |
| 64 | 64 |
| 65 #endif // !V8_LIBC_MSVCRT | 65 #endif // !V8_LIBC_MSVCRT |
| 66 | 66 |
| 67 static V8_INLINE bool avx_os_support() { | |
|
Benedikt Meurer
2014/11/25 17:32:42
That does not belong here. The CPU class should on
| |
| 68 #if !V8_LIBC_MSVCRT | |
| 69 unsigned int eax, edx; | |
| 70 unsigned int ecx = 0; | |
| 71 __asm__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(ecx)); | |
| 72 return (eax & 0x6) == 0x6; | |
| 73 #else | |
| 74 uint64_t xcrFeatureMask = _xgetbv(_XCR_XFEATURE_ENABLED_MASK); | |
| 75 return (xcrFeatureMask & 0x6) == 0x6; | |
| 76 #endif | |
| 77 } | |
| 78 | |
| 79 | |
| 67 #elif V8_HOST_ARCH_ARM || V8_HOST_ARCH_ARM64 \ | 80 #elif V8_HOST_ARCH_ARM || V8_HOST_ARCH_ARM64 \ |
| 68 || V8_HOST_ARCH_MIPS || V8_HOST_ARCH_MIPS64 | 81 || V8_HOST_ARCH_MIPS || V8_HOST_ARCH_MIPS64 |
| 69 | 82 |
| 70 #if V8_OS_LINUX | 83 #if V8_OS_LINUX |
| 71 | 84 |
| 72 #if V8_HOST_ARCH_ARM | 85 #if V8_HOST_ARCH_ARM |
| 73 | 86 |
| 74 // See <uapi/asm/hwcap.h> kernel header. | 87 // See <uapi/asm/hwcap.h> kernel header. |
| 75 /* | 88 /* |
| 76 * HWCAP flags - for elf_hwcap (in kernel) and AT_HWCAP | 89 * HWCAP flags - for elf_hwcap (in kernel) and AT_HWCAP |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 284 } | 297 } |
| 285 return false; | 298 return false; |
| 286 } | 299 } |
| 287 | 300 |
| 288 #endif // V8_HOST_ARCH_ARM || V8_HOST_ARCH_MIPS || V8_HOST_ARCH_MIPS64 | 301 #endif // V8_HOST_ARCH_ARM || V8_HOST_ARCH_MIPS || V8_HOST_ARCH_MIPS64 |
| 289 | 302 |
| 290 #endif // V8_OS_LINUX | 303 #endif // V8_OS_LINUX |
| 291 | 304 |
| 292 #endif // V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64 | 305 #endif // V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64 |
| 293 | 306 |
| 294 CPU::CPU() : stepping_(0), | 307 CPU::CPU() |
| 295 model_(0), | 308 : stepping_(0), |
| 296 ext_model_(0), | 309 model_(0), |
| 297 family_(0), | 310 ext_model_(0), |
| 298 ext_family_(0), | 311 family_(0), |
| 299 type_(0), | 312 ext_family_(0), |
| 300 implementer_(0), | 313 type_(0), |
| 301 architecture_(0), | 314 implementer_(0), |
| 302 part_(0), | 315 architecture_(0), |
| 303 has_fpu_(false), | 316 part_(0), |
| 304 has_cmov_(false), | 317 has_fpu_(false), |
| 305 has_sahf_(false), | 318 has_cmov_(false), |
| 306 has_mmx_(false), | 319 has_sahf_(false), |
| 307 has_sse_(false), | 320 has_mmx_(false), |
| 308 has_sse2_(false), | 321 has_sse_(false), |
| 309 has_sse3_(false), | 322 has_sse2_(false), |
| 310 has_ssse3_(false), | 323 has_sse3_(false), |
| 311 has_sse41_(false), | 324 has_ssse3_(false), |
| 312 has_sse42_(false), | 325 has_sse41_(false), |
| 313 has_idiva_(false), | 326 has_sse42_(false), |
| 314 has_neon_(false), | 327 has_avx_(false), |
| 315 has_thumb2_(false), | 328 has_fma3_(false), |
| 316 has_vfp_(false), | 329 has_idiva_(false), |
| 317 has_vfp3_(false), | 330 has_neon_(false), |
| 318 has_vfp3_d32_(false), | 331 has_thumb2_(false), |
| 319 is_fp64_mode_(false) { | 332 has_vfp_(false), |
| 333 has_vfp3_(false), | |
| 334 has_vfp3_d32_(false), | |
| 335 is_fp64_mode_(false) { | |
| 320 memcpy(vendor_, "Unknown", 8); | 336 memcpy(vendor_, "Unknown", 8); |
| 321 #if V8_OS_NACL | 337 #if V8_OS_NACL |
| 322 // Portable host shouldn't do feature detection. | 338 // Portable host shouldn't do feature detection. |
| 323 // TODO(jfb): Remove the hardcoded ARM simulator flags in the build, and | 339 // TODO(jfb): Remove the hardcoded ARM simulator flags in the build, and |
| 324 // hardcode them here instead. | 340 // hardcode them here instead. |
| 325 #elif V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64 | 341 #elif V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64 |
| 326 int cpu_info[4]; | 342 int cpu_info[4]; |
| 327 | 343 |
| 328 // __cpuid with an InfoType argument of 0 returns the number of | 344 // __cpuid with an InfoType argument of 0 returns the number of |
| 329 // valid Ids in CPUInfo[0] and the CPU identification string in | 345 // valid Ids in CPUInfo[0] and the CPU identification string in |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 349 ext_family_ = (cpu_info[0] >> 20) & 0xff; | 365 ext_family_ = (cpu_info[0] >> 20) & 0xff; |
| 350 has_fpu_ = (cpu_info[3] & 0x00000001) != 0; | 366 has_fpu_ = (cpu_info[3] & 0x00000001) != 0; |
| 351 has_cmov_ = (cpu_info[3] & 0x00008000) != 0; | 367 has_cmov_ = (cpu_info[3] & 0x00008000) != 0; |
| 352 has_mmx_ = (cpu_info[3] & 0x00800000) != 0; | 368 has_mmx_ = (cpu_info[3] & 0x00800000) != 0; |
| 353 has_sse_ = (cpu_info[3] & 0x02000000) != 0; | 369 has_sse_ = (cpu_info[3] & 0x02000000) != 0; |
| 354 has_sse2_ = (cpu_info[3] & 0x04000000) != 0; | 370 has_sse2_ = (cpu_info[3] & 0x04000000) != 0; |
| 355 has_sse3_ = (cpu_info[2] & 0x00000001) != 0; | 371 has_sse3_ = (cpu_info[2] & 0x00000001) != 0; |
| 356 has_ssse3_ = (cpu_info[2] & 0x00000200) != 0; | 372 has_ssse3_ = (cpu_info[2] & 0x00000200) != 0; |
| 357 has_sse41_ = (cpu_info[2] & 0x00080000) != 0; | 373 has_sse41_ = (cpu_info[2] & 0x00080000) != 0; |
| 358 has_sse42_ = (cpu_info[2] & 0x00100000) != 0; | 374 has_sse42_ = (cpu_info[2] & 0x00100000) != 0; |
| 375 has_avx_ = ((cpu_info[2] & 0x18000000) == 0x18000000) && avx_os_support(); | |
|
Benedikt Meurer
2014/11/25 17:32:42
As mentioned above, remove the avx_os_support here
| |
| 376 if (has_avx_) has_fma3_ = (cpu_info[2] & 0x00001000) != 0; | |
| 359 } | 377 } |
| 360 | 378 |
| 361 #if V8_HOST_ARCH_IA32 | 379 #if V8_HOST_ARCH_IA32 |
| 362 // SAHF is always available in compat/legacy mode, | 380 // SAHF is always available in compat/legacy mode, |
| 363 has_sahf_ = true; | 381 has_sahf_ = true; |
| 364 #else | 382 #else |
| 365 // Query extended IDs. | 383 // Query extended IDs. |
| 366 __cpuid(cpu_info, 0x80000000); | 384 __cpuid(cpu_info, 0x80000000); |
| 367 unsigned num_ext_ids = cpu_info[0]; | 385 unsigned num_ext_ids = cpu_info[0]; |
| 368 | 386 |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 551 if (end == part) { | 569 if (end == part) { |
| 552 part_ = 0; | 570 part_ = 0; |
| 553 } | 571 } |
| 554 delete[] part; | 572 delete[] part; |
| 555 } | 573 } |
| 556 | 574 |
| 557 #endif | 575 #endif |
| 558 } | 576 } |
| 559 | 577 |
| 560 } } // namespace v8::base | 578 } } // namespace v8::base |
| OLD | NEW |