11e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Copyright 2006-2013 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// This module contains the architecture-specific code. This make the rest of 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// the code less dependent on differences between different processor 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// architecture. 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The classes have the same definition for all architectures. The 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// implementation for a particular architecture is put in cpu_<arch>.cc. 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The build system then uses the implementation for the target architecture. 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 135de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#ifndef V8_BASE_CPU_H_ 145de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#define V8_BASE_CPU_H_ 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 165de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/macros.h" 171c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org 1871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 195de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgnamespace base { 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ---------------------------------------------------------------------------- 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// CPU 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 241e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Query information about the processor. 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 261e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// This class also has static methods for the architecture specific functions. 271e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Add methods here to cope with differences between the supported 281e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// architectures. For each architecture the file cpu_<arch>.cc contains the 291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// implementation of these static functions. 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 31ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass CPU FINAL { 3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 331e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org CPU(); 341e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 351e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // x86 CPUID information 361e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org const char* vendor() const { return vendor_; } 371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int stepping() const { return stepping_; } 381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int model() const { return model_; } 391e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int ext_model() const { return ext_model_; } 401e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int family() const { return family_; } 411e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int ext_family() const { return ext_family_; } 421e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int type() const { return type_; } 431e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 441e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // arm implementer/part information 451e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int implementer() const { return implementer_; } 461e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org static const int ARM = 0x41; 473c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org static const int NVIDIA = 0x4e; 481e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org static const int QUALCOMM = 0x51; 491e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int architecture() const { return architecture_; } 501e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int part() const { return part_; } 511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org static const int ARM_CORTEX_A5 = 0xc05; 521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org static const int ARM_CORTEX_A7 = 0xc07; 531e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org static const int ARM_CORTEX_A8 = 0xc08; 541e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org static const int ARM_CORTEX_A9 = 0xc09; 551e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org static const int ARM_CORTEX_A12 = 0xc0c; 561e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org static const int ARM_CORTEX_A15 = 0xc0f; 571e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 581e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // General features 591e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_fpu() const { return has_fpu_; } 601e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 611e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // x86 features 621e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_cmov() const { return has_cmov_; } 631e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_sahf() const { return has_sahf_; } 641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_mmx() const { return has_mmx_; } 651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_sse() const { return has_sse_; } 661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_sse2() const { return has_sse2_; } 671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_sse3() const { return has_sse3_; } 681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_ssse3() const { return has_ssse3_; } 691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_sse41() const { return has_sse41_; } 701e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_sse42() const { return has_sse42_; } 711e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 721e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org // arm features 731e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_idiva() const { return has_idiva_; } 741e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_neon() const { return has_neon_; } 7570d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org bool has_thumb2() const { return has_thumb2_; } 761e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_vfp() const { return has_vfp_; } 771e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_vfp3() const { return has_vfp3_; } 781e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_vfp3_d32() const { return has_vfp3_d32_; } 791e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org // mips features 815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org bool is_fp64_mode() const { return is_fp64_mode_; } 825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 831e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org private: 841e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org char vendor_[13]; 851e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int stepping_; 861e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int model_; 871e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int ext_model_; 881e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int family_; 891e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int ext_family_; 901e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int type_; 911e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int implementer_; 921e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int architecture_; 931e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org int part_; 941e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_fpu_; 951e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_cmov_; 961e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_sahf_; 971e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_mmx_; 981e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_sse_; 991e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_sse2_; 1001e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_sse3_; 1011e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_ssse3_; 1021e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_sse41_; 1031e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_sse42_; 1041e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_idiva_; 1051e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_neon_; 10670d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org bool has_thumb2_; 1071e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_vfp_; 1081e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_vfp3_; 1091e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org bool has_vfp3_d32_; 1105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org bool is_fp64_mode_; 11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1135de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org} } // namespace v8::base 11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1155de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#endif // V8_BASE_CPU_H_ 116