summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJohn Ericson <git@JohnEricson.me>2020-09-01 22:31:16 -0400
committerGitHub <noreply@github.com>2020-09-01 22:31:16 -0400
commit1965a241fc2476ff63e8b97019a3db58707a8325 (patch)
tree7e5efc37712cd6e72c85ee08a5b2a6965c3b4f6a /lib
parent54eacc77f7e8fd20db467f1363fee937ca8f5fa1 (diff)
parentc5fe132b3c5da5044c01a9bd4aa4ab45795cb9e6 (diff)
Merge pull request #61019 from volth/gcc.arch-amd
platform.gcc.arch: support for AMD CPUs
Diffstat (limited to 'lib')
-rw-r--r--lib/systems/architectures.nix77
-rw-r--r--lib/systems/default.nix2
2 files changed, 79 insertions, 0 deletions
diff --git a/lib/systems/architectures.nix b/lib/systems/architectures.nix
new file mode 100644
index 000000000000..9d1c29fd9f0b
--- /dev/null
+++ b/lib/systems/architectures.nix
@@ -0,0 +1,77 @@
+{ lib }:
+
+rec {
+ # platform.gcc.arch to its features (as in /proc/cpuinfo)
+ features = {
+ default = [ ];
+ # x86_64 Intel
+ westmere = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" ];
+ sandybridge = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" ];
+ ivybridge = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" ];
+ haswell = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "fma" ];
+ broadwell = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "fma" ];
+ skylake = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "fma" ];
+ skylake-avx512 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
+ # x86_64 AMD
+ btver1 = [ "sse3" "ssse3" "sse4_1" "sse4_2" ];
+ btver2 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" ];
+ bdver1 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "fma" "fma4" ];
+ bdver2 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "fma" "fma4" ];
+ bdver3 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "fma" "fma4" ];
+ bdver4 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "avx2" "fma" "fma4" ];
+ znver1 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "avx2" "fma" ];
+ znver2 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "avx2" "fma" ];
+ # other
+ armv5te = [ ];
+ armv6 = [ ];
+ armv7-a = [ ];
+ armv8-a = [ ];
+ mips32 = [ ];
+ loongson2f = [ ];
+ };
+
+ # a superior CPU has all the features of an inferior and is able to build and test code for it
+ inferiors = {
+ # x86_64 Intel
+ default = [ ];
+ westmere = [ ];
+ sandybridge = [ "westmere" ] ++ inferiors.westmere;
+ ivybridge = [ "sandybridge" ] ++ inferiors.sandybridge;
+ haswell = [ "ivybridge" ] ++ inferiors.ivybridge;
+ broadwell = [ "haswell" ] ++ inferiors.haswell;
+ skylake = [ "broadwell" ] ++ inferiors.broadwell;
+ skylake-avx512 = [ "skylake" ] ++ inferiors.skylake;
+ # x86_64 AMD
+ btver1 = [ ];
+ btver2 = [ ]; # TODO: fill this (need testing)
+ bdver1 = [ ]; # TODO: fill this (need testing)
+ bdver2 = [ ]; # TODO: fill this (need testing)
+ bdver3 = [ ]; # TODO: fill this (need testing)
+ bdver4 = [ ]; # TODO: fill this (need testing)
+ znver1 = [ ]; # TODO: fill this (need testing)
+ znver2 = [ ]; # TODO: fill this (need testing)
+ # other
+ armv5te = [ ];
+ armv6 = [ ];
+ armv7-a = [ ];
+ armv8-a = [ ];
+ mips32 = [ ];
+ loongson2f = [ ];
+ };
+
+ predicates = let
+ featureSupport = feature: x: builtins.elem feature features.${x};
+ in {
+ sse3Support = featureSupport "sse3";
+ ssse3Support = featureSupport "ssse3";
+ sse4_1Support = featureSupport "sse4_1";
+ sse4_2Support = featureSupport "sse4_2";
+ sse4_aSupport = featureSupport "sse4a";
+ avxSupport = featureSupport "avx";
+ avx2Support = featureSupport "avx2";
+ avx512Support = featureSupport "avx512";
+ aesSupport = featureSupport "aes";
+ fmaSupport = featureSupport "fma";
+ fma4Support = featureSupport "fma4";
+ };
+}
diff --git a/lib/systems/default.nix b/lib/systems/default.nix
index 09884d406823..9939743157e7 100644
--- a/lib/systems/default.nix
+++ b/lib/systems/default.nix
@@ -7,6 +7,7 @@ rec {
inspect = import ./inspect.nix { inherit lib; };
platforms = import ./platforms.nix { inherit lib; };
examples = import ./examples.nix { inherit lib; };
+ architectures = import ./architectures.nix { inherit lib; };
# Elaborate a `localSystem` or `crossSystem` so that it contains everything
# necessary.
@@ -126,6 +127,7 @@ rec {
else throw "Don't know how to run ${final.config} executables.";
} // mapAttrs (n: v: v final.parsed) inspect.predicates
+ // mapAttrs (n: v: v final.platform.gcc.arch or "default") architectures.predicates
// args;
in assert final.useAndroidPrebuilt -> final.isAndroid;
assert lib.foldl