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