1// Copyright 2020 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package android
16
17import "fmt"
18
19var archVariants = map[ArchType][]string{
20	Arm: {
21		"armv7-a",
22		"armv7-a-neon",
23		"armv8-a",
24		"armv8-2a",
25		"cortex-a7",
26		"cortex-a8",
27		"cortex-a9",
28		"cortex-a15",
29		"cortex-a53",
30		"cortex-a53-a57",
31		"cortex-a55",
32		"cortex-a72",
33		"cortex-a73",
34		"cortex-a75",
35		"cortex-a76",
36		"krait",
37		"kryo",
38		"kryo385",
39		"exynos-m1",
40		"exynos-m2",
41	},
42	Arm64: {
43		"armv8_a",
44		"armv8_a_branchprot",
45		"armv8_2a",
46		"armv8-2a-dotprod",
47		"cortex-a53",
48		"cortex-a55",
49		"cortex-a72",
50		"cortex-a73",
51		"cortex-a75",
52		"cortex-a76",
53		"kryo",
54		"kryo385",
55		"exynos-m1",
56		"exynos-m2",
57	},
58	X86: {
59		"amberlake",
60		"atom",
61		"broadwell",
62		"haswell",
63		"icelake",
64		"ivybridge",
65		"kabylake",
66		"sandybridge",
67		"silvermont",
68		"skylake",
69		"stoneyridge",
70		"tigerlake",
71		"whiskeylake",
72		"x86_64",
73	},
74	X86_64: {
75		"amberlake",
76		"broadwell",
77		"haswell",
78		"icelake",
79		"ivybridge",
80		"kabylake",
81		"sandybridge",
82		"silvermont",
83		"skylake",
84		"stoneyridge",
85		"tigerlake",
86		"whiskeylake",
87	},
88}
89
90var archFeatures = map[ArchType][]string{
91	Arm: {
92		"neon",
93	},
94	Arm64: {
95		"dotprod",
96	},
97	X86: {
98		"ssse3",
99		"sse4",
100		"sse4_1",
101		"sse4_2",
102		"aes_ni",
103		"avx",
104		"avx2",
105		"avx512",
106		"popcnt",
107		"movbe",
108	},
109	X86_64: {
110		"ssse3",
111		"sse4",
112		"sse4_1",
113		"sse4_2",
114		"aes_ni",
115		"avx",
116		"avx2",
117		"avx512",
118		"popcnt",
119	},
120}
121
122var archFeatureMap = map[ArchType]map[string][]string{
123	Arm: {
124		"armv7-a-neon": {
125			"neon",
126		},
127		"armv8-a": {
128			"neon",
129		},
130		"armv8-2a": {
131			"neon",
132		},
133	},
134	Arm64: {
135		"armv8-2a-dotprod": {
136			"dotprod",
137		},
138	},
139	X86: {
140		"amberlake": {
141			"ssse3",
142			"sse4",
143			"sse4_1",
144			"sse4_2",
145			"avx",
146			"avx2",
147			"aes_ni",
148			"popcnt",
149		},
150		"atom": {
151			"ssse3",
152			"movbe",
153		},
154		"broadwell": {
155			"ssse3",
156			"sse4",
157			"sse4_1",
158			"sse4_2",
159			"avx",
160			"avx2",
161			"aes_ni",
162			"popcnt",
163		},
164		"haswell": {
165			"ssse3",
166			"sse4",
167			"sse4_1",
168			"sse4_2",
169			"aes_ni",
170			"avx",
171			"popcnt",
172			"movbe",
173		},
174		"icelake": {
175			"ssse3",
176			"sse4",
177			"sse4_1",
178			"sse4_2",
179			"avx",
180			"avx2",
181			"avx512",
182			"aes_ni",
183			"popcnt",
184		},
185		"ivybridge": {
186			"ssse3",
187			"sse4",
188			"sse4_1",
189			"sse4_2",
190			"aes_ni",
191			"avx",
192			"popcnt",
193		},
194		"kabylake": {
195			"ssse3",
196			"sse4",
197			"sse4_1",
198			"sse4_2",
199			"avx",
200			"avx2",
201			"aes_ni",
202			"popcnt",
203		},
204		"sandybridge": {
205			"ssse3",
206			"sse4",
207			"sse4_1",
208			"sse4_2",
209			"popcnt",
210		},
211		"silvermont": {
212			"ssse3",
213			"sse4",
214			"sse4_1",
215			"sse4_2",
216			"aes_ni",
217			"popcnt",
218			"movbe",
219		},
220		"skylake": {
221			"ssse3",
222			"sse4",
223			"sse4_1",
224			"sse4_2",
225			"avx",
226			"avx2",
227			"avx512",
228			"aes_ni",
229			"popcnt",
230		},
231		"stoneyridge": {
232			"ssse3",
233			"sse4",
234			"sse4_1",
235			"sse4_2",
236			"aes_ni",
237			"avx",
238			"avx2",
239			"popcnt",
240			"movbe",
241		},
242		"tigerlake": {
243			"ssse3",
244			"sse4",
245			"sse4_1",
246			"sse4_2",
247			"avx",
248			"avx2",
249			"avx512",
250			"aes_ni",
251			"popcnt",
252		},
253		"whiskeylake": {
254			"ssse3",
255			"sse4",
256			"sse4_1",
257			"sse4_2",
258			"avx",
259			"avx2",
260			"avx512",
261			"aes_ni",
262			"popcnt",
263		},
264		"x86_64": {
265			"ssse3",
266			"sse4",
267			"sse4_1",
268			"sse4_2",
269			"popcnt",
270		},
271	},
272	X86_64: {
273		"amberlake": {
274			"ssse3",
275			"sse4",
276			"sse4_1",
277			"sse4_2",
278			"avx",
279			"avx2",
280			"aes_ni",
281			"popcnt",
282		},
283		"broadwell": {
284			"ssse3",
285			"sse4",
286			"sse4_1",
287			"sse4_2",
288			"avx",
289			"avx2",
290			"aes_ni",
291			"popcnt",
292		},
293		"haswell": {
294			"ssse3",
295			"sse4",
296			"sse4_1",
297			"sse4_2",
298			"aes_ni",
299			"avx",
300			"popcnt",
301		},
302		"icelake": {
303			"ssse3",
304			"sse4",
305			"sse4_1",
306			"sse4_2",
307			"avx",
308			"avx2",
309			"avx512",
310			"aes_ni",
311			"popcnt",
312		},
313		"ivybridge": {
314			"ssse3",
315			"sse4",
316			"sse4_1",
317			"sse4_2",
318			"aes_ni",
319			"avx",
320			"popcnt",
321		},
322		"kabylake": {
323			"ssse3",
324			"sse4",
325			"sse4_1",
326			"sse4_2",
327			"avx",
328			"avx2",
329			"aes_ni",
330			"popcnt",
331		},
332		"sandybridge": {
333			"ssse3",
334			"sse4",
335			"sse4_1",
336			"sse4_2",
337			"popcnt",
338		},
339		"silvermont": {
340			"ssse3",
341			"sse4",
342			"sse4_1",
343			"sse4_2",
344			"aes_ni",
345			"popcnt",
346		},
347		"skylake": {
348			"ssse3",
349			"sse4",
350			"sse4_1",
351			"sse4_2",
352			"avx",
353			"avx2",
354			"avx512",
355			"aes_ni",
356			"popcnt",
357		},
358		"stoneyridge": {
359			"ssse3",
360			"sse4",
361			"sse4_1",
362			"sse4_2",
363			"aes_ni",
364			"avx",
365			"avx2",
366			"popcnt",
367		},
368		"tigerlake": {
369			"ssse3",
370			"sse4",
371			"sse4_1",
372			"sse4_2",
373			"avx",
374			"avx2",
375			"avx512",
376			"aes_ni",
377			"popcnt",
378		},
379		"whiskeylake": {
380			"ssse3",
381			"sse4",
382			"sse4_1",
383			"sse4_2",
384			"avx",
385			"avx2",
386			"avx512",
387			"aes_ni",
388			"popcnt",
389		},
390	},
391}
392
393var defaultArchFeatureMap = map[OsType]map[ArchType][]string{}
394
395// RegisterDefaultArchVariantFeatures is called by files that define Toolchains to specify the
396// arch features that are available for the default arch variant.  It must be called from an
397// init() function.
398func RegisterDefaultArchVariantFeatures(os OsType, arch ArchType, features ...string) {
399	checkCalledFromInit()
400
401	for _, feature := range features {
402		if !InList(feature, archFeatures[arch]) {
403			panic(fmt.Errorf("Invalid feature %q for arch %q variant \"\"", feature, arch))
404		}
405	}
406
407	if defaultArchFeatureMap[os] == nil {
408		defaultArchFeatureMap[os] = make(map[ArchType][]string)
409	}
410	defaultArchFeatureMap[os][arch] = features
411}
412