annotate gcc/config/i386/driver-i386.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /* Subroutines for the gcc driver.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2006-2020 Free Software Foundation, Inc.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 This file is part of GCC.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 the Free Software Foundation; either version 3, or (at your option)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 any later version.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 GNU General Public License for more details.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
20 #define IN_TARGET_CODE 1
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
21
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #include "config.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 #include "system.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 #include "coretypes.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 #include "tm.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 const char *host_detect_local_cpu (int argc, const char **argv);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28
111
kono
parents: 67
diff changeset
29 #if defined(__GNUC__) && (__GNUC__ >= 5 || !defined(__PIC__))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 #include "cpuid.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 struct cache_desc
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 unsigned sizekb;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 unsigned assoc;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 unsigned line;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 /* Returns command line parameters that describe size and
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 cache line size of the processor caches. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 static char *
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 describe_cache (struct cache_desc level1, struct cache_desc level2)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 char size[100], line[100], size2[100];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 /* At the moment, gcc does not use the information
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 about the associativity of the cache. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
50 snprintf (size, sizeof (size),
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
51 "--param l1-cache-size=%u ", level1.sizekb);
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
52 snprintf (line, sizeof (line),
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
53 "--param l1-cache-line-size=%u ", level1.line);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
55 snprintf (size2, sizeof (size2),
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
56 "--param l2-cache-size=%u ", level2.sizekb);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
58 return concat (size, line, size2, NULL);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 /* Detect L2 cache parameters using CPUID extended function 0x80000006. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 detect_l2_cache (struct cache_desc *level2)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 unsigned eax, ebx, ecx, edx;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 unsigned assoc;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 __cpuid (0x80000006, eax, ebx, ecx, edx);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 level2->sizekb = (ecx >> 16) & 0xffff;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 level2->line = ecx & 0xff;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 assoc = (ecx >> 12) & 0xf;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 if (assoc == 6)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 assoc = 8;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 else if (assoc == 8)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 assoc = 16;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 else if (assoc >= 0xa && assoc <= 0xc)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 assoc = 32 + (assoc - 0xa) * 16;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 else if (assoc >= 0xd && assoc <= 0xe)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 assoc = 96 + (assoc - 0xd) * 32;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 level2->assoc = assoc;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 /* Returns the description of caches for an AMD processor. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 static const char *
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 detect_caches_amd (unsigned max_ext_level)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 unsigned eax, ebx, ecx, edx;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 struct cache_desc level1, level2 = {0, 0, 0};
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 if (max_ext_level < 0x80000005)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 return "";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 __cpuid (0x80000005, eax, ebx, ecx, edx);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 level1.sizekb = (ecx >> 24) & 0xff;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 level1.assoc = (ecx >> 16) & 0xff;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 level1.line = ecx & 0xff;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 if (max_ext_level >= 0x80000006)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 detect_l2_cache (&level2);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 return describe_cache (level1, level2);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 /* Decodes the size, the associativity and the cache line size of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 L1/L2 caches of an Intel processor. Values are based on
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 "Intel Processor Identification and the CPUID Instruction"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 [Application Note 485], revision -032, December 2007. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 decode_caches_intel (unsigned reg, bool xeon_mp,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 struct cache_desc *level1, struct cache_desc *level2)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 int i;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 for (i = 24; i >= 0; i -= 8)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 switch ((reg >> i) & 0xff)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 case 0x0a:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 level1->sizekb = 8; level1->assoc = 2; level1->line = 32;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 case 0x0c:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 level1->sizekb = 16; level1->assoc = 4; level1->line = 32;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 break;
111
kono
parents: 67
diff changeset
131 case 0x0d:
kono
parents: 67
diff changeset
132 level1->sizekb = 16; level1->assoc = 4; level1->line = 64;
kono
parents: 67
diff changeset
133 break;
kono
parents: 67
diff changeset
134 case 0x0e:
kono
parents: 67
diff changeset
135 level1->sizekb = 24; level1->assoc = 6; level1->line = 64;
kono
parents: 67
diff changeset
136 break;
kono
parents: 67
diff changeset
137 case 0x21:
kono
parents: 67
diff changeset
138 level2->sizekb = 256; level2->assoc = 8; level2->line = 64;
kono
parents: 67
diff changeset
139 break;
kono
parents: 67
diff changeset
140 case 0x24:
kono
parents: 67
diff changeset
141 level2->sizekb = 1024; level2->assoc = 16; level2->line = 64;
kono
parents: 67
diff changeset
142 break;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 case 0x2c:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 level1->sizekb = 32; level1->assoc = 8; level1->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 case 0x39:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 level2->sizekb = 128; level2->assoc = 4; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 case 0x3a:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 level2->sizekb = 192; level2->assoc = 6; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 case 0x3b:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 level2->sizekb = 128; level2->assoc = 2; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 case 0x3c:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 level2->sizekb = 256; level2->assoc = 4; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 case 0x3d:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 level2->sizekb = 384; level2->assoc = 6; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 case 0x3e:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 level2->sizekb = 512; level2->assoc = 4; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 case 0x41:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 level2->sizekb = 128; level2->assoc = 4; level2->line = 32;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 case 0x42:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 level2->sizekb = 256; level2->assoc = 4; level2->line = 32;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 case 0x43:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 level2->sizekb = 512; level2->assoc = 4; level2->line = 32;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 case 0x44:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 level2->sizekb = 1024; level2->assoc = 4; level2->line = 32;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 case 0x45:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 level2->sizekb = 2048; level2->assoc = 4; level2->line = 32;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 break;
111
kono
parents: 67
diff changeset
179 case 0x48:
kono
parents: 67
diff changeset
180 level2->sizekb = 3072; level2->assoc = 12; level2->line = 64;
kono
parents: 67
diff changeset
181 break;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 case 0x49:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 if (xeon_mp)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 level2->sizekb = 4096; level2->assoc = 16; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 case 0x4e:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 level2->sizekb = 6144; level2->assoc = 24; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 case 0x60:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 level1->sizekb = 16; level1->assoc = 8; level1->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 case 0x66:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 level1->sizekb = 8; level1->assoc = 4; level1->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 case 0x67:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 level1->sizekb = 16; level1->assoc = 4; level1->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 case 0x68:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 level1->sizekb = 32; level1->assoc = 4; level1->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 case 0x78:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 level2->sizekb = 1024; level2->assoc = 4; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 case 0x79:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 level2->sizekb = 128; level2->assoc = 8; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 case 0x7a:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 level2->sizekb = 256; level2->assoc = 8; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 case 0x7b:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 level2->sizekb = 512; level2->assoc = 8; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 case 0x7c:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 level2->sizekb = 1024; level2->assoc = 8; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 case 0x7d:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 level2->sizekb = 2048; level2->assoc = 8; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 case 0x7f:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 level2->sizekb = 512; level2->assoc = 2; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 break;
111
kono
parents: 67
diff changeset
223 case 0x80:
kono
parents: 67
diff changeset
224 level2->sizekb = 512; level2->assoc = 8; level2->line = 64;
kono
parents: 67
diff changeset
225 break;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 case 0x82:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 level2->sizekb = 256; level2->assoc = 8; level2->line = 32;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 case 0x83:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 level2->sizekb = 512; level2->assoc = 8; level2->line = 32;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 case 0x84:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 level2->sizekb = 1024; level2->assoc = 8; level2->line = 32;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 case 0x85:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 level2->sizekb = 2048; level2->assoc = 8; level2->line = 32;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 case 0x86:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 level2->sizekb = 512; level2->assoc = 4; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 case 0x87:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 level2->sizekb = 1024; level2->assoc = 8; level2->line = 64;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
243
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 default:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
248
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 /* Detect cache parameters using CPUID function 2. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
250
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 static void
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 detect_caches_cpuid2 (bool xeon_mp,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 struct cache_desc *level1, struct cache_desc *level2)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 unsigned regs[4];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
256 int nreps, i;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
257
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 __cpuid (2, regs[0], regs[1], regs[2], regs[3]);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
259
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 nreps = regs[0] & 0x0f;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 regs[0] &= ~0x0f;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
262
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 while (--nreps >= 0)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
264 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
265 for (i = 0; i < 4; i++)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 if (regs[i] && !((regs[i] >> 31) & 1))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 decode_caches_intel (regs[i], xeon_mp, level1, level2);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
268
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 if (nreps)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 __cpuid (2, regs[0], regs[1], regs[2], regs[3]);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
273
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 /* Detect cache parameters using CPUID function 4. This
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 method doesn't require hardcoded tables. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
276
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 enum cache_type
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
278 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
279 CACHE_END = 0,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 CACHE_DATA = 1,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
281 CACHE_INST = 2,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
282 CACHE_UNIFIED = 3
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
283 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
284
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
285 static void
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
286 detect_caches_cpuid4 (struct cache_desc *level1, struct cache_desc *level2,
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
287 struct cache_desc *level3)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
288 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
289 struct cache_desc *cache;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
290
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
291 unsigned eax, ebx, ecx, edx;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
292 int count;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
293
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
294 for (count = 0;; count++)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
295 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
296 __cpuid_count(4, count, eax, ebx, ecx, edx);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
297 switch (eax & 0x1f)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
298 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
299 case CACHE_END:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
301 case CACHE_DATA:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 case CACHE_UNIFIED:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 switch ((eax >> 5) & 0x07)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 case 1:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
307 cache = level1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
308 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
309 case 2:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
310 cache = level2;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
311 break;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
312 case 3:
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
313 cache = level3;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
314 break;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
315 default:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 cache = NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
317 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
318
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
319 if (cache)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
320 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
321 unsigned sets = ecx + 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
322 unsigned part = ((ebx >> 12) & 0x03ff) + 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
323
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
324 cache->assoc = ((ebx >> 22) & 0x03ff) + 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
325 cache->line = (ebx & 0x0fff) + 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
326
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
327 cache->sizekb = (cache->assoc * part
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
328 * cache->line * sets) / 1024;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
329 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
330 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
331 default:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
332 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
333 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
334 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
335 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
336
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
337 /* Returns the description of caches for an Intel processor. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
338
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
339 static const char *
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
340 detect_caches_intel (bool xeon_mp, unsigned max_level,
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
341 unsigned max_ext_level, unsigned *l2sizekb)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
342 {
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
343 struct cache_desc level1 = {0, 0, 0}, level2 = {0, 0, 0}, level3 = {0, 0, 0};
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
344
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
345 if (max_level >= 4)
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
346 detect_caches_cpuid4 (&level1, &level2, &level3);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
347 else if (max_level >= 2)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
348 detect_caches_cpuid2 (xeon_mp, &level1, &level2);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
349 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 return "";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
351
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
352 if (level1.sizekb == 0)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
353 return "";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
354
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
355 /* Let the L3 replace the L2. This assumes inclusive caches
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
356 and single threaded program for now. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
357 if (level3.sizekb)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
358 level2 = level3;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
359
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
360 /* Intel CPUs are equipped with AMD style L2 cache info. Try this
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
361 method if other methods fail to provide L2 cache parameters. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
362 if (level2.sizekb == 0 && max_ext_level >= 0x80000006)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
363 detect_l2_cache (&level2);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
364
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
365 *l2sizekb = level2.sizekb;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
366
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
367 return describe_cache (level1, level2);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
368 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
369
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
370 /* This will be called by the spec parser in gcc.c when it sees
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
371 a %:local_cpu_detect(args) construct. Currently it will be called
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
372 with either "arch" or "tune" as argument depending on if -march=native
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
373 or -mtune=native is to be substituted.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
374
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
375 It returns a string containing new command line parameters to be
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
376 put at the place of the above two options, depending on what CPU
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
377 this is executed. E.g. "-march=k8" on an AMD64 machine
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
378 for -march=native.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
379
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
380 ARGC and ARGV are set depending on the actual arguments given
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
381 in the spec. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
382
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
383 const char *host_detect_local_cpu (int argc, const char **argv)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
384 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
385 enum processor_type processor = PROCESSOR_I386;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
386 const char *cpu = "i386";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
387
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
388 const char *cache = "";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
389 const char *options = "";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
390
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
391 unsigned int eax, ebx, ecx, edx;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
392
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
393 unsigned int max_level, ext_level;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
394
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
395 unsigned int vendor;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
396 unsigned int model, family;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
397
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
398 unsigned int has_sse3, has_ssse3, has_cmpxchg16b;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
399 unsigned int has_cmpxchg8b, has_cmov, has_mmx, has_sse, has_sse2;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
400
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
401 /* Extended features */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
402 unsigned int has_lahf_lm = 0, has_sse4a = 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
403 unsigned int has_longmode = 0, has_3dnowp = 0, has_3dnow = 0;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
404 unsigned int has_movbe = 0, has_sse4_1 = 0, has_sse4_2 = 0;
111
kono
parents: 67
diff changeset
405 unsigned int has_popcnt = 0, has_aes = 0, has_avx = 0, has_avx2 = 0;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
406 unsigned int has_pclmul = 0, has_abm = 0, has_lwp = 0;
111
kono
parents: 67
diff changeset
407 unsigned int has_fma = 0, has_fma4 = 0, has_xop = 0;
kono
parents: 67
diff changeset
408 unsigned int has_bmi = 0, has_bmi2 = 0, has_tbm = 0, has_lzcnt = 0;
kono
parents: 67
diff changeset
409 unsigned int has_hle = 0, has_rtm = 0, has_sgx = 0;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
410 unsigned int has_pconfig = 0, has_wbnoinvd = 0;
111
kono
parents: 67
diff changeset
411 unsigned int has_rdrnd = 0, has_f16c = 0, has_fsgsbase = 0;
kono
parents: 67
diff changeset
412 unsigned int has_rdseed = 0, has_prfchw = 0, has_adx = 0;
kono
parents: 67
diff changeset
413 unsigned int has_osxsave = 0, has_fxsr = 0, has_xsave = 0, has_xsaveopt = 0;
kono
parents: 67
diff changeset
414 unsigned int has_avx512er = 0, has_avx512pf = 0, has_avx512cd = 0;
kono
parents: 67
diff changeset
415 unsigned int has_avx512f = 0, has_sha = 0, has_prefetchwt1 = 0;
kono
parents: 67
diff changeset
416 unsigned int has_clflushopt = 0, has_xsavec = 0, has_xsaves = 0;
kono
parents: 67
diff changeset
417 unsigned int has_avx512dq = 0, has_avx512bw = 0, has_avx512vl = 0;
kono
parents: 67
diff changeset
418 unsigned int has_avx512vbmi = 0, has_avx512ifma = 0, has_clwb = 0;
kono
parents: 67
diff changeset
419 unsigned int has_mwaitx = 0, has_clzero = 0, has_pku = 0, has_rdpid = 0;
kono
parents: 67
diff changeset
420 unsigned int has_avx5124fmaps = 0, has_avx5124vnniw = 0;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
421 unsigned int has_gfni = 0, has_avx512vbmi2 = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
422 unsigned int has_avx512bitalg = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
423 unsigned int has_shstk = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
424 unsigned int has_avx512vnni = 0, has_vaes = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
425 unsigned int has_vpclmulqdq = 0;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
426 unsigned int has_avx512vp2intersect = 0;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
427 unsigned int has_movdiri = 0, has_movdir64b = 0;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
428 unsigned int has_enqcmd = 0;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
429 unsigned int has_waitpkg = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
430 unsigned int has_cldemote = 0;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
431 unsigned int has_avx512bf16 = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
432
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
433 unsigned int has_ptwrite = 0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
434
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
435 bool arch;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
436
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
437 unsigned int l2sizekb = 0;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
438
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
439 if (argc < 1)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
440 return NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
441
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
442 arch = !strcmp (argv[0], "arch");
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
443
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
444 if (!arch && strcmp (argv[0], "tune"))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
445 return NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
446
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
447 max_level = __get_cpuid_max (0, &vendor);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
448 if (max_level < 1)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
449 goto done;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
450
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
451 __cpuid (1, eax, ebx, ecx, edx);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
452
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
453 model = (eax >> 4) & 0x0f;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
454 family = (eax >> 8) & 0x0f;
111
kono
parents: 67
diff changeset
455 if (vendor == signature_INTEL_ebx
kono
parents: 67
diff changeset
456 || vendor == signature_AMD_ebx)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
457 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
458 unsigned int extended_model, extended_family;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
459
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
460 extended_model = (eax >> 12) & 0xf0;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
461 extended_family = (eax >> 20) & 0xff;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
462 if (family == 0x0f)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
463 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
464 family += extended_family;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
465 model += extended_model;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
466 }
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
467 else if (family == 0x06)
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
468 model += extended_model;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
469 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
470
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
471 has_sse3 = ecx & bit_SSE3;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
472 has_ssse3 = ecx & bit_SSSE3;
19
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
473 has_sse4_1 = ecx & bit_SSE4_1;
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
474 has_sse4_2 = ecx & bit_SSE4_2;
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
475 has_avx = ecx & bit_AVX;
111
kono
parents: 67
diff changeset
476 has_osxsave = ecx & bit_OSXSAVE;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
477 has_cmpxchg16b = ecx & bit_CMPXCHG16B;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
478 has_movbe = ecx & bit_MOVBE;
19
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
479 has_popcnt = ecx & bit_POPCNT;
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
480 has_aes = ecx & bit_AES;
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
481 has_pclmul = ecx & bit_PCLMUL;
111
kono
parents: 67
diff changeset
482 has_fma = ecx & bit_FMA;
kono
parents: 67
diff changeset
483 has_f16c = ecx & bit_F16C;
kono
parents: 67
diff changeset
484 has_rdrnd = ecx & bit_RDRND;
kono
parents: 67
diff changeset
485 has_xsave = ecx & bit_XSAVE;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
486
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
487 has_cmpxchg8b = edx & bit_CMPXCHG8B;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
488 has_cmov = edx & bit_CMOV;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
489 has_mmx = edx & bit_MMX;
111
kono
parents: 67
diff changeset
490 has_fxsr = edx & bit_FXSAVE;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
491 has_sse = edx & bit_SSE;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
492 has_sse2 = edx & bit_SSE2;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
493
111
kono
parents: 67
diff changeset
494 if (max_level >= 7)
kono
parents: 67
diff changeset
495 {
kono
parents: 67
diff changeset
496 __cpuid_count (7, 0, eax, ebx, ecx, edx);
kono
parents: 67
diff changeset
497
kono
parents: 67
diff changeset
498 has_bmi = ebx & bit_BMI;
kono
parents: 67
diff changeset
499 has_sgx = ebx & bit_SGX;
kono
parents: 67
diff changeset
500 has_hle = ebx & bit_HLE;
kono
parents: 67
diff changeset
501 has_rtm = ebx & bit_RTM;
kono
parents: 67
diff changeset
502 has_avx2 = ebx & bit_AVX2;
kono
parents: 67
diff changeset
503 has_bmi2 = ebx & bit_BMI2;
kono
parents: 67
diff changeset
504 has_fsgsbase = ebx & bit_FSGSBASE;
kono
parents: 67
diff changeset
505 has_rdseed = ebx & bit_RDSEED;
kono
parents: 67
diff changeset
506 has_adx = ebx & bit_ADX;
kono
parents: 67
diff changeset
507 has_avx512f = ebx & bit_AVX512F;
kono
parents: 67
diff changeset
508 has_avx512er = ebx & bit_AVX512ER;
kono
parents: 67
diff changeset
509 has_avx512pf = ebx & bit_AVX512PF;
kono
parents: 67
diff changeset
510 has_avx512cd = ebx & bit_AVX512CD;
kono
parents: 67
diff changeset
511 has_sha = ebx & bit_SHA;
kono
parents: 67
diff changeset
512 has_clflushopt = ebx & bit_CLFLUSHOPT;
kono
parents: 67
diff changeset
513 has_clwb = ebx & bit_CLWB;
kono
parents: 67
diff changeset
514 has_avx512dq = ebx & bit_AVX512DQ;
kono
parents: 67
diff changeset
515 has_avx512bw = ebx & bit_AVX512BW;
kono
parents: 67
diff changeset
516 has_avx512vl = ebx & bit_AVX512VL;
kono
parents: 67
diff changeset
517 has_avx512ifma = ebx & bit_AVX512IFMA;
kono
parents: 67
diff changeset
518
kono
parents: 67
diff changeset
519 has_prefetchwt1 = ecx & bit_PREFETCHWT1;
kono
parents: 67
diff changeset
520 has_avx512vbmi = ecx & bit_AVX512VBMI;
kono
parents: 67
diff changeset
521 has_pku = ecx & bit_OSPKE;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
522 has_avx512vbmi2 = ecx & bit_AVX512VBMI2;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
523 has_avx512vnni = ecx & bit_AVX512VNNI;
111
kono
parents: 67
diff changeset
524 has_rdpid = ecx & bit_RDPID;
kono
parents: 67
diff changeset
525 has_gfni = ecx & bit_GFNI;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
526 has_vaes = ecx & bit_VAES;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
527 has_vpclmulqdq = ecx & bit_VPCLMULQDQ;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
528 has_avx512bitalg = ecx & bit_AVX512BITALG;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
529 has_movdiri = ecx & bit_MOVDIRI;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
530 has_movdir64b = ecx & bit_MOVDIR64B;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
531 has_enqcmd = ecx & bit_ENQCMD;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
532 has_cldemote = ecx & bit_CLDEMOTE;
111
kono
parents: 67
diff changeset
533
kono
parents: 67
diff changeset
534 has_avx5124vnniw = edx & bit_AVX5124VNNIW;
kono
parents: 67
diff changeset
535 has_avx5124fmaps = edx & bit_AVX5124FMAPS;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
536 has_avx512vp2intersect = edx & bit_AVX512VP2INTERSECT;
111
kono
parents: 67
diff changeset
537
kono
parents: 67
diff changeset
538 has_shstk = ecx & bit_SHSTK;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
539 has_pconfig = edx & bit_PCONFIG;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
540 has_waitpkg = ecx & bit_WAITPKG;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
541
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
542 __cpuid_count (7, 1, eax, ebx, ecx, edx);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
543 has_avx512bf16 = eax & bit_AVX512BF16;
111
kono
parents: 67
diff changeset
544 }
kono
parents: 67
diff changeset
545
kono
parents: 67
diff changeset
546 if (max_level >= 13)
kono
parents: 67
diff changeset
547 {
kono
parents: 67
diff changeset
548 __cpuid_count (13, 1, eax, ebx, ecx, edx);
kono
parents: 67
diff changeset
549
kono
parents: 67
diff changeset
550 has_xsaveopt = eax & bit_XSAVEOPT;
kono
parents: 67
diff changeset
551 has_xsavec = eax & bit_XSAVEC;
kono
parents: 67
diff changeset
552 has_xsaves = eax & bit_XSAVES;
kono
parents: 67
diff changeset
553 }
kono
parents: 67
diff changeset
554
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
555 if (max_level >= 0x14)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
556 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
557 __cpuid_count (0x14, 0, eax, ebx, ecx, edx);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
558
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
559 has_ptwrite = ebx & bit_PTWRITE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
560 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
561
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
562 /* Check cpuid level of extended features. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
563 __cpuid (0x80000000, ext_level, ebx, ecx, edx);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
564
111
kono
parents: 67
diff changeset
565 if (ext_level >= 0x80000001)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
566 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
567 __cpuid (0x80000001, eax, ebx, ecx, edx);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
568
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
569 has_lahf_lm = ecx & bit_LAHF_LM;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
570 has_sse4a = ecx & bit_SSE4a;
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
571 has_abm = ecx & bit_ABM;
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
572 has_lwp = ecx & bit_LWP;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
573 has_fma4 = ecx & bit_FMA4;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
574 has_xop = ecx & bit_XOP;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
575 has_tbm = ecx & bit_TBM;
111
kono
parents: 67
diff changeset
576 has_lzcnt = ecx & bit_LZCNT;
kono
parents: 67
diff changeset
577 has_prfchw = ecx & bit_PRFCHW;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
578
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
579 has_longmode = edx & bit_LM;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
580 has_3dnowp = edx & bit_3DNOWP;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
581 has_3dnow = edx & bit_3DNOW;
111
kono
parents: 67
diff changeset
582 has_mwaitx = ecx & bit_MWAITX;
kono
parents: 67
diff changeset
583 }
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
584
111
kono
parents: 67
diff changeset
585 if (ext_level >= 0x80000008)
kono
parents: 67
diff changeset
586 {
kono
parents: 67
diff changeset
587 __cpuid (0x80000008, eax, ebx, ecx, edx);
kono
parents: 67
diff changeset
588 has_clzero = ebx & bit_CLZERO;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
589 has_wbnoinvd = ebx & bit_WBNOINVD;
111
kono
parents: 67
diff changeset
590 }
kono
parents: 67
diff changeset
591
kono
parents: 67
diff changeset
592 /* Get XCR_XFEATURE_ENABLED_MASK register with xgetbv. */
kono
parents: 67
diff changeset
593 #define XCR_XFEATURE_ENABLED_MASK 0x0
kono
parents: 67
diff changeset
594 #define XSTATE_FP 0x1
kono
parents: 67
diff changeset
595 #define XSTATE_SSE 0x2
kono
parents: 67
diff changeset
596 #define XSTATE_YMM 0x4
kono
parents: 67
diff changeset
597 #define XSTATE_OPMASK 0x20
kono
parents: 67
diff changeset
598 #define XSTATE_ZMM 0x40
kono
parents: 67
diff changeset
599 #define XSTATE_HI_ZMM 0x80
kono
parents: 67
diff changeset
600
kono
parents: 67
diff changeset
601 #define XCR_AVX_ENABLED_MASK \
kono
parents: 67
diff changeset
602 (XSTATE_SSE | XSTATE_YMM)
kono
parents: 67
diff changeset
603 #define XCR_AVX512F_ENABLED_MASK \
kono
parents: 67
diff changeset
604 (XSTATE_SSE | XSTATE_YMM | XSTATE_OPMASK | XSTATE_ZMM | XSTATE_HI_ZMM)
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
605
111
kono
parents: 67
diff changeset
606 if (has_osxsave)
kono
parents: 67
diff changeset
607 asm (".byte 0x0f; .byte 0x01; .byte 0xd0"
kono
parents: 67
diff changeset
608 : "=a" (eax), "=d" (edx)
kono
parents: 67
diff changeset
609 : "c" (XCR_XFEATURE_ENABLED_MASK));
kono
parents: 67
diff changeset
610 else
kono
parents: 67
diff changeset
611 eax = 0;
kono
parents: 67
diff changeset
612
kono
parents: 67
diff changeset
613 /* Check if AVX registers are supported. */
kono
parents: 67
diff changeset
614 if ((eax & XCR_AVX_ENABLED_MASK) != XCR_AVX_ENABLED_MASK)
kono
parents: 67
diff changeset
615 {
kono
parents: 67
diff changeset
616 has_avx = 0;
kono
parents: 67
diff changeset
617 has_avx2 = 0;
kono
parents: 67
diff changeset
618 has_fma = 0;
kono
parents: 67
diff changeset
619 has_fma4 = 0;
kono
parents: 67
diff changeset
620 has_f16c = 0;
kono
parents: 67
diff changeset
621 has_xop = 0;
kono
parents: 67
diff changeset
622 has_xsave = 0;
kono
parents: 67
diff changeset
623 has_xsaveopt = 0;
kono
parents: 67
diff changeset
624 has_xsaves = 0;
kono
parents: 67
diff changeset
625 has_xsavec = 0;
kono
parents: 67
diff changeset
626 }
kono
parents: 67
diff changeset
627
kono
parents: 67
diff changeset
628 /* Check if AVX512F registers are supported. */
kono
parents: 67
diff changeset
629 if ((eax & XCR_AVX512F_ENABLED_MASK) != XCR_AVX512F_ENABLED_MASK)
kono
parents: 67
diff changeset
630 {
kono
parents: 67
diff changeset
631 has_avx512f = 0;
kono
parents: 67
diff changeset
632 has_avx512er = 0;
kono
parents: 67
diff changeset
633 has_avx512pf = 0;
kono
parents: 67
diff changeset
634 has_avx512cd = 0;
kono
parents: 67
diff changeset
635 has_avx512dq = 0;
kono
parents: 67
diff changeset
636 has_avx512bw = 0;
kono
parents: 67
diff changeset
637 has_avx512vl = 0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
638 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
639
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
640 if (!arch)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
641 {
111
kono
parents: 67
diff changeset
642 if (vendor == signature_AMD_ebx
kono
parents: 67
diff changeset
643 || vendor == signature_CENTAUR_ebx
kono
parents: 67
diff changeset
644 || vendor == signature_CYRIX_ebx
kono
parents: 67
diff changeset
645 || vendor == signature_NSC_ebx)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
646 cache = detect_caches_amd (ext_level);
111
kono
parents: 67
diff changeset
647 else if (vendor == signature_INTEL_ebx)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
648 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
649 bool xeon_mp = (family == 15 && model == 6);
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
650 cache = detect_caches_intel (xeon_mp, max_level,
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
651 ext_level, &l2sizekb);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
652 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
653 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
654
111
kono
parents: 67
diff changeset
655 if (vendor == signature_AMD_ebx)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
656 {
19
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
657 unsigned int name;
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
658
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
659 /* Detect geode processor by its processor signature. */
111
kono
parents: 67
diff changeset
660 if (ext_level >= 0x80000002)
19
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
661 __cpuid (0x80000002, name, ebx, ecx, edx);
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
662 else
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
663 name = 0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
664
111
kono
parents: 67
diff changeset
665 if (name == signature_NSC_ebx)
19
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
666 processor = PROCESSOR_GEODE;
111
kono
parents: 67
diff changeset
667 else if (has_movbe && family == 22)
kono
parents: 67
diff changeset
668 processor = PROCESSOR_BTVER2;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
669 else if (has_clwb)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
670 processor = PROCESSOR_ZNVER2;
111
kono
parents: 67
diff changeset
671 else if (has_clzero)
kono
parents: 67
diff changeset
672 processor = PROCESSOR_ZNVER1;
kono
parents: 67
diff changeset
673 else if (has_avx2)
kono
parents: 67
diff changeset
674 processor = PROCESSOR_BDVER4;
kono
parents: 67
diff changeset
675 else if (has_xsaveopt)
kono
parents: 67
diff changeset
676 processor = PROCESSOR_BDVER3;
kono
parents: 67
diff changeset
677 else if (has_bmi)
kono
parents: 67
diff changeset
678 processor = PROCESSOR_BDVER2;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
679 else if (has_xop)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
680 processor = PROCESSOR_BDVER1;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
681 else if (has_sse4a && has_ssse3)
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
682 processor = PROCESSOR_BTVER1;
19
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
683 else if (has_sse4a)
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
684 processor = PROCESSOR_AMDFAM10;
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
685 else if (has_sse2 || has_longmode)
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
686 processor = PROCESSOR_K8;
111
kono
parents: 67
diff changeset
687 else if (has_3dnowp && family == 6)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
688 processor = PROCESSOR_ATHLON;
19
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
689 else if (has_mmx)
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
690 processor = PROCESSOR_K6;
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
691 else
58ad6c70ea60 update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
692 processor = PROCESSOR_PENTIUM;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
693 }
111
kono
parents: 67
diff changeset
694 else if (vendor == signature_CENTAUR_ebx)
kono
parents: 67
diff changeset
695 {
kono
parents: 67
diff changeset
696 processor = PROCESSOR_GENERIC;
kono
parents: 67
diff changeset
697
kono
parents: 67
diff changeset
698 switch (family)
kono
parents: 67
diff changeset
699 {
kono
parents: 67
diff changeset
700 default:
kono
parents: 67
diff changeset
701 /* We have no idea. */
kono
parents: 67
diff changeset
702 break;
kono
parents: 67
diff changeset
703
kono
parents: 67
diff changeset
704 case 5:
kono
parents: 67
diff changeset
705 if (has_3dnow || has_mmx)
kono
parents: 67
diff changeset
706 processor = PROCESSOR_I486;
kono
parents: 67
diff changeset
707 break;
kono
parents: 67
diff changeset
708
kono
parents: 67
diff changeset
709 case 6:
kono
parents: 67
diff changeset
710 if (has_longmode)
kono
parents: 67
diff changeset
711 processor = PROCESSOR_K8;
kono
parents: 67
diff changeset
712 else if (model >= 9)
kono
parents: 67
diff changeset
713 processor = PROCESSOR_PENTIUMPRO;
kono
parents: 67
diff changeset
714 else if (model >= 6)
kono
parents: 67
diff changeset
715 processor = PROCESSOR_I486;
kono
parents: 67
diff changeset
716 }
kono
parents: 67
diff changeset
717 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
718 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
719 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
720 switch (family)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
721 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
722 case 4:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
723 processor = PROCESSOR_I486;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
724 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
725 case 5:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
726 processor = PROCESSOR_PENTIUM;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
727 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
728 case 6:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
729 processor = PROCESSOR_PENTIUMPRO;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
730 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
731 case 15:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
732 processor = PROCESSOR_PENTIUM4;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
733 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
734 default:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
735 /* We have no idea. */
111
kono
parents: 67
diff changeset
736 processor = PROCESSOR_GENERIC;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
737 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
738 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
739
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
740 switch (processor)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
741 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
742 case PROCESSOR_I386:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
743 /* Default. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
744 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
745 case PROCESSOR_I486:
111
kono
parents: 67
diff changeset
746 if (arch && vendor == signature_CENTAUR_ebx)
kono
parents: 67
diff changeset
747 {
kono
parents: 67
diff changeset
748 if (model >= 6)
kono
parents: 67
diff changeset
749 cpu = "c3";
kono
parents: 67
diff changeset
750 else if (has_3dnow)
kono
parents: 67
diff changeset
751 cpu = "winchip2";
kono
parents: 67
diff changeset
752 else
kono
parents: 67
diff changeset
753 /* Assume WinChip C6. */
kono
parents: 67
diff changeset
754 cpu = "winchip-c6";
kono
parents: 67
diff changeset
755 }
kono
parents: 67
diff changeset
756 else
kono
parents: 67
diff changeset
757 cpu = "i486";
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
758 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
759 case PROCESSOR_PENTIUM:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
760 if (arch && has_mmx)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
761 cpu = "pentium-mmx";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
762 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
763 cpu = "pentium";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
764 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
765 case PROCESSOR_PENTIUMPRO:
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
766 switch (model)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
767 {
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
768 case 0x1c:
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
769 case 0x26:
111
kono
parents: 67
diff changeset
770 /* Bonnell. */
kono
parents: 67
diff changeset
771 cpu = "bonnell";
kono
parents: 67
diff changeset
772 break;
kono
parents: 67
diff changeset
773 case 0x37:
kono
parents: 67
diff changeset
774 case 0x4a:
kono
parents: 67
diff changeset
775 case 0x4d:
kono
parents: 67
diff changeset
776 case 0x5a:
kono
parents: 67
diff changeset
777 case 0x5d:
kono
parents: 67
diff changeset
778 /* Silvermont. */
kono
parents: 67
diff changeset
779 cpu = "silvermont";
kono
parents: 67
diff changeset
780 break;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
781 case 0x5c:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
782 case 0x5f:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
783 /* Goldmont. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
784 cpu = "goldmont";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
785 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
786 case 0x7a:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
787 /* Goldmont Plus. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
788 cpu = "goldmont-plus";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
789 break;
111
kono
parents: 67
diff changeset
790 case 0x0f:
kono
parents: 67
diff changeset
791 /* Merom. */
kono
parents: 67
diff changeset
792 case 0x17:
kono
parents: 67
diff changeset
793 case 0x1d:
kono
parents: 67
diff changeset
794 /* Penryn. */
kono
parents: 67
diff changeset
795 cpu = "core2";
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
796 break;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
797 case 0x1a:
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
798 case 0x1e:
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
799 case 0x1f:
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
800 case 0x2e:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
801 /* Nehalem. */
111
kono
parents: 67
diff changeset
802 cpu = "nehalem";
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
803 break;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
804 case 0x25:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
805 case 0x2c:
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
806 case 0x2f:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
807 /* Westmere. */
111
kono
parents: 67
diff changeset
808 cpu = "westmere";
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
809 break;
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
810 case 0x2a:
111
kono
parents: 67
diff changeset
811 case 0x2d:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
812 /* Sandy Bridge. */
111
kono
parents: 67
diff changeset
813 cpu = "sandybridge";
kono
parents: 67
diff changeset
814 break;
kono
parents: 67
diff changeset
815 case 0x3a:
kono
parents: 67
diff changeset
816 case 0x3e:
kono
parents: 67
diff changeset
817 /* Ivy Bridge. */
kono
parents: 67
diff changeset
818 cpu = "ivybridge";
kono
parents: 67
diff changeset
819 break;
kono
parents: 67
diff changeset
820 case 0x3c:
kono
parents: 67
diff changeset
821 case 0x3f:
kono
parents: 67
diff changeset
822 case 0x45:
kono
parents: 67
diff changeset
823 case 0x46:
kono
parents: 67
diff changeset
824 /* Haswell. */
kono
parents: 67
diff changeset
825 cpu = "haswell";
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
826 break;
111
kono
parents: 67
diff changeset
827 case 0x3d:
kono
parents: 67
diff changeset
828 case 0x47:
kono
parents: 67
diff changeset
829 case 0x4f:
kono
parents: 67
diff changeset
830 case 0x56:
kono
parents: 67
diff changeset
831 /* Broadwell. */
kono
parents: 67
diff changeset
832 cpu = "broadwell";
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
833 break;
111
kono
parents: 67
diff changeset
834 case 0x4e:
kono
parents: 67
diff changeset
835 case 0x5e:
kono
parents: 67
diff changeset
836 /* Skylake. */
kono
parents: 67
diff changeset
837 case 0x8e:
kono
parents: 67
diff changeset
838 case 0x9e:
kono
parents: 67
diff changeset
839 /* Kaby Lake. */
kono
parents: 67
diff changeset
840 cpu = "skylake";
kono
parents: 67
diff changeset
841 break;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
842 case 0x55:
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
843 if (has_avx512vnni)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
844 /* Cascade Lake. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
845 cpu = "cascadelake";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
846 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
847 /* Skylake with AVX-512. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
848 cpu = "skylake-avx512";
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
849 break;
111
kono
parents: 67
diff changeset
850 case 0x57:
kono
parents: 67
diff changeset
851 /* Knights Landing. */
kono
parents: 67
diff changeset
852 cpu = "knl";
kono
parents: 67
diff changeset
853 break;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
854 case 0x66:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
855 /* Cannon Lake. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
856 cpu = "cannonlake";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
857 break;
111
kono
parents: 67
diff changeset
858 case 0x85:
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
859 /* Knights Mill. */
111
kono
parents: 67
diff changeset
860 cpu = "knm";
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
861 break;
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
862 default:
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
863 if (arch)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
864 {
111
kono
parents: 67
diff changeset
865 /* This is unknown family 0x6 CPU. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
866 if (has_avx)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
867 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
868 /* Assume Tiger Lake */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
869 if (has_avx512vp2intersect)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
870 cpu = "tigerlake";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
871 /* Assume Cooper Lake */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
872 else if (has_avx512bf16)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
873 cpu = "cooperlake";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
874 /* Assume Ice Lake Server. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
875 else if (has_wbnoinvd)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
876 cpu = "icelake-server";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
877 /* Assume Ice Lake. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
878 else if (has_avx512bitalg)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
879 cpu = "icelake-client";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
880 /* Assume Cannon Lake. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
881 else if (has_avx512vbmi)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
882 cpu = "cannonlake";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
883 /* Assume Knights Mill. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
884 else if (has_avx5124vnniw)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
885 cpu = "knm";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
886 /* Assume Knights Landing. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
887 else if (has_avx512er)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
888 cpu = "knl";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
889 /* Assume Skylake with AVX-512. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
890 else if (has_avx512f)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
891 cpu = "skylake-avx512";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
892 /* Assume Skylake. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
893 else if (has_clflushopt)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
894 cpu = "skylake";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
895 /* Assume Broadwell. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
896 else if (has_adx)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
897 cpu = "broadwell";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
898 else if (has_avx2)
111
kono
parents: 67
diff changeset
899 /* Assume Haswell. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
900 cpu = "haswell";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
901 else
111
kono
parents: 67
diff changeset
902 /* Assume Sandy Bridge. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
903 cpu = "sandybridge";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
904 }
111
kono
parents: 67
diff changeset
905 else if (has_sse4_2)
kono
parents: 67
diff changeset
906 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
907 if (has_gfni)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
908 /* Assume Tremont. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
909 cpu = "tremont";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
910 else if (has_sgx)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
911 /* Assume Goldmont Plus. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
912 cpu = "goldmont-plus";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
913 else if (has_xsave)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
914 /* Assume Goldmont. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
915 cpu = "goldmont";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
916 else if (has_movbe)
111
kono
parents: 67
diff changeset
917 /* Assume Silvermont. */
kono
parents: 67
diff changeset
918 cpu = "silvermont";
kono
parents: 67
diff changeset
919 else
kono
parents: 67
diff changeset
920 /* Assume Nehalem. */
kono
parents: 67
diff changeset
921 cpu = "nehalem";
kono
parents: 67
diff changeset
922 }
kono
parents: 67
diff changeset
923 else if (has_ssse3)
kono
parents: 67
diff changeset
924 {
kono
parents: 67
diff changeset
925 if (has_movbe)
kono
parents: 67
diff changeset
926 /* Assume Bonnell. */
kono
parents: 67
diff changeset
927 cpu = "bonnell";
kono
parents: 67
diff changeset
928 else
kono
parents: 67
diff changeset
929 /* Assume Core 2. */
kono
parents: 67
diff changeset
930 cpu = "core2";
kono
parents: 67
diff changeset
931 }
kono
parents: 67
diff changeset
932 else if (has_longmode)
kono
parents: 67
diff changeset
933 /* Perhaps some emulator? Assume x86-64, otherwise gcc
kono
parents: 67
diff changeset
934 -march=native would be unusable for 64-bit compilations,
kono
parents: 67
diff changeset
935 as all the CPUs below are 32-bit only. */
kono
parents: 67
diff changeset
936 cpu = "x86-64";
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
937 else if (has_sse3)
111
kono
parents: 67
diff changeset
938 {
kono
parents: 67
diff changeset
939 if (vendor == signature_CENTAUR_ebx)
kono
parents: 67
diff changeset
940 /* C7 / Eden "Esther" */
kono
parents: 67
diff changeset
941 cpu = "c7";
kono
parents: 67
diff changeset
942 else
kono
parents: 67
diff changeset
943 /* It is Core Duo. */
kono
parents: 67
diff changeset
944 cpu = "pentium-m";
kono
parents: 67
diff changeset
945 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
946 else if (has_sse2)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
947 /* It is Pentium M. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
948 cpu = "pentium-m";
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
949 else if (has_sse)
111
kono
parents: 67
diff changeset
950 {
kono
parents: 67
diff changeset
951 if (vendor == signature_CENTAUR_ebx)
kono
parents: 67
diff changeset
952 {
kono
parents: 67
diff changeset
953 if (model >= 9)
kono
parents: 67
diff changeset
954 /* Eden "Nehemiah" */
kono
parents: 67
diff changeset
955 cpu = "nehemiah";
kono
parents: 67
diff changeset
956 else
kono
parents: 67
diff changeset
957 cpu = "c3-2";
kono
parents: 67
diff changeset
958 }
kono
parents: 67
diff changeset
959 else
kono
parents: 67
diff changeset
960 /* It is Pentium III. */
kono
parents: 67
diff changeset
961 cpu = "pentium3";
kono
parents: 67
diff changeset
962 }
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
963 else if (has_mmx)
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
964 /* It is Pentium II. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
965 cpu = "pentium2";
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
966 else
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
967 /* Default to Pentium Pro. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
968 cpu = "pentiumpro";
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
969 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
970 else
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
971 /* For -mtune, we default to -mtune=generic. */
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
972 cpu = "generic";
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
973 break;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
974 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
975 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
976 case PROCESSOR_PENTIUM4:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
977 if (has_sse3)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
978 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
979 if (has_longmode)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
980 cpu = "nocona";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
981 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
982 cpu = "prescott";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
983 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
984 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
985 cpu = "pentium4";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
986 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
987 case PROCESSOR_GEODE:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
988 cpu = "geode";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
989 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
990 case PROCESSOR_K6:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
991 if (arch && has_3dnow)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
992 cpu = "k6-3";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
993 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
994 cpu = "k6";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
995 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
996 case PROCESSOR_ATHLON:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
997 if (arch && has_sse)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
998 cpu = "athlon-4";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
999 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1000 cpu = "athlon";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1001 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1002 case PROCESSOR_K8:
111
kono
parents: 67
diff changeset
1003 if (arch)
kono
parents: 67
diff changeset
1004 {
kono
parents: 67
diff changeset
1005 if (vendor == signature_CENTAUR_ebx)
kono
parents: 67
diff changeset
1006 {
kono
parents: 67
diff changeset
1007 if (has_sse4_1)
kono
parents: 67
diff changeset
1008 /* Nano 3000 | Nano dual / quad core | Eden X4 */
kono
parents: 67
diff changeset
1009 cpu = "nano-3000";
kono
parents: 67
diff changeset
1010 else if (has_ssse3)
kono
parents: 67
diff changeset
1011 /* Nano 1000 | Nano 2000 */
kono
parents: 67
diff changeset
1012 cpu = "nano";
kono
parents: 67
diff changeset
1013 else if (has_sse3)
kono
parents: 67
diff changeset
1014 /* Eden X2 */
kono
parents: 67
diff changeset
1015 cpu = "eden-x2";
kono
parents: 67
diff changeset
1016 else
kono
parents: 67
diff changeset
1017 /* Default to k8 */
kono
parents: 67
diff changeset
1018 cpu = "k8";
kono
parents: 67
diff changeset
1019 }
kono
parents: 67
diff changeset
1020 else if (has_sse3)
kono
parents: 67
diff changeset
1021 cpu = "k8-sse3";
kono
parents: 67
diff changeset
1022 else
kono
parents: 67
diff changeset
1023 cpu = "k8";
kono
parents: 67
diff changeset
1024 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1025 else
111
kono
parents: 67
diff changeset
1026 /* For -mtune, we default to -mtune=k8 */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1027 cpu = "k8";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1028 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1029 case PROCESSOR_AMDFAM10:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1030 cpu = "amdfam10";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1031 break;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1032 case PROCESSOR_BDVER1:
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1033 cpu = "bdver1";
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
1034 break;
111
kono
parents: 67
diff changeset
1035 case PROCESSOR_BDVER2:
kono
parents: 67
diff changeset
1036 cpu = "bdver2";
kono
parents: 67
diff changeset
1037 break;
kono
parents: 67
diff changeset
1038 case PROCESSOR_BDVER3:
kono
parents: 67
diff changeset
1039 cpu = "bdver3";
kono
parents: 67
diff changeset
1040 break;
kono
parents: 67
diff changeset
1041 case PROCESSOR_BDVER4:
kono
parents: 67
diff changeset
1042 cpu = "bdver4";
kono
parents: 67
diff changeset
1043 break;
kono
parents: 67
diff changeset
1044 case PROCESSOR_ZNVER1:
kono
parents: 67
diff changeset
1045 cpu = "znver1";
kono
parents: 67
diff changeset
1046 break;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1047 case PROCESSOR_ZNVER2:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1048 cpu = "znver2";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1049 break;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1050 case PROCESSOR_BTVER1:
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1051 cpu = "btver1";
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
1052 break;
111
kono
parents: 67
diff changeset
1053 case PROCESSOR_BTVER2:
kono
parents: 67
diff changeset
1054 cpu = "btver2";
kono
parents: 67
diff changeset
1055 break;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1056
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1057 default:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1058 /* Use something reasonable. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1059 if (arch)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1060 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1061 if (has_ssse3)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1062 cpu = "core2";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1063 else if (has_sse3)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1064 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1065 if (has_longmode)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1066 cpu = "nocona";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1067 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1068 cpu = "prescott";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1069 }
111
kono
parents: 67
diff changeset
1070 else if (has_longmode)
kono
parents: 67
diff changeset
1071 /* Perhaps some emulator? Assume x86-64, otherwise gcc
kono
parents: 67
diff changeset
1072 -march=native would be unusable for 64-bit compilations,
kono
parents: 67
diff changeset
1073 as all the CPUs below are 32-bit only. */
kono
parents: 67
diff changeset
1074 cpu = "x86-64";
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1075 else if (has_sse2)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1076 cpu = "pentium4";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1077 else if (has_cmov)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1078 cpu = "pentiumpro";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1079 else if (has_mmx)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1080 cpu = "pentium-mmx";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1081 else if (has_cmpxchg8b)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1082 cpu = "pentium";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1083 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1084 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1085 cpu = "generic";
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1086 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1087
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1088 if (arch)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1089 {
111
kono
parents: 67
diff changeset
1090 const char *mmx = has_mmx ? " -mmmx" : " -mno-mmx";
kono
parents: 67
diff changeset
1091 const char *mmx3dnow = has_3dnow ? " -m3dnow" : " -mno-3dnow";
kono
parents: 67
diff changeset
1092 const char *sse = has_sse ? " -msse" : " -mno-sse";
kono
parents: 67
diff changeset
1093 const char *sse2 = has_sse2 ? " -msse2" : " -mno-sse2";
kono
parents: 67
diff changeset
1094 const char *sse3 = has_sse3 ? " -msse3" : " -mno-sse3";
kono
parents: 67
diff changeset
1095 const char *ssse3 = has_ssse3 ? " -mssse3" : " -mno-ssse3";
kono
parents: 67
diff changeset
1096 const char *sse4a = has_sse4a ? " -msse4a" : " -mno-sse4a";
kono
parents: 67
diff changeset
1097 const char *cx16 = has_cmpxchg16b ? " -mcx16" : " -mno-cx16";
kono
parents: 67
diff changeset
1098 const char *sahf = has_lahf_lm ? " -msahf" : " -mno-sahf";
kono
parents: 67
diff changeset
1099 const char *movbe = has_movbe ? " -mmovbe" : " -mno-movbe";
kono
parents: 67
diff changeset
1100 const char *aes = has_aes ? " -maes" : " -mno-aes";
kono
parents: 67
diff changeset
1101 const char *sha = has_sha ? " -msha" : " -mno-sha";
kono
parents: 67
diff changeset
1102 const char *pclmul = has_pclmul ? " -mpclmul" : " -mno-pclmul";
kono
parents: 67
diff changeset
1103 const char *popcnt = has_popcnt ? " -mpopcnt" : " -mno-popcnt";
kono
parents: 67
diff changeset
1104 const char *abm = has_abm ? " -mabm" : " -mno-abm";
kono
parents: 67
diff changeset
1105 const char *lwp = has_lwp ? " -mlwp" : " -mno-lwp";
kono
parents: 67
diff changeset
1106 const char *fma = has_fma ? " -mfma" : " -mno-fma";
kono
parents: 67
diff changeset
1107 const char *fma4 = has_fma4 ? " -mfma4" : " -mno-fma4";
kono
parents: 67
diff changeset
1108 const char *xop = has_xop ? " -mxop" : " -mno-xop";
kono
parents: 67
diff changeset
1109 const char *bmi = has_bmi ? " -mbmi" : " -mno-bmi";
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1110 const char *pconfig = has_pconfig ? " -mpconfig" : " -mno-pconfig";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1111 const char *wbnoinvd = has_wbnoinvd ? " -mwbnoinvd" : " -mno-wbnoinvd";
111
kono
parents: 67
diff changeset
1112 const char *sgx = has_sgx ? " -msgx" : " -mno-sgx";
kono
parents: 67
diff changeset
1113 const char *bmi2 = has_bmi2 ? " -mbmi2" : " -mno-bmi2";
kono
parents: 67
diff changeset
1114 const char *tbm = has_tbm ? " -mtbm" : " -mno-tbm";
kono
parents: 67
diff changeset
1115 const char *avx = has_avx ? " -mavx" : " -mno-avx";
kono
parents: 67
diff changeset
1116 const char *avx2 = has_avx2 ? " -mavx2" : " -mno-avx2";
kono
parents: 67
diff changeset
1117 const char *sse4_2 = has_sse4_2 ? " -msse4.2" : " -mno-sse4.2";
kono
parents: 67
diff changeset
1118 const char *sse4_1 = has_sse4_1 ? " -msse4.1" : " -mno-sse4.1";
kono
parents: 67
diff changeset
1119 const char *lzcnt = has_lzcnt ? " -mlzcnt" : " -mno-lzcnt";
kono
parents: 67
diff changeset
1120 const char *hle = has_hle ? " -mhle" : " -mno-hle";
kono
parents: 67
diff changeset
1121 const char *rtm = has_rtm ? " -mrtm" : " -mno-rtm";
kono
parents: 67
diff changeset
1122 const char *rdrnd = has_rdrnd ? " -mrdrnd" : " -mno-rdrnd";
kono
parents: 67
diff changeset
1123 const char *f16c = has_f16c ? " -mf16c" : " -mno-f16c";
kono
parents: 67
diff changeset
1124 const char *fsgsbase = has_fsgsbase ? " -mfsgsbase" : " -mno-fsgsbase";
kono
parents: 67
diff changeset
1125 const char *rdseed = has_rdseed ? " -mrdseed" : " -mno-rdseed";
kono
parents: 67
diff changeset
1126 const char *prfchw = has_prfchw ? " -mprfchw" : " -mno-prfchw";
kono
parents: 67
diff changeset
1127 const char *adx = has_adx ? " -madx" : " -mno-adx";
kono
parents: 67
diff changeset
1128 const char *fxsr = has_fxsr ? " -mfxsr" : " -mno-fxsr";
kono
parents: 67
diff changeset
1129 const char *xsave = has_xsave ? " -mxsave" : " -mno-xsave";
kono
parents: 67
diff changeset
1130 const char *xsaveopt = has_xsaveopt ? " -mxsaveopt" : " -mno-xsaveopt";
kono
parents: 67
diff changeset
1131 const char *avx512f = has_avx512f ? " -mavx512f" : " -mno-avx512f";
kono
parents: 67
diff changeset
1132 const char *avx512er = has_avx512er ? " -mavx512er" : " -mno-avx512er";
kono
parents: 67
diff changeset
1133 const char *avx512cd = has_avx512cd ? " -mavx512cd" : " -mno-avx512cd";
kono
parents: 67
diff changeset
1134 const char *avx512pf = has_avx512pf ? " -mavx512pf" : " -mno-avx512pf";
kono
parents: 67
diff changeset
1135 const char *prefetchwt1 = has_prefetchwt1 ? " -mprefetchwt1" : " -mno-prefetchwt1";
kono
parents: 67
diff changeset
1136 const char *clflushopt = has_clflushopt ? " -mclflushopt" : " -mno-clflushopt";
kono
parents: 67
diff changeset
1137 const char *xsavec = has_xsavec ? " -mxsavec" : " -mno-xsavec";
kono
parents: 67
diff changeset
1138 const char *xsaves = has_xsaves ? " -mxsaves" : " -mno-xsaves";
kono
parents: 67
diff changeset
1139 const char *avx512dq = has_avx512dq ? " -mavx512dq" : " -mno-avx512dq";
kono
parents: 67
diff changeset
1140 const char *avx512bw = has_avx512bw ? " -mavx512bw" : " -mno-avx512bw";
kono
parents: 67
diff changeset
1141 const char *avx512vl = has_avx512vl ? " -mavx512vl" : " -mno-avx512vl";
kono
parents: 67
diff changeset
1142 const char *avx512ifma = has_avx512ifma ? " -mavx512ifma" : " -mno-avx512ifma";
kono
parents: 67
diff changeset
1143 const char *avx512vbmi = has_avx512vbmi ? " -mavx512vbmi" : " -mno-avx512vbmi";
kono
parents: 67
diff changeset
1144 const char *avx5124vnniw = has_avx5124vnniw ? " -mavx5124vnniw" : " -mno-avx5124vnniw";
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1145 const char *avx512vbmi2 = has_avx512vbmi2 ? " -mavx512vbmi2" : " -mno-avx512vbmi2";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1146 const char *avx512vnni = has_avx512vnni ? " -mavx512vnni" : " -mno-avx512vnni";
111
kono
parents: 67
diff changeset
1147 const char *avx5124fmaps = has_avx5124fmaps ? " -mavx5124fmaps" : " -mno-avx5124fmaps";
kono
parents: 67
diff changeset
1148 const char *clwb = has_clwb ? " -mclwb" : " -mno-clwb";
kono
parents: 67
diff changeset
1149 const char *mwaitx = has_mwaitx ? " -mmwaitx" : " -mno-mwaitx";
kono
parents: 67
diff changeset
1150 const char *clzero = has_clzero ? " -mclzero" : " -mno-clzero";
kono
parents: 67
diff changeset
1151 const char *pku = has_pku ? " -mpku" : " -mno-pku";
kono
parents: 67
diff changeset
1152 const char *rdpid = has_rdpid ? " -mrdpid" : " -mno-rdpid";
kono
parents: 67
diff changeset
1153 const char *gfni = has_gfni ? " -mgfni" : " -mno-gfni";
kono
parents: 67
diff changeset
1154 const char *shstk = has_shstk ? " -mshstk" : " -mno-shstk";
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1155 const char *vaes = has_vaes ? " -mvaes" : " -mno-vaes";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1156 const char *vpclmulqdq = has_vpclmulqdq ? " -mvpclmulqdq" : " -mno-vpclmulqdq";
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1157 const char *avx512vp2intersect = has_avx512vp2intersect ? " -mavx512vp2intersect" : " -mno-avx512vp2intersect";
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1158 const char *avx512bitalg = has_avx512bitalg ? " -mavx512bitalg" : " -mno-avx512bitalg";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1159 const char *movdiri = has_movdiri ? " -mmovdiri" : " -mno-movdiri";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1160 const char *movdir64b = has_movdir64b ? " -mmovdir64b" : " -mno-movdir64b";
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1161 const char *enqcmd = has_enqcmd ? " -menqcmd" : " -mno-enqcmd";
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1162 const char *waitpkg = has_waitpkg ? " -mwaitpkg" : " -mno-waitpkg";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1163 const char *cldemote = has_cldemote ? " -mcldemote" : " -mno-cldemote";
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1164 const char *ptwrite = has_ptwrite ? " -mptwrite" : " -mno-ptwrite";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1165 const char *avx512bf16 = has_avx512bf16 ? " -mavx512bf16" : " -mno-avx512bf16";
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1166
111
kono
parents: 67
diff changeset
1167 options = concat (options, mmx, mmx3dnow, sse, sse2, sse3, ssse3,
kono
parents: 67
diff changeset
1168 sse4a, cx16, sahf, movbe, aes, sha, pclmul,
kono
parents: 67
diff changeset
1169 popcnt, abm, lwp, fma, fma4, xop, bmi, sgx, bmi2,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1170 pconfig, wbnoinvd,
111
kono
parents: 67
diff changeset
1171 tbm, avx, avx2, sse4_2, sse4_1, lzcnt, rtm,
kono
parents: 67
diff changeset
1172 hle, rdrnd, f16c, fsgsbase, rdseed, prfchw, adx,
kono
parents: 67
diff changeset
1173 fxsr, xsave, xsaveopt, avx512f, avx512er,
kono
parents: 67
diff changeset
1174 avx512cd, avx512pf, prefetchwt1, clflushopt,
kono
parents: 67
diff changeset
1175 xsavec, xsaves, avx512dq, avx512bw, avx512vl,
kono
parents: 67
diff changeset
1176 avx512ifma, avx512vbmi, avx5124fmaps, avx5124vnniw,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1177 clwb, mwaitx, clzero, pku, rdpid, gfni, shstk,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1178 avx512vbmi2, avx512vnni, vaes, vpclmulqdq,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1179 avx512bitalg, movdiri, movdir64b, waitpkg, cldemote,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1180 ptwrite, avx512bf16, enqcmd, avx512vp2intersect,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1181 NULL);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1182 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1183
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1184 done:
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
1185 return concat (cache, "-m", argv[0], "=", cpu, options, NULL);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1186 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1187 #else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1188
111
kono
parents: 67
diff changeset
1189 /* If we are compiling with GCC where %EBX register is fixed, then the
kono
parents: 67
diff changeset
1190 driver will just ignore -march and -mtune "native" target and will leave
kono
parents: 67
diff changeset
1191 to the newly built compiler to generate code for its default target. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1192
111
kono
parents: 67
diff changeset
1193 const char *host_detect_local_cpu (int, const char **)
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
1194 {
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
1195 return NULL;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1196 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1197 #endif /* __GNUC__ */