at 22.05-pre 5.3 kB view raw
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}