1{ lib }:
2
3rec {
4 # gcc.arch to its features (as in /proc/cpuinfo)
5 features = {
6 default = [ ];
7 # x86_64 Intel
8 westmere = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" ];
9 sandybridge = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" ];
10 ivybridge = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" ];
11 haswell = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "fma" ];
12 broadwell = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "fma" ];
13 skylake = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "fma" ];
14 skylake-avx512 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
15 cannonlake = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
16 icelake-client = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
17 icelake-server = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
18 cascadelake = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
19 cooperlake = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
20 tigerlake = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
21 # x86_64 AMD
22 btver1 = [ "sse3" "ssse3" "sse4_1" "sse4_2" ];
23 btver2 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" ];
24 bdver1 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "fma" "fma4" ];
25 bdver2 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "fma" "fma4" ];
26 bdver3 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "fma" "fma4" ];
27 bdver4 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "avx2" "fma" "fma4" ];
28 znver1 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "avx2" "fma" ];
29 znver2 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "avx2" "fma" ];
30 znver3 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "avx2" "fma" ];
31 # other
32 armv5te = [ ];
33 armv6 = [ ];
34 armv7-a = [ ];
35 armv8-a = [ ];
36 mips32 = [ ];
37 loongson2f = [ ];
38 };
39
40 # a superior CPU has all the features of an inferior and is able to build and test code for it
41 inferiors = {
42 # x86_64 Intel
43 default = [ ];
44 westmere = [ ];
45 sandybridge = [ "westmere" ] ++ inferiors.westmere;
46 ivybridge = [ "sandybridge" ] ++ inferiors.sandybridge;
47 haswell = [ "ivybridge" ] ++ inferiors.ivybridge;
48 broadwell = [ "haswell" ] ++ inferiors.haswell;
49 skylake = [ "broadwell" ] ++ inferiors.broadwell;
50 skylake-avx512 = [ "skylake" ] ++ inferiors.skylake;
51
52 # x86_64 AMD
53 # TODO: fill this (need testing)
54 btver1 = [ ];
55 btver2 = [ ];
56 bdver1 = [ ];
57 bdver2 = [ ];
58 bdver3 = [ ];
59 bdver4 = [ ];
60 # Regarding `skylake` as inferior of `znver1`, there are reports of
61 # successful usage by Gentoo users and Phoronix benchmarking of different
62 # `-march` targets.
63 #
64 # The GCC documentation on extensions used and wikichip documentation
65 # regarding supperted extensions on znver1 and skylake was used to create
66 # this partial order.
67 #
68 # Note:
69 #
70 # - The succesors of `skylake` (`cannonlake`, `icelake`, etc) use `avx512`
71 # which no current AMD Zen michroarch support.
72 # - `znver1` uses `ABM`, `CLZERO`, `CX16`, `MWAITX`, and `SSE4A` which no
73 # current Intel microarch support.
74 #
75 # https://www.phoronix.com/scan.php?page=article&item=amd-znver3-gcc11&num=1
76 # https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
77 # https://en.wikichip.org/wiki/amd/microarchitectures/zen
78 # https://en.wikichip.org/wiki/intel/microarchitectures/skylake
79 znver1 = [ "skylake" ] ++ inferiors.skylake;
80 znver2 = [ "znver1" ] ++ inferiors.znver1;
81 znver3 = [ "znver2" ] ++ inferiors.znver2;
82
83 # other
84 armv5te = [ ];
85 armv6 = [ ];
86 armv7-a = [ ];
87 armv8-a = [ ];
88 mips32 = [ ];
89 loongson2f = [ ];
90 };
91
92 predicates = let
93 featureSupport = feature: x: builtins.elem feature features.${x} or [];
94 in {
95 sse3Support = featureSupport "sse3";
96 ssse3Support = featureSupport "ssse3";
97 sse4_1Support = featureSupport "sse4_1";
98 sse4_2Support = featureSupport "sse4_2";
99 sse4_aSupport = featureSupport "sse4a";
100 avxSupport = featureSupport "avx";
101 avx2Support = featureSupport "avx2";
102 avx512Support = featureSupport "avx512";
103 aesSupport = featureSupport "aes";
104 fmaSupport = featureSupport "fma";
105 fma4Support = featureSupport "fma4";
106 };
107}