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_POSIX | 10 #if V8_OS_POSIX |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
49 __asm__ volatile ( | 49 __asm__ volatile ( |
50 "cpuid \n\t" | 50 "cpuid \n\t" |
51 : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3]) | 51 : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3]) |
52 : "a"(info_type) | 52 : "a"(info_type) |
53 ); | 53 ); |
54 #endif // defined(__i386__) && defined(__pic__) | 54 #endif // defined(__i386__) && defined(__pic__) |
55 } | 55 } |
56 | 56 |
57 #endif // !V8_LIBC_MSVCRT | 57 #endif // !V8_LIBC_MSVCRT |
58 | 58 |
59 #elif V8_HOST_ARCH_ARM || V8_HOST_ARCH_ARM64 || V8_HOST_ARCH_MIPS | 59 #elif V8_HOST_ARCH_ARM || V8_HOST_ARCH_ARM64 \ |
60 || V8_HOST_ARCH_MIPS || V8_HOST_ARCH_MIPS64 | |
60 | 61 |
61 #if V8_OS_LINUX | 62 #if V8_OS_LINUX |
62 | 63 |
63 #if V8_HOST_ARCH_ARM | 64 #if V8_HOST_ARCH_ARM |
64 | 65 |
65 // See <uapi/asm/hwcap.h> kernel header. | 66 // See <uapi/asm/hwcap.h> kernel header. |
66 /* | 67 /* |
67 * HWCAP flags - for elf_hwcap (in kernel) and AT_HWCAP | 68 * HWCAP flags - for elf_hwcap (in kernel) and AT_HWCAP |
68 */ | 69 */ |
69 #define HWCAP_SWP (1 << 0) | 70 #define HWCAP_SWP (1 << 0) |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
199 result[len] = '\0'; | 200 result[len] = '\0'; |
200 } | 201 } |
201 return result; | 202 return result; |
202 } | 203 } |
203 | 204 |
204 private: | 205 private: |
205 char* data_; | 206 char* data_; |
206 size_t datalen_; | 207 size_t datalen_; |
207 }; | 208 }; |
208 | 209 |
209 #if V8_HOST_ARCH_ARM || V8_HOST_ARCH_MIPS | 210 #if V8_HOST_ARCH_ARM || V8_HOST_ARCH_MIPS || V8_HOST_ARCH_MIPS64 |
210 | 211 |
211 // Checks that a space-separated list of items contains one given 'item'. | 212 // Checks that a space-separated list of items contains one given 'item'. |
212 static bool HasListItem(const char* list, const char* item) { | 213 static bool HasListItem(const char* list, const char* item) { |
213 ssize_t item_len = strlen(item); | 214 ssize_t item_len = strlen(item); |
214 const char* p = list; | 215 const char* p = list; |
215 if (p != NULL) { | 216 if (p != NULL) { |
216 while (*p != '\0') { | 217 while (*p != '\0') { |
217 // Skip whitespace. | 218 // Skip whitespace. |
218 while (isspace(*p)) ++p; | 219 while (isspace(*p)) ++p; |
219 | 220 |
220 // Find end of current list item. | 221 // Find end of current list item. |
221 const char* q = p; | 222 const char* q = p; |
222 while (*q != '\0' && !isspace(*q)) ++q; | 223 while (*q != '\0' && !isspace(*q)) ++q; |
223 | 224 |
224 if (item_len == q - p && memcmp(p, item, item_len) == 0) { | 225 if (item_len == q - p && memcmp(p, item, item_len) == 0) { |
225 return true; | 226 return true; |
226 } | 227 } |
227 | 228 |
228 // Skip to next item. | 229 // Skip to next item. |
229 p = q; | 230 p = q; |
230 } | 231 } |
231 } | 232 } |
232 return false; | 233 return false; |
233 } | 234 } |
234 | 235 |
235 #endif // V8_HOST_ARCH_ARM || V8_HOST_ARCH_MIPS | 236 #endif // V8_HOST_ARCH_ARM || V8_HOST_ARCH_MIPS || V8_HOST_ARCH_MIPS64 |
236 | 237 |
237 #endif // V8_OS_LINUX | 238 #endif // V8_OS_LINUX |
238 | 239 |
239 #endif // V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64 | 240 #endif // V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64 |
240 | 241 |
241 CPU::CPU() : stepping_(0), | 242 CPU::CPU() : stepping_(0), |
242 model_(0), | 243 model_(0), |
243 ext_model_(0), | 244 ext_model_(0), |
244 family_(0), | 245 family_(0), |
245 ext_family_(0), | 246 ext_family_(0), |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
447 has_neon_ = true; | 448 has_neon_ = true; |
448 has_vfp3_ = has_vfp_; | 449 has_vfp3_ = has_vfp_; |
449 #ifdef ARM_CPU_FLAG_VFP_D32 | 450 #ifdef ARM_CPU_FLAG_VFP_D32 |
450 has_vfp3_d32_ = (cpu_flags & ARM_CPU_FLAG_VFP_D32) != 0; | 451 has_vfp3_d32_ = (cpu_flags & ARM_CPU_FLAG_VFP_D32) != 0; |
451 #endif | 452 #endif |
452 } | 453 } |
453 has_idiva_ = (cpu_flags & ARM_CPU_FLAG_IDIV) != 0; | 454 has_idiva_ = (cpu_flags & ARM_CPU_FLAG_IDIV) != 0; |
454 | 455 |
455 #endif // V8_OS_LINUX | 456 #endif // V8_OS_LINUX |
456 | 457 |
457 #elif V8_HOST_ARCH_MIPS | 458 #elif V8_HOST_ARCH_MIPS || V8_HOST_ARCH_MIPS64 |
danno
2014/07/08 09:01:19
Please add the deleted line in again below.
dusmil
2014/07/08 11:03:41
Done.
| |
458 | |
459 // Simple detection of FPU at runtime for Linux. | 459 // Simple detection of FPU at runtime for Linux. |
460 // It is based on /proc/cpuinfo, which reveals hardware configuration | 460 // It is based on /proc/cpuinfo, which reveals hardware configuration |
461 // to user-space applications. According to MIPS (early 2010), no similar | 461 // to user-space applications. According to MIPS (early 2010), no similar |
462 // facility is universally available on the MIPS architectures, | 462 // facility is universally available on the MIPS architectures, |
463 // so it's up to individual OSes to provide such. | 463 // so it's up to individual OSes to provide such. |
464 CPUInfo cpu_info; | 464 CPUInfo cpu_info; |
465 char* cpu_model = cpu_info.ExtractField("cpu model"); | 465 char* cpu_model = cpu_info.ExtractField("cpu model"); |
466 has_fpu_ = HasListItem(cpu_model, "FPU"); | 466 has_fpu_ = HasListItem(cpu_model, "FPU"); |
467 delete[] cpu_model; | 467 delete[] cpu_model; |
468 | 468 |
(...skipping 20 matching lines...) Expand all Loading... | |
489 if (end == part) { | 489 if (end == part) { |
490 part_ = 0; | 490 part_ = 0; |
491 } | 491 } |
492 delete[] part; | 492 delete[] part; |
493 } | 493 } |
494 | 494 |
495 #endif | 495 #endif |
496 } | 496 } |
497 | 497 |
498 } } // namespace v8::base | 498 } } // namespace v8::base |
OLD | NEW |