summaryrefslogtreecommitdiffstats
path: root/lib/systems
diff options
context:
space:
mode:
authorvolth <volth@volth.com>2020-08-05 02:32:41 +0000
committervolth <volth@volth.com>2020-08-05 11:18:26 +0000
commitcf7b63df5b9efdef4e8e1b3261d7040199f7e671 (patch)
tree74dbf7a1731896d48e90671f2b3dfb4dff91ec40 /lib/systems
parent463db72e631e0bd4a835796324eb1981071c6ee4 (diff)
gcc.arch: refactor, move tables under lib/
Diffstat (limited to 'lib/systems')
-rw-r--r--lib/systems/architectures.nix75
-rw-r--r--lib/systems/default.nix2
2 files changed, 77 insertions, 0 deletions
diff --git a/lib/systems/architectures.nix b/lib/systems/architectures.nix
new file mode 100644
index 000000000000..287f5be03c45
--- /dev/null
+++ b/lib/systems/architectures.nix
@@ -0,0 +1,75 @@
+{ 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" ];
+ ivybridge = [ "westmere" "sandybridge" ];
+ haswell = [ "westmere" "sandybridge" "ivybridge" ];
+ broadwell = [ "westmere" "sandybridge" "ivybridge" "haswell" ];
+ skylake = [ "westmere" "sandybridge" "ivybridge" "haswell" "broadwell" ];
+ skylake-avx512 = [ "westmere" "sandybridge" "ivybridge" "haswell" "broadwell" "skylake" ];
+ # x86_64 AMD
+ btver1 = [ ];
+ btver2 = [ ];
+ bdver1 = [ ];
+ bdver2 = [ ];
+ bdver3 = [ ];
+ bdver4 = [ ];
+ znver1 = [ ];
+ znver2 = [ ];
+ # other
+ armv5te = [ ];
+ armv6 = [ ];
+ armv7-a = [ ];
+ armv8-a = [ ];
+ mips32 = [ ];
+ loongson2f = [ ];
+ };
+
+ predicates = {
+ sse3Support = x: builtins.elem "sse3" features.${x};
+ ssse3Support = x: builtins.elem "ssse3" features.${x};
+ sse4_1Support = x: builtins.elem "sse4_1" features.${x};
+ sse4_2Support = x: builtins.elem "sse4_2" features.${x};
+ sse4_aSupport = x: builtins.elem "sse4a" features.${x};
+ avxSupport = x: builtins.elem "avx" features.${x};
+ avx2Support = x: builtins.elem "avx2" features.${x};
+ avx512Support = x: builtins.elem "avx512" features.${x};
+ aesSupport = x: builtins.elem "aes" features.${x};
+ fmaSupport = x: builtins.elem "fma" features.${x};
+ fma4Support = x: builtins.elem "fma4" features.${x};
+ };
+}
diff --git a/lib/systems/default.nix b/lib/systems/default.nix
index c929781dd8ff..02d58592b325 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.
@@ -125,6 +126,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