2020-08-05 02:32:41 +00:00
|
|
|
{ lib }:
|
|
|
|
|
|
|
|
rec {
|
2021-01-22 20:33:55 -05:00
|
|
|
# gcc.arch to its features (as in /proc/cpuinfo)
|
2020-08-05 02:32:41 +00:00
|
|
|
features = {
|
2022-11-27 23:18:20 +01:00
|
|
|
# x86_64 Generic
|
|
|
|
# Spec: https://gitlab.com/x86-psABIs/x86-64-ABI/
|
2020-08-05 02:32:41 +00:00
|
|
|
default = [ ];
|
2022-11-27 23:18:20 +01:00
|
|
|
x86-64 = [ ];
|
|
|
|
x86-64-v2 = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
];
|
|
|
|
x86-64-v3 = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"fma"
|
|
|
|
];
|
|
|
|
x86-64-v4 = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"avx512"
|
|
|
|
"fma"
|
|
|
|
];
|
2020-08-05 02:32:41 +00:00
|
|
|
# x86_64 Intel
|
2024-11-11 12:18:54 +08:00
|
|
|
nehalem = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
];
|
|
|
|
westmere = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
];
|
|
|
|
silvermont = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
];
|
|
|
|
sandybridge = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"avx"
|
|
|
|
];
|
|
|
|
ivybridge = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"avx"
|
|
|
|
];
|
|
|
|
haswell = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"fma"
|
|
|
|
];
|
|
|
|
broadwell = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"fma"
|
|
|
|
];
|
2020-08-05 02:32:41 +00:00
|
|
|
skylake = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"aes"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"fma"
|
|
|
|
];
|
|
|
|
skylake-avx512 = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"aes"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"avx512"
|
|
|
|
"fma"
|
|
|
|
];
|
2020-12-23 18:02:10 -06:00
|
|
|
cannonlake = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"aes"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"avx512"
|
|
|
|
"fma"
|
|
|
|
];
|
|
|
|
icelake-client = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"aes"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"avx512"
|
|
|
|
"fma"
|
|
|
|
];
|
|
|
|
icelake-server = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"aes"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"avx512"
|
|
|
|
"fma"
|
|
|
|
];
|
|
|
|
cascadelake = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"aes"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"avx512"
|
|
|
|
"fma"
|
|
|
|
];
|
|
|
|
cooperlake = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"aes"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"avx512"
|
|
|
|
"fma"
|
|
|
|
];
|
|
|
|
tigerlake = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"aes"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"avx512"
|
|
|
|
"fma"
|
|
|
|
];
|
2023-05-16 20:58:40 +08:00
|
|
|
alderlake = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"aes"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"fma"
|
|
|
|
];
|
2024-10-07 12:54:21 +02:00
|
|
|
sapphirerapids = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"aes"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"avx512"
|
|
|
|
"fma"
|
|
|
|
];
|
|
|
|
emeraldrapids = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"aes"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"avx512"
|
|
|
|
"fma"
|
|
|
|
];
|
2025-02-19 13:55:55 +00:00
|
|
|
sierraforest = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"aes"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"fma"
|
|
|
|
];
|
2020-08-05 02:32:41 +00:00
|
|
|
# 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"
|
|
|
|
];
|
2020-12-23 18:02:10 -06:00
|
|
|
znver3 = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"sse4a"
|
|
|
|
"aes"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"fma"
|
|
|
|
];
|
2023-06-14 22:41:43 -06:00
|
|
|
znver4 = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"sse4a"
|
|
|
|
"aes"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"avx512"
|
|
|
|
"fma"
|
|
|
|
];
|
2025-02-09 15:13:34 +01:00
|
|
|
znver5 = [
|
|
|
|
"sse3"
|
|
|
|
"ssse3"
|
|
|
|
"sse4_1"
|
|
|
|
"sse4_2"
|
|
|
|
"sse4a"
|
|
|
|
"aes"
|
|
|
|
"avx"
|
|
|
|
"avx2"
|
|
|
|
"avx512"
|
|
|
|
"fma"
|
|
|
|
];
|
2020-08-05 02:32:41 +00:00
|
|
|
# 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 = {
|
2022-11-27 23:18:20 +01:00
|
|
|
# x86_64 Generic
|
|
|
|
default = [ ];
|
|
|
|
x86-64 = [ ];
|
|
|
|
x86-64-v2 = [ "x86-64" ];
|
|
|
|
x86-64-v3 = [ "x86-64-v2" ] ++ inferiors.x86-64-v2;
|
|
|
|
x86-64-v4 = [ "x86-64-v3" ] ++ inferiors.x86-64-v3;
|
|
|
|
|
2020-08-05 02:32:41 +00:00
|
|
|
# x86_64 Intel
|
2022-11-29 01:45:05 +01:00
|
|
|
# https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
|
2022-11-27 23:18:20 +01:00
|
|
|
nehalem = [ "x86-64-v2" ] ++ inferiors.x86-64-v2;
|
|
|
|
westmere = [ "nehalem" ] ++ inferiors.nehalem;
|
|
|
|
sandybridge = [ "westmere" ] ++ inferiors.westmere;
|
|
|
|
ivybridge = [ "sandybridge" ] ++ inferiors.sandybridge;
|
|
|
|
|
|
|
|
haswell = lib.unique (
|
|
|
|
[
|
|
|
|
"ivybridge"
|
|
|
|
"x86-64-v3"
|
|
|
|
]
|
|
|
|
++ inferiors.ivybridge
|
|
|
|
++ inferiors.x86-64-v3
|
|
|
|
);
|
|
|
|
broadwell = [ "haswell" ] ++ inferiors.haswell;
|
|
|
|
skylake = [ "broadwell" ] ++ inferiors.broadwell;
|
|
|
|
|
|
|
|
skylake-avx512 = lib.unique (
|
|
|
|
[
|
|
|
|
"skylake"
|
|
|
|
"x86-64-v4"
|
|
|
|
]
|
|
|
|
++ inferiors.skylake
|
|
|
|
++ inferiors.x86-64-v4
|
|
|
|
);
|
2022-11-29 01:45:05 +01:00
|
|
|
cannonlake = [ "skylake-avx512" ] ++ inferiors.skylake-avx512;
|
|
|
|
icelake-client = [ "cannonlake" ] ++ inferiors.cannonlake;
|
|
|
|
icelake-server = [ "icelake-client" ] ++ inferiors.icelake-client;
|
2022-11-27 23:18:20 +01:00
|
|
|
cascadelake = [ "cannonlake" ] ++ inferiors.cannonlake;
|
2022-11-29 01:45:05 +01:00
|
|
|
cooperlake = [ "cascadelake" ] ++ inferiors.cascadelake;
|
|
|
|
tigerlake = [ "icelake-server" ] ++ inferiors.icelake-server;
|
2024-10-07 12:54:21 +02:00
|
|
|
sapphirerapids = [ "tigerlake" ] ++ inferiors.tigerlake;
|
|
|
|
emeraldrapids = [ "sapphirerapids" ] ++ inferiors.sapphirerapids;
|
2022-11-27 23:18:20 +01:00
|
|
|
|
2023-05-16 20:58:40 +08:00
|
|
|
# CX16 does not exist on alderlake, while it does on nearly all other intel CPUs
|
|
|
|
alderlake = [ ];
|
2025-02-19 13:55:55 +00:00
|
|
|
sierraforest = [ "alderlake" ] ++ inferiors.alderlake;
|
2020-12-23 18:02:10 -06:00
|
|
|
|
2020-08-05 02:32:41 +00:00
|
|
|
# x86_64 AMD
|
2020-12-23 18:02:10 -06:00
|
|
|
# TODO: fill this (need testing)
|
2020-08-05 02:32:41 +00:00
|
|
|
btver1 = [ ];
|
2020-12-23 18:02:10 -06:00
|
|
|
btver2 = [ ];
|
|
|
|
bdver1 = [ ];
|
|
|
|
bdver2 = [ ];
|
|
|
|
bdver3 = [ ];
|
|
|
|
bdver4 = [ ];
|
|
|
|
# Regarding `skylake` as inferior of `znver1`, there are reports of
|
|
|
|
# successful usage by Gentoo users and Phoronix benchmarking of different
|
|
|
|
# `-march` targets.
|
|
|
|
#
|
|
|
|
# The GCC documentation on extensions used and wikichip documentation
|
|
|
|
# regarding supperted extensions on znver1 and skylake was used to create
|
|
|
|
# this partial order.
|
|
|
|
#
|
|
|
|
# Note:
|
|
|
|
#
|
2022-12-17 18:59:29 -05:00
|
|
|
# - The successors of `skylake` (`cannonlake`, `icelake`, etc) use `avx512`
|
2020-12-23 18:02:10 -06:00
|
|
|
# which no current AMD Zen michroarch support.
|
|
|
|
# - `znver1` uses `ABM`, `CLZERO`, `CX16`, `MWAITX`, and `SSE4A` which no
|
|
|
|
# current Intel microarch support.
|
|
|
|
#
|
|
|
|
# https://www.phoronix.com/scan.php?page=article&item=amd-znver3-gcc11&num=1
|
|
|
|
# https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
|
|
|
|
# https://en.wikichip.org/wiki/amd/microarchitectures/zen
|
|
|
|
# https://en.wikichip.org/wiki/intel/microarchitectures/skylake
|
2022-11-27 23:18:20 +01:00
|
|
|
znver1 = [ "skylake" ] ++ inferiors.skylake; # Includes haswell and x86-64-v3
|
2020-12-23 18:02:10 -06:00
|
|
|
znver2 = [ "znver1" ] ++ inferiors.znver1;
|
|
|
|
znver3 = [ "znver2" ] ++ inferiors.znver2;
|
2022-11-27 23:18:20 +01:00
|
|
|
znver4 = lib.unique (
|
|
|
|
[
|
|
|
|
"znver3"
|
|
|
|
"x86-64-v4"
|
|
|
|
]
|
|
|
|
++ inferiors.znver3
|
|
|
|
++ inferiors.x86-64-v4
|
|
|
|
);
|
2025-02-09 15:13:34 +01:00
|
|
|
znver5 = [ "znver4" ] ++ inferiors.znver4;
|
2020-12-23 18:02:10 -06:00
|
|
|
|
2024-10-13 14:39:46 +02:00
|
|
|
# ARM64 (AArch64)
|
|
|
|
armv8-a = [ ];
|
|
|
|
"armv8.1-a" = [ "armv8-a" ];
|
|
|
|
"armv8.2-a" = [ "armv8.1-a" ] ++ inferiors."armv8.1-a";
|
|
|
|
"armv8.3-a" = [ "armv8.2-a" ] ++ inferiors."armv8.2-a";
|
|
|
|
"armv8.4-a" = [ "armv8.3-a" ] ++ inferiors."armv8.3-a";
|
|
|
|
"armv8.5-a" = [ "armv8.4-a" ] ++ inferiors."armv8.4-a";
|
|
|
|
"armv8.6-a" = [ "armv8.5-a" ] ++ inferiors."armv8.5-a";
|
|
|
|
"armv8.7-a" = [ "armv8.6-a" ] ++ inferiors."armv8.6-a";
|
|
|
|
"armv8.8-a" = [ "armv8.7-a" ] ++ inferiors."armv8.7-a";
|
|
|
|
"armv8.9-a" = [ "armv8.8-a" ] ++ inferiors."armv8.8-a";
|
|
|
|
armv9-a = [ "armv8.5-a" ] ++ inferiors."armv8.5-a";
|
|
|
|
"armv9.1-a" = [
|
|
|
|
"armv9-a"
|
|
|
|
"armv8.6-a"
|
|
|
|
] ++ inferiors."armv8.6-a";
|
|
|
|
"armv9.2-a" = lib.unique (
|
|
|
|
[
|
|
|
|
"armv9.1-a"
|
|
|
|
"armv8.7-a"
|
|
|
|
]
|
|
|
|
++ inferiors."armv9.1-a"
|
|
|
|
++ inferiors."armv8.7-a"
|
|
|
|
);
|
|
|
|
"armv9.3-a" = lib.unique (
|
|
|
|
[
|
|
|
|
"armv9.2-a"
|
|
|
|
"armv8.8-a"
|
|
|
|
]
|
|
|
|
++ inferiors."armv9.2-a"
|
|
|
|
++ inferiors."armv8.8-a"
|
|
|
|
);
|
|
|
|
"armv9.4-a" = [ "armv9.3-a" ] ++ inferiors."armv9.3-a";
|
|
|
|
|
2020-08-05 02:32:41 +00:00
|
|
|
# other
|
|
|
|
armv5te = [ ];
|
|
|
|
armv6 = [ ];
|
|
|
|
armv7-a = [ ];
|
|
|
|
mips32 = [ ];
|
|
|
|
loongson2f = [ ];
|
|
|
|
};
|
|
|
|
|
2020-09-01 11:28:34 +00:00
|
|
|
predicates =
|
|
|
|
let
|
2020-09-09 11:56:52 -07:00
|
|
|
featureSupport = feature: x: builtins.elem feature features.${x} or [ ];
|
2020-09-01 11:28:34 +00:00
|
|
|
in
|
|
|
|
{
|
2020-08-22 23:04:08 +00:00
|
|
|
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";
|
2020-08-05 02:32:41 +00:00
|
|
|
};
|
|
|
|
}
|