1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2006-2013 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This module contains the architecture-specific code. This make the rest of
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// the code less dependent on differences between different processor
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// architecture.
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The classes have the same definition for all architectures. The
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// implementation for a particular architecture is put in cpu_<arch>.cc.
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The build system then uses the implementation for the target architecture.
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_BASE_CPU_H_
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define V8_BASE_CPU_H_
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
16c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/base/base-export.h"
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/macros.h"
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace base {
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------------------------------
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// CPU
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Query information about the processor.
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This class also has static methods for the architecture specific functions.
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Add methods here to cope with differences between the supported
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// architectures. For each architecture the file cpu_<arch>.cc contains the
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// implementation of these static functions.
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass V8_BASE_EXPORT CPU final {
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CPU();
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // x86 CPUID information
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* vendor() const { return vendor_; }
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int stepping() const { return stepping_; }
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int model() const { return model_; }
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int ext_model() const { return ext_model_; }
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int family() const { return family_; }
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int ext_family() const { return ext_family_; }
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int type() const { return type_; }
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // arm implementer/part information
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int implementer() const { return implementer_; }
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int ARM = 0x41;
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int NVIDIA = 0x4e;
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int QUALCOMM = 0x51;
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int architecture() const { return architecture_; }
51958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int variant() const { return variant_; }
52958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static const int NVIDIA_DENVER = 0x0;
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int part() const { return part_; }
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // ARM-specific part codes
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int ARM_CORTEX_A5 = 0xc05;
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int ARM_CORTEX_A7 = 0xc07;
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int ARM_CORTEX_A8 = 0xc08;
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int ARM_CORTEX_A9 = 0xc09;
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int ARM_CORTEX_A12 = 0xc0c;
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int ARM_CORTEX_A15 = 0xc0f;
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Denver-specific part code
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int NVIDIA_DENVER_V10 = 0x002;
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // PPC-specific part codes
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  enum {
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PPC_POWER5,
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PPC_POWER6,
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PPC_POWER7,
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PPC_POWER8,
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PPC_G4,
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PPC_G5,
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PPC_PA6T
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // General features
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_fpu() const { return has_fpu_; }
79109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  int icache_line_size() const { return icache_line_size_; }
80109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  int dcache_line_size() const { return dcache_line_size_; }
81109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  static const int UNKNOWN_CACHE_LINE_SIZE = 0;
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // x86 features
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_cmov() const { return has_cmov_; }
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_sahf() const { return has_sahf_; }
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_mmx() const { return has_mmx_; }
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_sse() const { return has_sse_; }
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_sse2() const { return has_sse2_; }
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_sse3() const { return has_sse3_; }
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_ssse3() const { return has_ssse3_; }
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_sse41() const { return has_sse41_; }
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_sse42() const { return has_sse42_; }
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool has_osxsave() const { return has_osxsave_; }
94958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool has_avx() const { return has_avx_; }
95958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool has_fma3() const { return has_fma3_; }
96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool has_bmi1() const { return has_bmi1_; }
97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool has_bmi2() const { return has_bmi2_; }
98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool has_lzcnt() const { return has_lzcnt_; }
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool has_popcnt() const { return has_popcnt_; }
100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool is_atom() const { return is_atom_; }
10113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  bool has_non_stop_time_stamp_counter() const {
10213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return has_non_stop_time_stamp_counter_;
10313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // arm features
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_idiva() const { return has_idiva_; }
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_neon() const { return has_neon_; }
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_thumb2() const { return has_thumb2_; }
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_vfp() const { return has_vfp_; }
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_vfp3() const { return has_vfp3_; }
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_vfp3_d32() const { return has_vfp3_d32_; }
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // mips features
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_fp64_mode() const { return is_fp64_mode_; }
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  char vendor_[13];
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int stepping_;
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int model_;
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int ext_model_;
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int family_;
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int ext_family_;
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int type_;
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int implementer_;
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int architecture_;
126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int variant_;
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int part_;
128109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  int icache_line_size_;
129109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  int dcache_line_size_;
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_fpu_;
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_cmov_;
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_sahf_;
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_mmx_;
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_sse_;
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_sse2_;
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_sse3_;
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_ssse3_;
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_sse41_;
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_sse42_;
140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool is_atom_;
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool has_osxsave_;
142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool has_avx_;
143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool has_fma3_;
144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool has_bmi1_;
145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool has_bmi2_;
146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool has_lzcnt_;
147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool has_popcnt_;
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_idiva_;
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_neon_;
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_thumb2_;
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_vfp_;
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_vfp3_;
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_vfp3_d32_;
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_fp64_mode_;
15513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  bool has_non_stop_time_stamp_counter_;
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace base
159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif  // V8_BASE_CPU_H_
162