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