Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Side by Side Diff: runtime/vm/cpuinfo_win.cc

Issue 120723003: Refactors CPU feature detection. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 #include "vm/globals.h"
6 #if defined(TARGET_OS_WINDOWS)
7
8 #include "vm/cpuinfo.h"
9
10 // __cpuid()
11 #include <intrin.h> // NOLINT
12 #include <string.h> // NOLINT
13
14 #include "platform/assert.h"
15
16 namespace dart {
17
18 struct CpuIdData {
19 static bool sse2;
20 static bool sse41;
21 static char* id_string;
22 static char* brand_string;
23 };
24
25
26 char* CpuInfo::data_ = NULL;
27 intptr_t CpuInfo::datalen_ = 0;
28 bool CpuIdData::sse2 = false;
29 bool CpuIdData::sse41 = false;
30 char* CpuIdData::id_string = NULL;
31 char* CpuIdData::brand_string = NULL;
32
33
34 // The documentation for __cpuid is at:
35 // http://msdn.microsoft.com/en-us/library/hskdteyh(v=vs.90).aspx
36 // InitOnce reads and caches __cpuid results for use by CpuInfo.
37 void CpuInfo::InitOnce() {
38 int32_t info[4] = {-1};
39
40 InitializeFields();
41
42 __cpuid(info, 0);
43 char *id_string = new char[3 * sizeof(int32_t)];
44 // Yes, these are supposed to be out of order.
45 *reinterpret_cast<int32_t*>(id_string) = info[1];
46 *reinterpret_cast<int32_t*>(id_string + 4) = info[3];
47 *reinterpret_cast<int32_t*>(id_string + 8) = info[2];
48 CpuIdData::id_string = id_string;
49
50 __cpuid(info, 1);
51 CpuIdData::sse41 = (info[2] & (1 << 19)) != 0;
52 CpuIdData::sse2 = (info[3] & (1 << 26)) != 0;
53
54 char* brand_string = new char[3 * 4 * sizeof(int32_t)];
55 for (intptr_t i = 0x80000002; i <= 0x80000004; i++) {
56 intptr_t off = (i - 0x80000002) * 4 * sizeof(int32_t);
57 __cpuid(info, i);
58 *reinterpret_cast<int32_t*>(brand_string + off) = info[0];
59 *reinterpret_cast<int32_t*>(brand_string + off + 4) = info[1];
60 *reinterpret_cast<int32_t*>(brand_string + off + 8) = info[2];
61 *reinterpret_cast<int32_t*>(brand_string + off + 12) = info[3];
62 }
63 CpuIdData::brand_string = brand_string;
64 }
65
66
67 bool CpuInfo::FieldContains(const char* field, const char* search_string) {
68 if (strcmp(field, fields_[kCpuInfoProcessor]) == 0) {
69 return strstr(CpuIdData::id_string, search_string);
70 } else if (strcmp(field, fields_[kCpuInfoModel]) == 0) {
71 return strstr(CpuIdData::brand_string, search_string);
72 } else if (strcmp(field, fields_[kCpuInfoFeatures]) == 0) {
73 if (strcmp(search_string, "sse2") == 0) {
74 return CpuIdData::sse2;
75 } else if (strcmp(search_string, "sse4.1") == 0) {
76 return CpuIdData::sse41;
77 } else {
78 return false;
79 }
80 } else {
81 UNIMPLEMENTED();
82 }
83 return false;
84 }
85
86
87 char* CpuInfo::ExtractField(const char* field) {
88 if (strcmp(field, fields_[kCpuInfoProcessor]) == 0) {
89 return CpuIdData::id_string;
90 } else if (strcmp(field, fields_[kCpuInfoModel]) == 0) {
91 return CpuIdData::brand_string;
92 } else {
93 UNIMPLEMENTED();
94 }
95 return NULL;
96 }
97
98
99 bool CpuInfo::HasField(const char* field) {
100 return (strcmp(field, fields_[kCpuInfoProcessor]) == 0) ||
101 (strcmp(field, fields_[kCpuInfoModel]) == 0) ||
102 (strcmp(field, fields_[kCpuInfoFeatures]) == 0);
103 }
104
105
106 const char* CpuInfo::fields_[kCpuInfoMax] = {0};
107 void CpuInfo::InitializeFields() {
108 fields_[kCpuInfoProcessor] = "Processor";
109 fields_[kCpuInfoModel] = "Hardware";
110 fields_[kCpuInfoFeatures] = "Features";
111 }
112
113 } // namespace dart
114
115 #endif // defined(TARGET_OS_WINDOWS)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698