2012-04-25 02:08:37 +02:00
|
|
|
/* Get CPU type and Features for x86 processors.
|
2013-02-04 20:06:20 +01:00
|
|
|
Copyright (C) 2012-2013 Free Software Foundation, Inc.
|
2012-04-25 02:08:37 +02:00
|
|
|
Contributed by Sriraman Tallam (tmsriram@google.com)
|
|
|
|
|
|
|
|
This file is part of GCC.
|
|
|
|
|
|
|
|
GCC is free software; you can redistribute it and/or modify it under
|
|
|
|
the terms of the GNU General Public License as published by the Free
|
|
|
|
Software Foundation; either version 3, or (at your option) any later
|
|
|
|
version.
|
|
|
|
|
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
for more details.
|
|
|
|
|
2013-08-01 23:09:10 +02:00
|
|
|
Under Section 7 of GPL version 3, you are granted additional
|
|
|
|
permissions described in the GCC Runtime Library Exception, version
|
|
|
|
3.1, as published by the Free Software Foundation.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License and
|
|
|
|
a copy of the GCC Runtime Library Exception along with this program;
|
|
|
|
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
|
|
<http://www.gnu.org/licenses/>. */
|
2012-04-25 02:08:37 +02:00
|
|
|
|
|
|
|
#include "cpuid.h"
|
|
|
|
#include "tsystem.h"
|
2012-05-10 10:51:39 +02:00
|
|
|
#include "auto-target.h"
|
2012-04-25 02:08:37 +02:00
|
|
|
|
2012-05-10 10:51:39 +02:00
|
|
|
#ifdef HAVE_INIT_PRIORITY
|
|
|
|
#define CONSTRUCTOR_PRIORITY (101)
|
|
|
|
#else
|
|
|
|
#define CONSTRUCTOR_PRIORITY
|
|
|
|
#endif
|
|
|
|
|
|
|
|
int __cpu_indicator_init (void)
|
|
|
|
__attribute__ ((constructor CONSTRUCTOR_PRIORITY));
|
2012-04-25 02:08:37 +02:00
|
|
|
|
|
|
|
enum vendor_signatures
|
|
|
|
{
|
|
|
|
SIG_INTEL = 0x756e6547 /* Genu */,
|
|
|
|
SIG_AMD = 0x68747541 /* Auth */
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Processor Vendor and Models. */
|
|
|
|
|
|
|
|
enum processor_vendor
|
|
|
|
{
|
|
|
|
VENDOR_INTEL = 1,
|
|
|
|
VENDOR_AMD,
|
|
|
|
VENDOR_OTHER,
|
|
|
|
VENDOR_MAX
|
|
|
|
};
|
|
|
|
|
2013-06-03 19:20:02 +02:00
|
|
|
/* Any new types or subtypes have to be inserted at the end. */
|
|
|
|
|
2012-04-25 02:08:37 +02:00
|
|
|
enum processor_types
|
|
|
|
{
|
Use proper Intel processor names for -march=/-mtune=
gcc/
* config/i386/core2.md: Replace corei7 with nehalem.
* config/i386/driver-i386.c (host_detect_local_cpu): Use nehalem,
westmere, sandybridge, ivybridge, haswell, bonnell, silvermont
for cpu names.
* config/i386/i386-c.c (ix86_target_macros_internal): Replace
PROCESSOR_COREI7, PROCESSOR_COREI7_AVX, PROCESSOR_ATOM,
PROCESSOR_SLM with PROCESSOR_NEHALEM, PROCESSOR_SANDYBRIDGE,
PROCESSOR_BONNELL, PROCESSOR_SILVERMONT. Define
__nehalem/__nehalem__, __sandybridge/__sandybridge__,
__haswell/__haswell__, __tune_nehalem__, __tune_sandybridge__,
__tune_haswell__, __bonnell/__bonnell__,
__silvermont/__silvermont__, __tune_bonnell__,
__tune_silvermont__.
* config/i386/i386.c (m_COREI7): Renamed to ...
(m_NEHALEM): This.
(m_COREI7_AVX): Renamed to ...
(m_SANDYBRIDGE): This.
(m_ATOM): Renamed to ...
(m_BONNELL): This.
(m_SLM): Renamed to ...
(m_SILVERMONT): This.
(m_CORE_ALL): Updated.
(cpu_names): Add "nehalem", "westmere", "sandybridge",
"ivybridge", "haswell", "broadwell", "bonnell", "silvermont".
(PTA_CORE2): New.
(PTA_NEHALEM): Likewise.
(PTA_WESTMERE): Likewise.
(PTA_SANDYBRIDGE): Likewise.
(PTA_IVYBRIDGE): Likewise.
(PTA_HASWELL): Likewise.
(PTA_BROADWELL): Likewise.
(PTA_BONNELL): Likewise.
(PTA_SILVERMONT): Likewise.
(ix86_option_override_internal): Use new PTA_XXX. Add nehalem,
westmere, sandybridge, ivybridge, haswell, bonnell, silvermont.
(ix86_lea_outperforms): Updated.
(ix86_issue_rate): Likewise.
(ix86_adjust_cost): Likewise.
(ia32_multipass_dfa_lookahead): Likewise.
(do_reorder_for_imul): Likewise.
(swap_top_of_ready_list): Likewise.
(ix86_sched_reorder): Likewise.
(ix86_sched_init_global): Likewise.
(get_builtin_code_for_version): Likewise.
(processor_model): Replace M_INTEL_ATOM, M_INTEL_SLM with
M_INTEL_BONNELL, M_INTEL_SILVERMONT.
(arch_names_table): Updated.
* config/i386/i386.h (TARGET_COREI7): Removed.
(TARGET_COREI7_AVX): Likewise.
(TARGET_ATOM): Likewise.
(TARGET_SLM): Likewise.
(TARGET_NEHALEM): New.
(TARGET_SANDYBRIDGE): Likewise.
(TARGET_BONNELL): Likewise.
(TARGET_SILVERMONT): Likewise.
(target_cpu_default): Add TARGET_CPU_DEFAULT_core_avx2,
TARGET_CPU_DEFAULT_nehalem, TARGET_CPU_DEFAULT_westmere,
TARGET_CPU_DEFAULT_sandybridge, TARGET_CPU_DEFAULT_ivybridge,
TARGET_CPU_DEFAULT_broadwell, TARGET_CPU_DEFAULT_bonnell,
TARGET_CPU_DEFAULT_silvermont. Move TARGET_CPU_DEFAULT_haswell
before TARGET_CPU_DEFAULT_broadwell.
(processor_type): Replace PROCESSOR_COREI7, PROCESSOR_COREI7_AVX,
PROCESSOR_ATOM, PROCESSOR_SLM with PROCESSOR_NEHALEM,
PROCESSOR_SANDYBRIDGE, PROCESSOR_BONNELL, PROCESSOR_SILVERMONT.
* config/i386/i386.md (cpu): Replace corei7 with nehalem.
* config/i386/x86-tune.def: Updated.
* doc/invoke.texi: Replace corei7, corei7-avx, core-avx-i,
core-avx2, atom, slm with nehalem, sandybridge, ivybridge,
haswell, bonnel, silvermont. Add westmere.
libgcc/
* config/i386/cpuinfo.c (processor_subtypes): Replace INTEL_ATOM,
INTEL_SLM with INTEL_BONNELL, INTEL_SILVERMONT.
(get_intel_cpu): Updated.
Co-Authored-By: Tocar Ilya <ilya.tocar@intel.com>
From-SVN: r206178
2013-12-23 14:05:09 +01:00
|
|
|
INTEL_BONNELL = 1,
|
2012-04-25 02:08:37 +02:00
|
|
|
INTEL_CORE2,
|
|
|
|
INTEL_COREI7,
|
|
|
|
AMDFAM10H,
|
|
|
|
AMDFAM15H,
|
Use proper Intel processor names for -march=/-mtune=
gcc/
* config/i386/core2.md: Replace corei7 with nehalem.
* config/i386/driver-i386.c (host_detect_local_cpu): Use nehalem,
westmere, sandybridge, ivybridge, haswell, bonnell, silvermont
for cpu names.
* config/i386/i386-c.c (ix86_target_macros_internal): Replace
PROCESSOR_COREI7, PROCESSOR_COREI7_AVX, PROCESSOR_ATOM,
PROCESSOR_SLM with PROCESSOR_NEHALEM, PROCESSOR_SANDYBRIDGE,
PROCESSOR_BONNELL, PROCESSOR_SILVERMONT. Define
__nehalem/__nehalem__, __sandybridge/__sandybridge__,
__haswell/__haswell__, __tune_nehalem__, __tune_sandybridge__,
__tune_haswell__, __bonnell/__bonnell__,
__silvermont/__silvermont__, __tune_bonnell__,
__tune_silvermont__.
* config/i386/i386.c (m_COREI7): Renamed to ...
(m_NEHALEM): This.
(m_COREI7_AVX): Renamed to ...
(m_SANDYBRIDGE): This.
(m_ATOM): Renamed to ...
(m_BONNELL): This.
(m_SLM): Renamed to ...
(m_SILVERMONT): This.
(m_CORE_ALL): Updated.
(cpu_names): Add "nehalem", "westmere", "sandybridge",
"ivybridge", "haswell", "broadwell", "bonnell", "silvermont".
(PTA_CORE2): New.
(PTA_NEHALEM): Likewise.
(PTA_WESTMERE): Likewise.
(PTA_SANDYBRIDGE): Likewise.
(PTA_IVYBRIDGE): Likewise.
(PTA_HASWELL): Likewise.
(PTA_BROADWELL): Likewise.
(PTA_BONNELL): Likewise.
(PTA_SILVERMONT): Likewise.
(ix86_option_override_internal): Use new PTA_XXX. Add nehalem,
westmere, sandybridge, ivybridge, haswell, bonnell, silvermont.
(ix86_lea_outperforms): Updated.
(ix86_issue_rate): Likewise.
(ix86_adjust_cost): Likewise.
(ia32_multipass_dfa_lookahead): Likewise.
(do_reorder_for_imul): Likewise.
(swap_top_of_ready_list): Likewise.
(ix86_sched_reorder): Likewise.
(ix86_sched_init_global): Likewise.
(get_builtin_code_for_version): Likewise.
(processor_model): Replace M_INTEL_ATOM, M_INTEL_SLM with
M_INTEL_BONNELL, M_INTEL_SILVERMONT.
(arch_names_table): Updated.
* config/i386/i386.h (TARGET_COREI7): Removed.
(TARGET_COREI7_AVX): Likewise.
(TARGET_ATOM): Likewise.
(TARGET_SLM): Likewise.
(TARGET_NEHALEM): New.
(TARGET_SANDYBRIDGE): Likewise.
(TARGET_BONNELL): Likewise.
(TARGET_SILVERMONT): Likewise.
(target_cpu_default): Add TARGET_CPU_DEFAULT_core_avx2,
TARGET_CPU_DEFAULT_nehalem, TARGET_CPU_DEFAULT_westmere,
TARGET_CPU_DEFAULT_sandybridge, TARGET_CPU_DEFAULT_ivybridge,
TARGET_CPU_DEFAULT_broadwell, TARGET_CPU_DEFAULT_bonnell,
TARGET_CPU_DEFAULT_silvermont. Move TARGET_CPU_DEFAULT_haswell
before TARGET_CPU_DEFAULT_broadwell.
(processor_type): Replace PROCESSOR_COREI7, PROCESSOR_COREI7_AVX,
PROCESSOR_ATOM, PROCESSOR_SLM with PROCESSOR_NEHALEM,
PROCESSOR_SANDYBRIDGE, PROCESSOR_BONNELL, PROCESSOR_SILVERMONT.
* config/i386/i386.md (cpu): Replace corei7 with nehalem.
* config/i386/x86-tune.def: Updated.
* doc/invoke.texi: Replace corei7, corei7-avx, core-avx-i,
core-avx2, atom, slm with nehalem, sandybridge, ivybridge,
haswell, bonnel, silvermont. Add westmere.
libgcc/
* config/i386/cpuinfo.c (processor_subtypes): Replace INTEL_ATOM,
INTEL_SLM with INTEL_BONNELL, INTEL_SILVERMONT.
(get_intel_cpu): Updated.
Co-Authored-By: Tocar Ilya <ilya.tocar@intel.com>
From-SVN: r206178
2013-12-23 14:05:09 +01:00
|
|
|
INTEL_SILVERMONT,
|
2012-04-25 02:08:37 +02:00
|
|
|
CPU_TYPE_MAX
|
|
|
|
};
|
|
|
|
|
|
|
|
enum processor_subtypes
|
|
|
|
{
|
|
|
|
INTEL_COREI7_NEHALEM = 1,
|
|
|
|
INTEL_COREI7_WESTMERE,
|
|
|
|
INTEL_COREI7_SANDYBRIDGE,
|
|
|
|
AMDFAM10H_BARCELONA,
|
|
|
|
AMDFAM10H_SHANGHAI,
|
|
|
|
AMDFAM10H_ISTANBUL,
|
|
|
|
AMDFAM15H_BDVER1,
|
|
|
|
AMDFAM15H_BDVER2,
|
|
|
|
CPU_SUBTYPE_MAX
|
|
|
|
};
|
|
|
|
|
|
|
|
/* ISA Features supported. */
|
|
|
|
|
|
|
|
enum processor_features
|
|
|
|
{
|
|
|
|
FEATURE_CMOV = 0,
|
|
|
|
FEATURE_MMX,
|
|
|
|
FEATURE_POPCNT,
|
|
|
|
FEATURE_SSE,
|
|
|
|
FEATURE_SSE2,
|
|
|
|
FEATURE_SSE3,
|
|
|
|
FEATURE_SSSE3,
|
|
|
|
FEATURE_SSE4_1,
|
|
|
|
FEATURE_SSE4_2,
|
2012-04-26 02:52:09 +02:00
|
|
|
FEATURE_AVX,
|
|
|
|
FEATURE_AVX2
|
2012-04-25 02:08:37 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
struct __processor_model
|
|
|
|
{
|
|
|
|
unsigned int __cpu_vendor;
|
|
|
|
unsigned int __cpu_type;
|
|
|
|
unsigned int __cpu_subtype;
|
|
|
|
unsigned int __cpu_features[1];
|
|
|
|
} __cpu_model;
|
|
|
|
|
|
|
|
|
|
|
|
/* Get the specific type of AMD CPU. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
get_amd_cpu (unsigned int family, unsigned int model)
|
|
|
|
{
|
|
|
|
switch (family)
|
|
|
|
{
|
|
|
|
/* AMD Family 10h. */
|
|
|
|
case 0x10:
|
|
|
|
switch (model)
|
|
|
|
{
|
|
|
|
case 0x2:
|
|
|
|
/* Barcelona. */
|
|
|
|
__cpu_model.__cpu_type = AMDFAM10H;
|
|
|
|
__cpu_model.__cpu_subtype = AMDFAM10H_BARCELONA;
|
|
|
|
break;
|
|
|
|
case 0x4:
|
|
|
|
/* Shanghai. */
|
|
|
|
__cpu_model.__cpu_type = AMDFAM10H;
|
|
|
|
__cpu_model.__cpu_subtype = AMDFAM10H_SHANGHAI;
|
|
|
|
break;
|
|
|
|
case 0x8:
|
|
|
|
/* Istanbul. */
|
|
|
|
__cpu_model.__cpu_type = AMDFAM10H;
|
|
|
|
__cpu_model.__cpu_subtype = AMDFAM10H_ISTANBUL;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
/* AMD Family 15h. */
|
|
|
|
case 0x15:
|
|
|
|
__cpu_model.__cpu_type = AMDFAM15H;
|
|
|
|
/* Bulldozer version 1. */
|
|
|
|
if ( model <= 0xf)
|
|
|
|
__cpu_model.__cpu_subtype = AMDFAM15H_BDVER1;
|
|
|
|
/* Bulldozer version 2. */
|
|
|
|
if (model >= 0x10 && model <= 0x1f)
|
|
|
|
__cpu_model.__cpu_subtype = AMDFAM15H_BDVER2;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Get the specific type of Intel CPU. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
get_intel_cpu (unsigned int family, unsigned int model, unsigned int brand_id)
|
|
|
|
{
|
|
|
|
/* Parse family and model only if brand ID is 0. */
|
|
|
|
if (brand_id == 0)
|
|
|
|
{
|
|
|
|
switch (family)
|
|
|
|
{
|
|
|
|
case 0x5:
|
|
|
|
/* Pentium. */
|
|
|
|
break;
|
|
|
|
case 0x6:
|
|
|
|
switch (model)
|
|
|
|
{
|
|
|
|
case 0x1c:
|
|
|
|
case 0x26:
|
Use proper Intel processor names for -march=/-mtune=
gcc/
* config/i386/core2.md: Replace corei7 with nehalem.
* config/i386/driver-i386.c (host_detect_local_cpu): Use nehalem,
westmere, sandybridge, ivybridge, haswell, bonnell, silvermont
for cpu names.
* config/i386/i386-c.c (ix86_target_macros_internal): Replace
PROCESSOR_COREI7, PROCESSOR_COREI7_AVX, PROCESSOR_ATOM,
PROCESSOR_SLM with PROCESSOR_NEHALEM, PROCESSOR_SANDYBRIDGE,
PROCESSOR_BONNELL, PROCESSOR_SILVERMONT. Define
__nehalem/__nehalem__, __sandybridge/__sandybridge__,
__haswell/__haswell__, __tune_nehalem__, __tune_sandybridge__,
__tune_haswell__, __bonnell/__bonnell__,
__silvermont/__silvermont__, __tune_bonnell__,
__tune_silvermont__.
* config/i386/i386.c (m_COREI7): Renamed to ...
(m_NEHALEM): This.
(m_COREI7_AVX): Renamed to ...
(m_SANDYBRIDGE): This.
(m_ATOM): Renamed to ...
(m_BONNELL): This.
(m_SLM): Renamed to ...
(m_SILVERMONT): This.
(m_CORE_ALL): Updated.
(cpu_names): Add "nehalem", "westmere", "sandybridge",
"ivybridge", "haswell", "broadwell", "bonnell", "silvermont".
(PTA_CORE2): New.
(PTA_NEHALEM): Likewise.
(PTA_WESTMERE): Likewise.
(PTA_SANDYBRIDGE): Likewise.
(PTA_IVYBRIDGE): Likewise.
(PTA_HASWELL): Likewise.
(PTA_BROADWELL): Likewise.
(PTA_BONNELL): Likewise.
(PTA_SILVERMONT): Likewise.
(ix86_option_override_internal): Use new PTA_XXX. Add nehalem,
westmere, sandybridge, ivybridge, haswell, bonnell, silvermont.
(ix86_lea_outperforms): Updated.
(ix86_issue_rate): Likewise.
(ix86_adjust_cost): Likewise.
(ia32_multipass_dfa_lookahead): Likewise.
(do_reorder_for_imul): Likewise.
(swap_top_of_ready_list): Likewise.
(ix86_sched_reorder): Likewise.
(ix86_sched_init_global): Likewise.
(get_builtin_code_for_version): Likewise.
(processor_model): Replace M_INTEL_ATOM, M_INTEL_SLM with
M_INTEL_BONNELL, M_INTEL_SILVERMONT.
(arch_names_table): Updated.
* config/i386/i386.h (TARGET_COREI7): Removed.
(TARGET_COREI7_AVX): Likewise.
(TARGET_ATOM): Likewise.
(TARGET_SLM): Likewise.
(TARGET_NEHALEM): New.
(TARGET_SANDYBRIDGE): Likewise.
(TARGET_BONNELL): Likewise.
(TARGET_SILVERMONT): Likewise.
(target_cpu_default): Add TARGET_CPU_DEFAULT_core_avx2,
TARGET_CPU_DEFAULT_nehalem, TARGET_CPU_DEFAULT_westmere,
TARGET_CPU_DEFAULT_sandybridge, TARGET_CPU_DEFAULT_ivybridge,
TARGET_CPU_DEFAULT_broadwell, TARGET_CPU_DEFAULT_bonnell,
TARGET_CPU_DEFAULT_silvermont. Move TARGET_CPU_DEFAULT_haswell
before TARGET_CPU_DEFAULT_broadwell.
(processor_type): Replace PROCESSOR_COREI7, PROCESSOR_COREI7_AVX,
PROCESSOR_ATOM, PROCESSOR_SLM with PROCESSOR_NEHALEM,
PROCESSOR_SANDYBRIDGE, PROCESSOR_BONNELL, PROCESSOR_SILVERMONT.
* config/i386/i386.md (cpu): Replace corei7 with nehalem.
* config/i386/x86-tune.def: Updated.
* doc/invoke.texi: Replace corei7, corei7-avx, core-avx-i,
core-avx2, atom, slm with nehalem, sandybridge, ivybridge,
haswell, bonnel, silvermont. Add westmere.
libgcc/
* config/i386/cpuinfo.c (processor_subtypes): Replace INTEL_ATOM,
INTEL_SLM with INTEL_BONNELL, INTEL_SILVERMONT.
(get_intel_cpu): Updated.
Co-Authored-By: Tocar Ilya <ilya.tocar@intel.com>
From-SVN: r206178
2013-12-23 14:05:09 +01:00
|
|
|
/* Bonnell. */
|
|
|
|
__cpu_model.__cpu_type = INTEL_BONNELL;
|
2012-04-25 02:08:37 +02:00
|
|
|
break;
|
2013-11-22 17:33:40 +01:00
|
|
|
case 0x37:
|
|
|
|
case 0x4d:
|
|
|
|
/* Silvermont. */
|
Use proper Intel processor names for -march=/-mtune=
gcc/
* config/i386/core2.md: Replace corei7 with nehalem.
* config/i386/driver-i386.c (host_detect_local_cpu): Use nehalem,
westmere, sandybridge, ivybridge, haswell, bonnell, silvermont
for cpu names.
* config/i386/i386-c.c (ix86_target_macros_internal): Replace
PROCESSOR_COREI7, PROCESSOR_COREI7_AVX, PROCESSOR_ATOM,
PROCESSOR_SLM with PROCESSOR_NEHALEM, PROCESSOR_SANDYBRIDGE,
PROCESSOR_BONNELL, PROCESSOR_SILVERMONT. Define
__nehalem/__nehalem__, __sandybridge/__sandybridge__,
__haswell/__haswell__, __tune_nehalem__, __tune_sandybridge__,
__tune_haswell__, __bonnell/__bonnell__,
__silvermont/__silvermont__, __tune_bonnell__,
__tune_silvermont__.
* config/i386/i386.c (m_COREI7): Renamed to ...
(m_NEHALEM): This.
(m_COREI7_AVX): Renamed to ...
(m_SANDYBRIDGE): This.
(m_ATOM): Renamed to ...
(m_BONNELL): This.
(m_SLM): Renamed to ...
(m_SILVERMONT): This.
(m_CORE_ALL): Updated.
(cpu_names): Add "nehalem", "westmere", "sandybridge",
"ivybridge", "haswell", "broadwell", "bonnell", "silvermont".
(PTA_CORE2): New.
(PTA_NEHALEM): Likewise.
(PTA_WESTMERE): Likewise.
(PTA_SANDYBRIDGE): Likewise.
(PTA_IVYBRIDGE): Likewise.
(PTA_HASWELL): Likewise.
(PTA_BROADWELL): Likewise.
(PTA_BONNELL): Likewise.
(PTA_SILVERMONT): Likewise.
(ix86_option_override_internal): Use new PTA_XXX. Add nehalem,
westmere, sandybridge, ivybridge, haswell, bonnell, silvermont.
(ix86_lea_outperforms): Updated.
(ix86_issue_rate): Likewise.
(ix86_adjust_cost): Likewise.
(ia32_multipass_dfa_lookahead): Likewise.
(do_reorder_for_imul): Likewise.
(swap_top_of_ready_list): Likewise.
(ix86_sched_reorder): Likewise.
(ix86_sched_init_global): Likewise.
(get_builtin_code_for_version): Likewise.
(processor_model): Replace M_INTEL_ATOM, M_INTEL_SLM with
M_INTEL_BONNELL, M_INTEL_SILVERMONT.
(arch_names_table): Updated.
* config/i386/i386.h (TARGET_COREI7): Removed.
(TARGET_COREI7_AVX): Likewise.
(TARGET_ATOM): Likewise.
(TARGET_SLM): Likewise.
(TARGET_NEHALEM): New.
(TARGET_SANDYBRIDGE): Likewise.
(TARGET_BONNELL): Likewise.
(TARGET_SILVERMONT): Likewise.
(target_cpu_default): Add TARGET_CPU_DEFAULT_core_avx2,
TARGET_CPU_DEFAULT_nehalem, TARGET_CPU_DEFAULT_westmere,
TARGET_CPU_DEFAULT_sandybridge, TARGET_CPU_DEFAULT_ivybridge,
TARGET_CPU_DEFAULT_broadwell, TARGET_CPU_DEFAULT_bonnell,
TARGET_CPU_DEFAULT_silvermont. Move TARGET_CPU_DEFAULT_haswell
before TARGET_CPU_DEFAULT_broadwell.
(processor_type): Replace PROCESSOR_COREI7, PROCESSOR_COREI7_AVX,
PROCESSOR_ATOM, PROCESSOR_SLM with PROCESSOR_NEHALEM,
PROCESSOR_SANDYBRIDGE, PROCESSOR_BONNELL, PROCESSOR_SILVERMONT.
* config/i386/i386.md (cpu): Replace corei7 with nehalem.
* config/i386/x86-tune.def: Updated.
* doc/invoke.texi: Replace corei7, corei7-avx, core-avx-i,
core-avx2, atom, slm with nehalem, sandybridge, ivybridge,
haswell, bonnel, silvermont. Add westmere.
libgcc/
* config/i386/cpuinfo.c (processor_subtypes): Replace INTEL_ATOM,
INTEL_SLM with INTEL_BONNELL, INTEL_SILVERMONT.
(get_intel_cpu): Updated.
Co-Authored-By: Tocar Ilya <ilya.tocar@intel.com>
From-SVN: r206178
2013-12-23 14:05:09 +01:00
|
|
|
__cpu_model.__cpu_type = INTEL_SILVERMONT;
|
2013-11-22 17:33:40 +01:00
|
|
|
break;
|
2012-04-25 02:08:37 +02:00
|
|
|
case 0x1a:
|
|
|
|
case 0x1e:
|
|
|
|
case 0x1f:
|
|
|
|
case 0x2e:
|
|
|
|
/* Nehalem. */
|
|
|
|
__cpu_model.__cpu_type = INTEL_COREI7;
|
|
|
|
__cpu_model.__cpu_subtype = INTEL_COREI7_NEHALEM;
|
|
|
|
break;
|
|
|
|
case 0x25:
|
|
|
|
case 0x2c:
|
|
|
|
case 0x2f:
|
|
|
|
/* Westmere. */
|
|
|
|
__cpu_model.__cpu_type = INTEL_COREI7;
|
|
|
|
__cpu_model.__cpu_subtype = INTEL_COREI7_WESTMERE;
|
|
|
|
break;
|
|
|
|
case 0x2a:
|
2013-03-08 02:02:29 +01:00
|
|
|
case 0x2d:
|
2012-04-25 02:08:37 +02:00
|
|
|
/* Sandy Bridge. */
|
|
|
|
__cpu_model.__cpu_type = INTEL_COREI7;
|
|
|
|
__cpu_model.__cpu_subtype = INTEL_COREI7_SANDYBRIDGE;
|
|
|
|
break;
|
|
|
|
case 0x17:
|
|
|
|
case 0x1d:
|
|
|
|
/* Penryn. */
|
|
|
|
case 0x0f:
|
|
|
|
/* Merom. */
|
|
|
|
__cpu_model.__cpu_type = INTEL_CORE2;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
/* We have no idea. */
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-04-26 02:52:09 +02:00
|
|
|
/* ECX and EDX are output of CPUID at level one. MAX_CPUID_LEVEL is
|
|
|
|
the max possible level of CPUID insn. */
|
2012-04-25 02:08:37 +02:00
|
|
|
static void
|
2012-04-26 02:52:09 +02:00
|
|
|
get_available_features (unsigned int ecx, unsigned int edx,
|
|
|
|
int max_cpuid_level)
|
2012-04-25 02:08:37 +02:00
|
|
|
{
|
|
|
|
unsigned int features = 0;
|
|
|
|
|
|
|
|
if (edx & bit_CMOV)
|
|
|
|
features |= (1 << FEATURE_CMOV);
|
|
|
|
if (edx & bit_MMX)
|
|
|
|
features |= (1 << FEATURE_MMX);
|
|
|
|
if (edx & bit_SSE)
|
|
|
|
features |= (1 << FEATURE_SSE);
|
|
|
|
if (edx & bit_SSE2)
|
|
|
|
features |= (1 << FEATURE_SSE2);
|
|
|
|
if (ecx & bit_POPCNT)
|
|
|
|
features |= (1 << FEATURE_POPCNT);
|
|
|
|
if (ecx & bit_SSE3)
|
|
|
|
features |= (1 << FEATURE_SSE3);
|
|
|
|
if (ecx & bit_SSSE3)
|
|
|
|
features |= (1 << FEATURE_SSSE3);
|
|
|
|
if (ecx & bit_SSE4_1)
|
|
|
|
features |= (1 << FEATURE_SSE4_1);
|
|
|
|
if (ecx & bit_SSE4_2)
|
|
|
|
features |= (1 << FEATURE_SSE4_2);
|
|
|
|
if (ecx & bit_AVX)
|
|
|
|
features |= (1 << FEATURE_AVX);
|
|
|
|
|
2012-04-26 02:52:09 +02:00
|
|
|
/* Get Advanced Features at level 7 (eax = 7, ecx = 0). */
|
|
|
|
if (max_cpuid_level >= 7)
|
|
|
|
{
|
|
|
|
unsigned int eax, ebx, ecx, edx;
|
|
|
|
__cpuid_count (7, 0, eax, ebx, ecx, edx);
|
|
|
|
if (ebx & bit_AVX2)
|
|
|
|
features |= (1 << FEATURE_AVX2);
|
|
|
|
}
|
|
|
|
|
2012-04-25 02:08:37 +02:00
|
|
|
__cpu_model.__cpu_features[0] = features;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* A noinline function calling __get_cpuid. Having many calls to
|
|
|
|
cpuid in one function in 32-bit mode causes GCC to complain:
|
|
|
|
"can't find a register in class CLOBBERED_REGS". This is
|
|
|
|
related to PR rtl-optimization 44174. */
|
|
|
|
|
|
|
|
static int __attribute__ ((noinline))
|
|
|
|
__get_cpuid_output (unsigned int __level,
|
|
|
|
unsigned int *__eax, unsigned int *__ebx,
|
|
|
|
unsigned int *__ecx, unsigned int *__edx)
|
|
|
|
{
|
|
|
|
return __get_cpuid (__level, __eax, __ebx, __ecx, __edx);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* A constructor function that is sets __cpu_model and __cpu_features with
|
|
|
|
the right values. This needs to run only once. This constructor is
|
|
|
|
given the highest priority and it should run before constructors without
|
|
|
|
the priority set. However, it still runs after ifunc initializers and
|
|
|
|
needs to be called explicitly there. */
|
|
|
|
|
2012-05-10 10:51:39 +02:00
|
|
|
int __attribute__ ((constructor CONSTRUCTOR_PRIORITY))
|
2012-04-25 02:08:37 +02:00
|
|
|
__cpu_indicator_init (void)
|
|
|
|
{
|
|
|
|
unsigned int eax, ebx, ecx, edx;
|
|
|
|
|
|
|
|
int max_level = 5;
|
|
|
|
unsigned int vendor;
|
|
|
|
unsigned int model, family, brand_id;
|
|
|
|
unsigned int extended_model, extended_family;
|
|
|
|
|
|
|
|
/* This function needs to run just once. */
|
|
|
|
if (__cpu_model.__cpu_vendor)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* Assume cpuid insn present. Run in level 0 to get vendor id. */
|
|
|
|
if (!__get_cpuid_output (0, &eax, &ebx, &ecx, &edx))
|
2012-04-25 04:04:22 +02:00
|
|
|
{
|
|
|
|
__cpu_model.__cpu_vendor = VENDOR_OTHER;
|
|
|
|
return -1;
|
|
|
|
}
|
2012-04-25 02:08:37 +02:00
|
|
|
|
|
|
|
vendor = ebx;
|
|
|
|
max_level = eax;
|
|
|
|
|
|
|
|
if (max_level < 1)
|
2012-04-25 04:04:22 +02:00
|
|
|
{
|
|
|
|
__cpu_model.__cpu_vendor = VENDOR_OTHER;
|
|
|
|
return -1;
|
|
|
|
}
|
2012-04-25 02:08:37 +02:00
|
|
|
|
|
|
|
if (!__get_cpuid_output (1, &eax, &ebx, &ecx, &edx))
|
2012-04-25 04:04:22 +02:00
|
|
|
{
|
|
|
|
__cpu_model.__cpu_vendor = VENDOR_OTHER;
|
|
|
|
return -1;
|
|
|
|
}
|
2012-04-25 02:08:37 +02:00
|
|
|
|
|
|
|
model = (eax >> 4) & 0x0f;
|
|
|
|
family = (eax >> 8) & 0x0f;
|
|
|
|
brand_id = ebx & 0xff;
|
|
|
|
extended_model = (eax >> 12) & 0xf0;
|
|
|
|
extended_family = (eax >> 20) & 0xff;
|
|
|
|
|
|
|
|
if (vendor == SIG_INTEL)
|
|
|
|
{
|
|
|
|
/* Adjust model and family for Intel CPUS. */
|
|
|
|
if (family == 0x0f)
|
|
|
|
{
|
|
|
|
family += extended_family;
|
|
|
|
model += extended_model;
|
|
|
|
}
|
|
|
|
else if (family == 0x06)
|
|
|
|
model += extended_model;
|
|
|
|
|
|
|
|
/* Get CPU type. */
|
|
|
|
get_intel_cpu (family, model, brand_id);
|
|
|
|
/* Find available features. */
|
2012-04-26 02:52:09 +02:00
|
|
|
get_available_features (ecx, edx, max_level);
|
2012-04-25 02:08:37 +02:00
|
|
|
__cpu_model.__cpu_vendor = VENDOR_INTEL;
|
|
|
|
}
|
|
|
|
else if (vendor == SIG_AMD)
|
|
|
|
{
|
|
|
|
/* Adjust model and family for AMD CPUS. */
|
|
|
|
if (family == 0x0f)
|
|
|
|
{
|
|
|
|
family += extended_family;
|
|
|
|
model += (extended_model << 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Get CPU type. */
|
|
|
|
get_amd_cpu (family, model);
|
|
|
|
/* Find available features. */
|
2012-04-26 02:52:09 +02:00
|
|
|
get_available_features (ecx, edx, max_level);
|
2012-04-25 02:08:37 +02:00
|
|
|
__cpu_model.__cpu_vendor = VENDOR_AMD;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
__cpu_model.__cpu_vendor = VENDOR_OTHER;
|
|
|
|
|
|
|
|
gcc_assert (__cpu_model.__cpu_vendor < VENDOR_MAX);
|
|
|
|
gcc_assert (__cpu_model.__cpu_type < CPU_TYPE_MAX);
|
|
|
|
gcc_assert (__cpu_model.__cpu_subtype < CPU_SUBTYPE_MAX);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|