OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #include "base/logging.h" | 6 #include "base/logging.h" |
| 7 #include "base/strings/string_piece.h" |
7 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
8 #include "build/build_config.h" | 9 #include "build/build_config.h" |
9 #if defined(OS_WIN) | 10 #if defined(OS_WIN) |
10 #include "base/win/windows_version.h" | 11 #include "base/win/windows_version.h" |
11 #endif | 12 #endif |
12 | 13 |
13 namespace nacl { | 14 namespace nacl { |
14 | 15 |
15 const char* GetSandboxArch() { | 16 const char* GetSandboxArch() { |
16 #if defined(ARCH_CPU_ARM_FAMILY) | 17 #if defined(ARCH_CPU_ARM_FAMILY) |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 // TODO(jfb) Some features are missing, either because the NaCl | 53 // TODO(jfb) Some features are missing, either because the NaCl |
53 // sandbox doesn't support them, because base::CPU doesn't | 54 // sandbox doesn't support them, because base::CPU doesn't |
54 // detect them, or because they don't help vector shuffles | 55 // detect them, or because they don't help vector shuffles |
55 // (and we omit them because it simplifies testing). Add the | 56 // (and we omit them because it simplifies testing). Add the |
56 // other features. | 57 // other features. |
57 // | 58 // |
58 // TODO(jfb) The following is x86-specific. The base::CPU class | 59 // TODO(jfb) The following is x86-specific. The base::CPU class |
59 // doesn't handle other architectures very well, and we | 60 // doesn't handle other architectures very well, and we |
60 // should at least detect the presence of ARM's integer | 61 // should at least detect the presence of ARM's integer |
61 // divide. | 62 // divide. |
62 std::vector<std::string> features; | 63 std::vector<base::StringPiece> features; |
63 base::CPU cpu; | 64 base::CPU cpu; |
64 | 65 |
65 // On x86, SSE features are ordered: the most recent one implies the | 66 // On x86, SSE features are ordered: the most recent one implies the |
66 // others. Care is taken here to only specify the latest SSE version, | 67 // others. Care is taken here to only specify the latest SSE version, |
67 // whereas non-SSE features don't follow this model: POPCNT is | 68 // whereas non-SSE features don't follow this model: POPCNT is |
68 // effectively always implied by SSE4.2 but has to be specified | 69 // effectively always implied by SSE4.2 but has to be specified |
69 // separately. | 70 // separately. |
70 // | 71 // |
71 // TODO: AVX2, AVX, SSE 4.2. | 72 // TODO: AVX2, AVX, SSE 4.2. |
72 if (cpu.has_sse41()) features.push_back("+sse4.1"); | 73 if (cpu.has_sse41()) features.push_back("+sse4.1"); |
73 // TODO: SSE 4A, SSE 4. | 74 // TODO: SSE 4A, SSE 4. |
74 else if (cpu.has_ssse3()) features.push_back("+ssse3"); | 75 else if (cpu.has_ssse3()) features.push_back("+ssse3"); |
75 // TODO: SSE 3 | 76 // TODO: SSE 3 |
76 else if (cpu.has_sse2()) features.push_back("+sse2"); | 77 else if (cpu.has_sse2()) features.push_back("+sse2"); |
77 | 78 |
78 if (cpu.has_popcnt()) features.push_back("+popcnt"); | 79 if (cpu.has_popcnt()) features.push_back("+popcnt"); |
79 | 80 |
80 // TODO: AES, LZCNT, ... | 81 // TODO: AES, LZCNT, ... |
81 return base::JoinString(features, ","); | 82 return base::JoinString(features, ","); |
82 } | 83 } |
83 | 84 |
84 } // namespace nacl | 85 } // namespace nacl |
OLD | NEW |