| // Copyright 2020 Google Inc. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package android |
| |
| import "fmt" |
| |
| var archVariants = map[ArchType][]string{ |
| Arm: { |
| "armv7-a", |
| "armv7-a-neon", |
| "armv8-a", |
| "armv8-2a", |
| "cortex-a7", |
| "cortex-a8", |
| "cortex-a9", |
| "cortex-a15", |
| "cortex-a53", |
| "cortex-a53-a57", |
| "cortex-a55", |
| "cortex-a72", |
| "cortex-a73", |
| "cortex-a75", |
| "cortex-a76", |
| "krait", |
| "kryo", |
| "kryo385", |
| "exynos-m1", |
| "exynos-m2", |
| }, |
| Arm64: { |
| "armv8_a", |
| "armv8_a_branchprot", |
| "armv8_2a", |
| "armv8-2a-dotprod", |
| "cortex-a53", |
| "cortex-a55", |
| "cortex-a72", |
| "cortex-a73", |
| "cortex-a75", |
| "cortex-a76", |
| "kryo", |
| "kryo385", |
| "exynos-m1", |
| "exynos-m2", |
| }, |
| X86: { |
| "amberlake", |
| "atom", |
| "broadwell", |
| "haswell", |
| "icelake", |
| "ivybridge", |
| "kabylake", |
| "sandybridge", |
| "silvermont", |
| "skylake", |
| "stoneyridge", |
| "tigerlake", |
| "whiskeylake", |
| "x86_64", |
| }, |
| X86_64: { |
| "amberlake", |
| "broadwell", |
| "haswell", |
| "icelake", |
| "ivybridge", |
| "kabylake", |
| "sandybridge", |
| "silvermont", |
| "skylake", |
| "stoneyridge", |
| "tigerlake", |
| "whiskeylake", |
| }, |
| } |
| |
| var archFeatures = map[ArchType][]string{ |
| Arm: { |
| "neon", |
| }, |
| Arm64: { |
| "dotprod", |
| }, |
| X86: { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "aes_ni", |
| "avx", |
| "avx2", |
| "avx512", |
| "popcnt", |
| "movbe", |
| }, |
| X86_64: { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "aes_ni", |
| "avx", |
| "avx2", |
| "avx512", |
| "popcnt", |
| }, |
| } |
| |
| var archFeatureMap = map[ArchType]map[string][]string{ |
| Arm: { |
| "armv7-a-neon": { |
| "neon", |
| }, |
| "armv8-a": { |
| "neon", |
| }, |
| "armv8-2a": { |
| "neon", |
| }, |
| }, |
| Arm64: { |
| "armv8-2a-dotprod": { |
| "dotprod", |
| }, |
| }, |
| X86: { |
| "amberlake": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "avx", |
| "avx2", |
| "aes_ni", |
| "popcnt", |
| }, |
| "atom": { |
| "ssse3", |
| "movbe", |
| }, |
| "broadwell": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "avx", |
| "avx2", |
| "aes_ni", |
| "popcnt", |
| }, |
| "haswell": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "aes_ni", |
| "avx", |
| "popcnt", |
| "movbe", |
| }, |
| "icelake": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "avx", |
| "avx2", |
| "avx512", |
| "aes_ni", |
| "popcnt", |
| }, |
| "ivybridge": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "aes_ni", |
| "avx", |
| "popcnt", |
| }, |
| "kabylake": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "avx", |
| "avx2", |
| "aes_ni", |
| "popcnt", |
| }, |
| "sandybridge": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "popcnt", |
| }, |
| "silvermont": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "aes_ni", |
| "popcnt", |
| "movbe", |
| }, |
| "skylake": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "avx", |
| "avx2", |
| "avx512", |
| "aes_ni", |
| "popcnt", |
| }, |
| "stoneyridge": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "aes_ni", |
| "avx", |
| "avx2", |
| "popcnt", |
| "movbe", |
| }, |
| "tigerlake": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "avx", |
| "avx2", |
| "avx512", |
| "aes_ni", |
| "popcnt", |
| }, |
| "whiskeylake": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "avx", |
| "avx2", |
| "avx512", |
| "aes_ni", |
| "popcnt", |
| }, |
| "x86_64": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "popcnt", |
| }, |
| }, |
| X86_64: { |
| "amberlake": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "avx", |
| "avx2", |
| "aes_ni", |
| "popcnt", |
| }, |
| "broadwell": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "avx", |
| "avx2", |
| "aes_ni", |
| "popcnt", |
| }, |
| "haswell": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "aes_ni", |
| "avx", |
| "popcnt", |
| }, |
| "icelake": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "avx", |
| "avx2", |
| "avx512", |
| "aes_ni", |
| "popcnt", |
| }, |
| "ivybridge": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "aes_ni", |
| "avx", |
| "popcnt", |
| }, |
| "kabylake": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "avx", |
| "avx2", |
| "aes_ni", |
| "popcnt", |
| }, |
| "sandybridge": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "popcnt", |
| }, |
| "silvermont": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "aes_ni", |
| "popcnt", |
| }, |
| "skylake": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "avx", |
| "avx2", |
| "avx512", |
| "aes_ni", |
| "popcnt", |
| }, |
| "stoneyridge": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "aes_ni", |
| "avx", |
| "avx2", |
| "popcnt", |
| }, |
| "tigerlake": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "avx", |
| "avx2", |
| "avx512", |
| "aes_ni", |
| "popcnt", |
| }, |
| "whiskeylake": { |
| "ssse3", |
| "sse4", |
| "sse4_1", |
| "sse4_2", |
| "avx", |
| "avx2", |
| "avx512", |
| "aes_ni", |
| "popcnt", |
| }, |
| }, |
| } |
| |
| var defaultArchFeatureMap = map[OsType]map[ArchType][]string{} |
| |
| // RegisterDefaultArchVariantFeatures is called by files that define Toolchains to specify the |
| // arch features that are available for the default arch variant. It must be called from an |
| // init() function. |
| func RegisterDefaultArchVariantFeatures(os OsType, arch ArchType, features ...string) { |
| checkCalledFromInit() |
| |
| for _, feature := range features { |
| if !InList(feature, archFeatures[arch]) { |
| panic(fmt.Errorf("Invalid feature %q for arch %q variant \"\"", feature, arch)) |
| } |
| } |
| |
| if defaultArchFeatureMap[os] == nil { |
| defaultArchFeatureMap[os] = make(map[ArchType][]string) |
| } |
| defaultArchFeatureMap[os][arch] = features |
| } |