| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium 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 "base/cpu.h" | 5 #include "base/cpu.h" |
| 6 | 6 |
| 7 #include <limits.h> | 7 #include <limits.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 #include <string.h> | 10 #include <string.h> |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 stepping_(0), | 36 stepping_(0), |
| 37 ext_model_(0), | 37 ext_model_(0), |
| 38 ext_family_(0), | 38 ext_family_(0), |
| 39 has_mmx_(false), | 39 has_mmx_(false), |
| 40 has_sse_(false), | 40 has_sse_(false), |
| 41 has_sse2_(false), | 41 has_sse2_(false), |
| 42 has_sse3_(false), | 42 has_sse3_(false), |
| 43 has_ssse3_(false), | 43 has_ssse3_(false), |
| 44 has_sse41_(false), | 44 has_sse41_(false), |
| 45 has_sse42_(false), | 45 has_sse42_(false), |
| 46 has_popcnt_(false), |
| 46 has_avx_(false), | 47 has_avx_(false), |
| 47 has_avx2_(false), | 48 has_avx2_(false), |
| 48 has_aesni_(false), | 49 has_aesni_(false), |
| 49 has_non_stop_time_stamp_counter_(false), | 50 has_non_stop_time_stamp_counter_(false), |
| 50 cpu_vendor_("unknown") { | 51 cpu_vendor_("unknown") { |
| 51 Initialize(); | 52 Initialize(); |
| 52 } | 53 } |
| 53 | 54 |
| 54 namespace { | 55 namespace { |
| 55 | 56 |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 type_ = (cpu_info[0] >> 12) & 0x3; | 171 type_ = (cpu_info[0] >> 12) & 0x3; |
| 171 ext_model_ = (cpu_info[0] >> 16) & 0xf; | 172 ext_model_ = (cpu_info[0] >> 16) & 0xf; |
| 172 ext_family_ = (cpu_info[0] >> 20) & 0xff; | 173 ext_family_ = (cpu_info[0] >> 20) & 0xff; |
| 173 has_mmx_ = (cpu_info[3] & 0x00800000) != 0; | 174 has_mmx_ = (cpu_info[3] & 0x00800000) != 0; |
| 174 has_sse_ = (cpu_info[3] & 0x02000000) != 0; | 175 has_sse_ = (cpu_info[3] & 0x02000000) != 0; |
| 175 has_sse2_ = (cpu_info[3] & 0x04000000) != 0; | 176 has_sse2_ = (cpu_info[3] & 0x04000000) != 0; |
| 176 has_sse3_ = (cpu_info[2] & 0x00000001) != 0; | 177 has_sse3_ = (cpu_info[2] & 0x00000001) != 0; |
| 177 has_ssse3_ = (cpu_info[2] & 0x00000200) != 0; | 178 has_ssse3_ = (cpu_info[2] & 0x00000200) != 0; |
| 178 has_sse41_ = (cpu_info[2] & 0x00080000) != 0; | 179 has_sse41_ = (cpu_info[2] & 0x00080000) != 0; |
| 179 has_sse42_ = (cpu_info[2] & 0x00100000) != 0; | 180 has_sse42_ = (cpu_info[2] & 0x00100000) != 0; |
| 181 has_popcnt_ = (cpu_info[2] & 0x00800000) != 0; |
| 182 |
| 180 // AVX instructions will generate an illegal instruction exception unless | 183 // AVX instructions will generate an illegal instruction exception unless |
| 181 // a) they are supported by the CPU, | 184 // a) they are supported by the CPU, |
| 182 // b) XSAVE is supported by the CPU and | 185 // b) XSAVE is supported by the CPU and |
| 183 // c) XSAVE is enabled by the kernel. | 186 // c) XSAVE is enabled by the kernel. |
| 184 // See http://software.intel.com/en-us/blogs/2011/04/14/is-avx-enabled | 187 // See http://software.intel.com/en-us/blogs/2011/04/14/is-avx-enabled |
| 185 // | 188 // |
| 186 // In addition, we have observed some crashes with the xgetbv instruction | 189 // In addition, we have observed some crashes with the xgetbv instruction |
| 187 // even after following Intel's example code. (See crbug.com/375968.) | 190 // even after following Intel's example code. (See crbug.com/375968.) |
| 188 // Because of that, we also test the XSAVE bit because its description in | 191 // Because of that, we also test the XSAVE bit because its description in |
| 189 // the CPUID documentation suggests that it signals xgetbv support. | 192 // the CPUID documentation suggests that it signals xgetbv support. |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 if (has_sse42()) return SSE42; | 232 if (has_sse42()) return SSE42; |
| 230 if (has_sse41()) return SSE41; | 233 if (has_sse41()) return SSE41; |
| 231 if (has_ssse3()) return SSSE3; | 234 if (has_ssse3()) return SSSE3; |
| 232 if (has_sse3()) return SSE3; | 235 if (has_sse3()) return SSE3; |
| 233 if (has_sse2()) return SSE2; | 236 if (has_sse2()) return SSE2; |
| 234 if (has_sse()) return SSE; | 237 if (has_sse()) return SSE; |
| 235 return PENTIUM; | 238 return PENTIUM; |
| 236 } | 239 } |
| 237 | 240 |
| 238 } // namespace base | 241 } // namespace base |
| OLD | NEW |