Commit e3b5e91878
Changed files (4)
lib
std
lib/std/target/aarch64.zig
@@ -123,21 +123,11 @@ pub const Feature = enum {
zcz_gp,
};
-pub fn featureSet(features: []const Feature) Cpu.Feature.Set {
- var x: Cpu.Feature.Set = 0;
- for (features) |feature| {
- x |= 1 << @enumToInt(feature);
- }
- return x;
-}
-
-pub fn featureSetHas(set: Feature.Set, feature: Feature) bool {
- return (set & (1 << @enumToInt(feature))) != 0;
-}
+pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
pub const all_features = blk: {
const len = @typeInfo(Feature).Enum.fields.len;
- std.debug.assert(len <= @typeInfo(Feature.Set).Int.bits);
+ std.debug.assert(len <= @typeInfo(Cpu.Feature.Set).Int.bits);
var result: [len]Cpu.Feature = undefined;
result[@enumToInt(Feature.aes)] = .{
.index = @enumToInt(Feature.aes),
lib/std/target/x86.zig
@@ -1,3338 +1,3388 @@
-const Feature = @import("std").target.Feature;
-const Cpu = @import("std").target.Cpu;
-
-pub const feature_dnow3 = Feature{
- .name = "dnow3",
- .llvm_name = "3dnow",
- .description = "Enable 3DNow! instructions",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- },
-};
-
-pub const feature_dnowa3 = Feature{
- .name = "dnowa3",
- .llvm_name = "3dnowa",
- .description = "Enable 3DNow! Athlon instructions",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- },
-};
-
-pub const feature_bit64 = Feature{
- .name = "bit64",
- .llvm_name = "64bit",
- .description = "Support 64-bit instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_adx = Feature{
- .name = "adx",
- .llvm_name = "adx",
- .description = "Support ADX instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_aes = Feature{
- .name = "aes",
- .llvm_name = "aes",
- .description = "Enable AES instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_avx = Feature{
- .name = "avx",
- .llvm_name = "avx",
- .description = "Enable AVX instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_avx2 = Feature{
- .name = "avx2",
- .llvm_name = "avx2",
- .description = "Enable AVX2 instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_avx512f = Feature{
- .name = "avx512f",
- .llvm_name = "avx512f",
- .description = "Enable AVX-512 instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_avx512bf16 = Feature{
- .name = "avx512bf16",
- .llvm_name = "avx512bf16",
- .description = "Support bfloat16 floating point",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_avx512bitalg = Feature{
- .name = "avx512bitalg",
- .llvm_name = "avx512bitalg",
- .description = "Enable AVX-512 Bit Algorithms",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_bmi = Feature{
- .name = "bmi",
- .llvm_name = "bmi",
- .description = "Support BMI instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_bmi2 = Feature{
- .name = "bmi2",
- .llvm_name = "bmi2",
- .description = "Support BMI2 instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_avx512bw = Feature{
- .name = "avx512bw",
- .llvm_name = "avx512bw",
- .description = "Enable AVX-512 Byte and Word Instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_branchfusion = Feature{
- .name = "branchfusion",
- .llvm_name = "branchfusion",
- .description = "CMP/TEST can be fused with conditional branches",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_avx512cd = Feature{
- .name = "avx512cd",
- .llvm_name = "avx512cd",
- .description = "Enable AVX-512 Conflict Detection Instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_cldemote = Feature{
- .name = "cldemote",
- .llvm_name = "cldemote",
- .description = "Enable Cache Demote",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_clflushopt = Feature{
- .name = "clflushopt",
- .llvm_name = "clflushopt",
- .description = "Flush A Cache Line Optimized",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_clwb = Feature{
- .name = "clwb",
- .llvm_name = "clwb",
- .description = "Cache Line Write Back",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_clzero = Feature{
- .name = "clzero",
- .llvm_name = "clzero",
- .description = "Enable Cache Line Zero",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_cmov = Feature{
- .name = "cmov",
- .llvm_name = "cmov",
- .description = "Enable conditional move instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_cx8 = Feature{
- .name = "cx8",
- .llvm_name = "cx8",
- .description = "Support CMPXCHG8B instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_cx16 = Feature{
- .name = "cx16",
- .llvm_name = "cx16",
- .description = "64-bit with cmpxchg16b",
- .dependencies = &[_]*const Feature {
- &feature_cx8,
- },
-};
-
-pub const feature_avx512dq = Feature{
- .name = "avx512dq",
- .llvm_name = "avx512dq",
- .description = "Enable AVX-512 Doubleword and Quadword Instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_enqcmd = Feature{
- .name = "enqcmd",
- .llvm_name = "enqcmd",
- .description = "Has ENQCMD instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_avx512er = Feature{
- .name = "avx512er",
- .llvm_name = "avx512er",
- .description = "Enable AVX-512 Exponential and Reciprocal Instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_ermsb = Feature{
- .name = "ermsb",
- .llvm_name = "ermsb",
- .description = "REP MOVS/STOS are fast",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_f16c = Feature{
- .name = "f16c",
- .llvm_name = "f16c",
- .description = "Support 16-bit floating point conversion instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_fma = Feature{
- .name = "fma",
- .llvm_name = "fma",
- .description = "Enable three-operand fused multiple-add",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_fma4 = Feature{
- .name = "fma4",
- .llvm_name = "fma4",
- .description = "Enable four-operand fused multiple-add",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_fsgsbase = Feature{
- .name = "fsgsbase",
- .llvm_name = "fsgsbase",
- .description = "Support FS/GS Base instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_fxsr = Feature{
- .name = "fxsr",
- .llvm_name = "fxsr",
- .description = "Support fxsave/fxrestore instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_fast11bytenop = Feature{
- .name = "fast11bytenop",
- .llvm_name = "fast-11bytenop",
- .description = "Target can quickly decode up to 11 byte NOPs",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_fast15bytenop = Feature{
- .name = "fast15bytenop",
- .llvm_name = "fast-15bytenop",
- .description = "Target can quickly decode up to 15 byte NOPs",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_fastBextr = Feature{
- .name = "fastBextr",
- .llvm_name = "fast-bextr",
- .description = "Indicates that the BEXTR instruction is implemented as a single uop with good throughput",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_fastHops = Feature{
- .name = "fastHops",
- .llvm_name = "fast-hops",
- .description = "Prefer horizontal vector math instructions (haddp, phsub, etc.) over normal vector instructions with shuffles",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_fastLzcnt = Feature{
- .name = "fastLzcnt",
- .llvm_name = "fast-lzcnt",
- .description = "LZCNT instructions are as fast as most simple integer ops",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_fastPartialYmmOrZmmWrite = Feature{
- .name = "fastPartialYmmOrZmmWrite",
- .llvm_name = "fast-partial-ymm-or-zmm-write",
- .description = "Partial writes to YMM/ZMM registers are fast",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_fastShldRotate = Feature{
- .name = "fastShldRotate",
- .llvm_name = "fast-shld-rotate",
- .description = "SHLD can be used as a faster rotate",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_fastScalarFsqrt = Feature{
- .name = "fastScalarFsqrt",
- .llvm_name = "fast-scalar-fsqrt",
- .description = "Scalar SQRT is fast (disable Newton-Raphson)",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_fastScalarShiftMasks = Feature{
- .name = "fastScalarShiftMasks",
- .llvm_name = "fast-scalar-shift-masks",
- .description = "Prefer a left/right scalar logical shift pair over a shift+and pair",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_fastVariableShuffle = Feature{
- .name = "fastVariableShuffle",
- .llvm_name = "fast-variable-shuffle",
- .description = "Shuffles with variable masks are fast",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_fastVectorFsqrt = Feature{
- .name = "fastVectorFsqrt",
- .llvm_name = "fast-vector-fsqrt",
- .description = "Vector SQRT is fast (disable Newton-Raphson)",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_fastVectorShiftMasks = Feature{
- .name = "fastVectorShiftMasks",
- .llvm_name = "fast-vector-shift-masks",
- .description = "Prefer a left/right vector logical shift pair over a shift+and pair",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_gfni = Feature{
- .name = "gfni",
- .llvm_name = "gfni",
- .description = "Enable Galois Field Arithmetic Instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_fastGather = Feature{
- .name = "fastGather",
- .llvm_name = "fast-gather",
- .description = "Indicates if gather is reasonably fast",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_avx512ifma = Feature{
- .name = "avx512ifma",
- .llvm_name = "avx512ifma",
- .description = "Enable AVX-512 Integer Fused Multiple-Add",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_invpcid = Feature{
- .name = "invpcid",
- .llvm_name = "invpcid",
- .description = "Invalidate Process-Context Identifier",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_sahf = Feature{
- .name = "sahf",
- .llvm_name = "sahf",
- .description = "Support LAHF and SAHF instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_leaSp = Feature{
- .name = "leaSp",
- .llvm_name = "lea-sp",
- .description = "Use LEA for adjusting the stack pointer",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_leaUsesAg = Feature{
- .name = "leaUsesAg",
- .llvm_name = "lea-uses-ag",
- .description = "LEA instruction needs inputs at AG stage",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_lwp = Feature{
- .name = "lwp",
- .llvm_name = "lwp",
- .description = "Enable LWP instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_lzcnt = Feature{
- .name = "lzcnt",
- .llvm_name = "lzcnt",
- .description = "Support LZCNT instruction",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_falseDepsLzcntTzcnt = Feature{
- .name = "falseDepsLzcntTzcnt",
- .llvm_name = "false-deps-lzcnt-tzcnt",
- .description = "LZCNT/TZCNT have a false dependency on dest register",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_mmx = Feature{
- .name = "mmx",
- .llvm_name = "mmx",
- .description = "Enable MMX instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_movbe = Feature{
- .name = "movbe",
- .llvm_name = "movbe",
- .description = "Support MOVBE instruction",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_movdir64b = Feature{
- .name = "movdir64b",
- .llvm_name = "movdir64b",
- .description = "Support movdir64b instruction",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_movdiri = Feature{
- .name = "movdiri",
- .llvm_name = "movdiri",
- .description = "Support movdiri instruction",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_mpx = Feature{
- .name = "mpx",
- .llvm_name = "mpx",
- .description = "Support MPX instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_mwaitx = Feature{
- .name = "mwaitx",
- .llvm_name = "mwaitx",
- .description = "Enable MONITORX/MWAITX timer functionality",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_macrofusion = Feature{
- .name = "macrofusion",
- .llvm_name = "macrofusion",
- .description = "Various instructions can be fused with conditional branches",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_mergeToThreewayBranch = Feature{
- .name = "mergeToThreewayBranch",
- .llvm_name = "merge-to-threeway-branch",
- .description = "Merge branches to a three-way conditional branch",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_nopl = Feature{
- .name = "nopl",
- .llvm_name = "nopl",
- .description = "Enable NOPL instruction",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_pclmul = Feature{
- .name = "pclmul",
- .llvm_name = "pclmul",
- .description = "Enable packed carry-less multiplication instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_pconfig = Feature{
- .name = "pconfig",
- .llvm_name = "pconfig",
- .description = "platform configuration instruction",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_avx512pf = Feature{
- .name = "avx512pf",
- .llvm_name = "avx512pf",
- .description = "Enable AVX-512 PreFetch Instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_pku = Feature{
- .name = "pku",
- .llvm_name = "pku",
- .description = "Enable protection keys",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_popcnt = Feature{
- .name = "popcnt",
- .llvm_name = "popcnt",
- .description = "Support POPCNT instruction",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_falseDepsPopcnt = Feature{
- .name = "falseDepsPopcnt",
- .llvm_name = "false-deps-popcnt",
- .description = "POPCNT has a false dependency on dest register",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_prefetchwt1 = Feature{
- .name = "prefetchwt1",
- .llvm_name = "prefetchwt1",
- .description = "Prefetch with Intent to Write and T1 Hint",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_prfchw = Feature{
- .name = "prfchw",
- .llvm_name = "prfchw",
- .description = "Support PRFCHW instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_ptwrite = Feature{
- .name = "ptwrite",
- .llvm_name = "ptwrite",
- .description = "Support ptwrite instruction",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_padShortFunctions = Feature{
- .name = "padShortFunctions",
- .llvm_name = "pad-short-functions",
- .description = "Pad short functions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_prefer256Bit = Feature{
- .name = "prefer256Bit",
- .llvm_name = "prefer-256-bit",
- .description = "Prefer 256-bit AVX instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_rdpid = Feature{
- .name = "rdpid",
- .llvm_name = "rdpid",
- .description = "Support RDPID instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_rdrnd = Feature{
- .name = "rdrnd",
- .llvm_name = "rdrnd",
- .description = "Support RDRAND instruction",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_rdseed = Feature{
- .name = "rdseed",
- .llvm_name = "rdseed",
- .description = "Support RDSEED instruction",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_rtm = Feature{
- .name = "rtm",
- .llvm_name = "rtm",
- .description = "Support RTM instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_retpoline = Feature{
- .name = "retpoline",
- .llvm_name = "retpoline",
- .description = "Remove speculation of indirect branches from the generated code, either by avoiding them entirely or lowering them with a speculation blocking construct",
- .dependencies = &[_]*const Feature {
- &feature_retpolineIndirectCalls,
- &feature_retpolineIndirectBranches,
- },
-};
-
-pub const feature_retpolineExternalThunk = Feature{
- .name = "retpolineExternalThunk",
- .llvm_name = "retpoline-external-thunk",
- .description = "When lowering an indirect call or branch using a `retpoline`, rely on the specified user provided thunk rather than emitting one ourselves. Only has effect when combined with some other retpoline feature",
- .dependencies = &[_]*const Feature {
- &feature_retpolineIndirectCalls,
- },
-};
-
-pub const feature_retpolineIndirectBranches = Feature{
- .name = "retpolineIndirectBranches",
- .llvm_name = "retpoline-indirect-branches",
- .description = "Remove speculation of indirect branches from the generated code",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_retpolineIndirectCalls = Feature{
- .name = "retpolineIndirectCalls",
- .llvm_name = "retpoline-indirect-calls",
- .description = "Remove speculation of indirect calls from the generated code",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_sgx = Feature{
- .name = "sgx",
- .llvm_name = "sgx",
- .description = "Enable Software Guard Extensions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_sha = Feature{
- .name = "sha",
- .llvm_name = "sha",
- .description = "Enable SHA instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_shstk = Feature{
- .name = "shstk",
- .llvm_name = "shstk",
- .description = "Support CET Shadow-Stack instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_sse = Feature{
- .name = "sse",
- .llvm_name = "sse",
- .description = "Enable SSE instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_sse2 = Feature{
- .name = "sse2",
- .llvm_name = "sse2",
- .description = "Enable SSE2 instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_sse3 = Feature{
- .name = "sse3",
- .llvm_name = "sse3",
- .description = "Enable SSE3 instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_sse4a = Feature{
- .name = "sse4a",
- .llvm_name = "sse4a",
- .description = "Support SSE 4a instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_sse41 = Feature{
- .name = "sse41",
- .llvm_name = "sse4.1",
- .description = "Enable SSE 4.1 instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_sse42 = Feature{
- .name = "sse42",
- .llvm_name = "sse4.2",
- .description = "Enable SSE 4.2 instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_sseUnalignedMem = Feature{
- .name = "sseUnalignedMem",
- .llvm_name = "sse-unaligned-mem",
- .description = "Allow unaligned memory operands with SSE instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_ssse3 = Feature{
- .name = "ssse3",
- .llvm_name = "ssse3",
- .description = "Enable SSSE3 instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_slow3opsLea = Feature{
- .name = "slow3opsLea",
- .llvm_name = "slow-3ops-lea",
- .description = "LEA instruction with 3 ops or certain registers is slow",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_idivlToDivb = Feature{
- .name = "idivlToDivb",
- .llvm_name = "idivl-to-divb",
- .description = "Use 8-bit divide for positive values less than 256",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_idivqToDivl = Feature{
- .name = "idivqToDivl",
- .llvm_name = "idivq-to-divl",
- .description = "Use 32-bit divide for positive values less than 2^32",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_slowIncdec = Feature{
- .name = "slowIncdec",
- .llvm_name = "slow-incdec",
- .description = "INC and DEC instructions are slower than ADD and SUB",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_slowLea = Feature{
- .name = "slowLea",
- .llvm_name = "slow-lea",
- .description = "LEA instruction with certain arguments is slow",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_slowPmaddwd = Feature{
- .name = "slowPmaddwd",
- .llvm_name = "slow-pmaddwd",
- .description = "PMADDWD is slower than PMULLD",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_slowPmulld = Feature{
- .name = "slowPmulld",
- .llvm_name = "slow-pmulld",
- .description = "PMULLD instruction is slow",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_slowShld = Feature{
- .name = "slowShld",
- .llvm_name = "slow-shld",
- .description = "SHLD instruction is slow",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_slowTwoMemOps = Feature{
- .name = "slowTwoMemOps",
- .llvm_name = "slow-two-mem-ops",
- .description = "Two memory operand instructions are slow",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_slowUnalignedMem16 = Feature{
- .name = "slowUnalignedMem16",
- .llvm_name = "slow-unaligned-mem-16",
- .description = "Slow unaligned 16-byte memory access",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_slowUnalignedMem32 = Feature{
- .name = "slowUnalignedMem32",
- .llvm_name = "slow-unaligned-mem-32",
- .description = "Slow unaligned 32-byte memory access",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_softFloat = Feature{
- .name = "softFloat",
- .llvm_name = "soft-float",
- .description = "Use software floating point features",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_tbm = Feature{
- .name = "tbm",
- .llvm_name = "tbm",
- .description = "Enable TBM instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_vaes = Feature{
- .name = "vaes",
- .llvm_name = "vaes",
- .description = "Promote selected AES instructions to AVX512/AVX registers",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_avx512vbmi = Feature{
- .name = "avx512vbmi",
- .llvm_name = "avx512vbmi",
- .description = "Enable AVX-512 Vector Byte Manipulation Instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_avx512vbmi2 = Feature{
- .name = "avx512vbmi2",
- .llvm_name = "avx512vbmi2",
- .description = "Enable AVX-512 further Vector Byte Manipulation Instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_avx512vl = Feature{
- .name = "avx512vl",
- .llvm_name = "avx512vl",
- .description = "Enable AVX-512 Vector Length eXtensions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_avx512vnni = Feature{
- .name = "avx512vnni",
- .llvm_name = "avx512vnni",
- .description = "Enable AVX-512 Vector Neural Network Instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_avx512vp2intersect = Feature{
- .name = "avx512vp2intersect",
- .llvm_name = "avx512vp2intersect",
- .description = "Enable AVX-512 vp2intersect",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_vpclmulqdq = Feature{
- .name = "vpclmulqdq",
- .llvm_name = "vpclmulqdq",
- .description = "Enable vpclmulqdq instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_avx512vpopcntdq = Feature{
- .name = "avx512vpopcntdq",
- .llvm_name = "avx512vpopcntdq",
- .description = "Enable AVX-512 Population Count Instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_waitpkg = Feature{
- .name = "waitpkg",
- .llvm_name = "waitpkg",
- .description = "Wait and pause enhancements",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_wbnoinvd = Feature{
- .name = "wbnoinvd",
- .llvm_name = "wbnoinvd",
- .description = "Write Back No Invalidate",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_x87 = Feature{
- .name = "x87",
- .llvm_name = "x87",
- .description = "Enable X87 float instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_xop = Feature{
- .name = "xop",
- .llvm_name = "xop",
- .description = "Enable XOP instructions",
- .dependencies = &[_]*const Feature {
- &feature_sse,
- },
-};
-
-pub const feature_xsave = Feature{
- .name = "xsave",
- .llvm_name = "xsave",
- .description = "Support xsave instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_xsavec = Feature{
- .name = "xsavec",
- .llvm_name = "xsavec",
- .description = "Support xsavec instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_xsaveopt = Feature{
- .name = "xsaveopt",
- .llvm_name = "xsaveopt",
- .description = "Support xsaveopt instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_xsaves = Feature{
- .name = "xsaves",
- .llvm_name = "xsaves",
- .description = "Support xsaves instructions",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_bitMode16 = Feature{
- .name = "bitMode16",
- .llvm_name = "16bit-mode",
- .description = "16-bit mode (i8086)",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_bitMode32 = Feature{
- .name = "bitMode32",
- .llvm_name = "32bit-mode",
- .description = "32-bit mode (80386)",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const feature_bitMode64 = Feature{
- .name = "bitMode64",
- .llvm_name = "64bit-mode",
- .description = "64-bit mode (x86_64)",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const features = &[_]*const Feature {
- &feature_dnow3,
- &feature_dnowa3,
- &feature_bit64,
- &feature_adx,
- &feature_aes,
- &feature_avx,
- &feature_avx2,
- &feature_avx512f,
- &feature_avx512bf16,
- &feature_avx512bitalg,
- &feature_bmi,
- &feature_bmi2,
- &feature_avx512bw,
- &feature_branchfusion,
- &feature_avx512cd,
- &feature_cldemote,
- &feature_clflushopt,
- &feature_clwb,
- &feature_clzero,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_avx512dq,
- &feature_enqcmd,
- &feature_avx512er,
- &feature_ermsb,
- &feature_f16c,
- &feature_fma,
- &feature_fma4,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fast11bytenop,
- &feature_fast15bytenop,
- &feature_fastBextr,
- &feature_fastHops,
- &feature_fastLzcnt,
- &feature_fastPartialYmmOrZmmWrite,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_fastScalarShiftMasks,
- &feature_fastVariableShuffle,
- &feature_fastVectorFsqrt,
- &feature_fastVectorShiftMasks,
- &feature_gfni,
- &feature_fastGather,
- &feature_avx512ifma,
- &feature_invpcid,
- &feature_sahf,
- &feature_leaSp,
- &feature_leaUsesAg,
- &feature_lwp,
- &feature_lzcnt,
- &feature_falseDepsLzcntTzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_movdir64b,
- &feature_movdiri,
- &feature_mpx,
- &feature_mwaitx,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_pconfig,
- &feature_avx512pf,
- &feature_pku,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_prefetchwt1,
- &feature_prfchw,
- &feature_ptwrite,
- &feature_padShortFunctions,
- &feature_prefer256Bit,
- &feature_rdpid,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_rtm,
- &feature_retpoline,
- &feature_retpolineExternalThunk,
- &feature_retpolineIndirectBranches,
- &feature_retpolineIndirectCalls,
- &feature_sgx,
- &feature_sha,
- &feature_shstk,
- &feature_sse,
- &feature_sse2,
- &feature_sse3,
- &feature_sse4a,
- &feature_sse41,
- &feature_sse42,
- &feature_sseUnalignedMem,
- &feature_ssse3,
- &feature_slow3opsLea,
- &feature_idivlToDivb,
- &feature_idivqToDivl,
- &feature_slowIncdec,
- &feature_slowLea,
- &feature_slowPmaddwd,
- &feature_slowPmulld,
- &feature_slowShld,
- &feature_slowTwoMemOps,
- &feature_slowUnalignedMem16,
- &feature_slowUnalignedMem32,
- &feature_softFloat,
- &feature_tbm,
- &feature_vaes,
- &feature_avx512vbmi,
- &feature_avx512vbmi2,
- &feature_avx512vl,
- &feature_avx512vnni,
- &feature_avx512vp2intersect,
- &feature_vpclmulqdq,
- &feature_avx512vpopcntdq,
- &feature_waitpkg,
- &feature_wbnoinvd,
- &feature_x87,
- &feature_xop,
- &feature_xsave,
- &feature_xsavec,
- &feature_xsaveopt,
- &feature_xsaves,
- &feature_bitMode16,
- &feature_bitMode32,
- &feature_bitMode64,
-};
-
-pub const cpu_amdfam10 = Cpu{
- .name = "amdfam10",
- .llvm_name = "amdfam10",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnowa3,
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_fastScalarShiftMasks,
- &feature_sahf,
- &feature_lzcnt,
- &feature_nopl,
- &feature_popcnt,
- &feature_sse,
- &feature_sse4a,
- &feature_slowShld,
- &feature_x87,
- },
-};
-
-pub const cpu_athlon = Cpu{
- .name = "athlon",
- .llvm_name = "athlon",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnowa3,
- &feature_cmov,
- &feature_cx8,
- &feature_nopl,
- &feature_slowShld,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_athlon4 = Cpu{
- .name = "athlon4",
- .llvm_name = "athlon-4",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnowa3,
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_nopl,
- &feature_sse,
- &feature_slowShld,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_athlonFx = Cpu{
- .name = "athlonFx",
- .llvm_name = "athlon-fx",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnowa3,
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_fastScalarShiftMasks,
- &feature_nopl,
- &feature_sse,
- &feature_sse2,
- &feature_slowShld,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_athlonMp = Cpu{
- .name = "athlonMp",
- .llvm_name = "athlon-mp",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnowa3,
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_nopl,
- &feature_sse,
- &feature_slowShld,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_athlonTbird = Cpu{
- .name = "athlonTbird",
- .llvm_name = "athlon-tbird",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnowa3,
- &feature_cmov,
- &feature_cx8,
- &feature_nopl,
- &feature_slowShld,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_athlonXp = Cpu{
- .name = "athlonXp",
- .llvm_name = "athlon-xp",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnowa3,
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_nopl,
- &feature_sse,
- &feature_slowShld,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_athlon64 = Cpu{
- .name = "athlon64",
- .llvm_name = "athlon64",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnowa3,
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_fastScalarShiftMasks,
- &feature_nopl,
- &feature_sse,
- &feature_sse2,
- &feature_slowShld,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_athlon64Sse3 = Cpu{
- .name = "athlon64Sse3",
- .llvm_name = "athlon64-sse3",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnowa3,
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_fastScalarShiftMasks,
- &feature_nopl,
- &feature_sse,
- &feature_sse3,
- &feature_slowShld,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_atom = Cpu{
- .name = "atom",
- .llvm_name = "atom",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_sahf,
- &feature_leaSp,
- &feature_leaUsesAg,
- &feature_mmx,
- &feature_movbe,
- &feature_nopl,
- &feature_padShortFunctions,
- &feature_sse,
- &feature_ssse3,
- &feature_idivlToDivb,
- &feature_idivqToDivl,
- &feature_slowTwoMemOps,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_barcelona = Cpu{
- .name = "barcelona",
- .llvm_name = "barcelona",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnowa3,
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_fastScalarShiftMasks,
- &feature_sahf,
- &feature_lzcnt,
- &feature_nopl,
- &feature_popcnt,
- &feature_sse,
- &feature_sse4a,
- &feature_slowShld,
- &feature_x87,
- },
-};
-
-pub const cpu_bdver1 = Cpu{
- .name = "bdver1",
- .llvm_name = "bdver1",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_sse,
- &feature_aes,
- &feature_branchfusion,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_fast11bytenop,
- &feature_fastScalarShiftMasks,
- &feature_sahf,
- &feature_lwp,
- &feature_lzcnt,
- &feature_mmx,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_prfchw,
- &feature_slowShld,
- &feature_x87,
- &feature_xop,
- &feature_xsave,
- },
-};
-
-pub const cpu_bdver2 = Cpu{
- .name = "bdver2",
- .llvm_name = "bdver2",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_sse,
- &feature_aes,
- &feature_bmi,
- &feature_branchfusion,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_f16c,
- &feature_fma,
- &feature_fxsr,
- &feature_fast11bytenop,
- &feature_fastBextr,
- &feature_fastScalarShiftMasks,
- &feature_sahf,
- &feature_lwp,
- &feature_lzcnt,
- &feature_mmx,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_prfchw,
- &feature_slowShld,
- &feature_tbm,
- &feature_x87,
- &feature_xop,
- &feature_xsave,
- },
-};
-
-pub const cpu_bdver3 = Cpu{
- .name = "bdver3",
- .llvm_name = "bdver3",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_sse,
- &feature_aes,
- &feature_bmi,
- &feature_branchfusion,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fast11bytenop,
- &feature_fastBextr,
- &feature_fastScalarShiftMasks,
- &feature_sahf,
- &feature_lwp,
- &feature_lzcnt,
- &feature_mmx,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_prfchw,
- &feature_slowShld,
- &feature_tbm,
- &feature_x87,
- &feature_xop,
- &feature_xsave,
- &feature_xsaveopt,
- },
-};
-
-pub const cpu_bdver4 = Cpu{
- .name = "bdver4",
- .llvm_name = "bdver4",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_sse,
- &feature_aes,
- &feature_avx2,
- &feature_bmi,
- &feature_bmi2,
- &feature_branchfusion,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fast11bytenop,
- &feature_fastBextr,
- &feature_fastScalarShiftMasks,
- &feature_sahf,
- &feature_lwp,
- &feature_lzcnt,
- &feature_mmx,
- &feature_mwaitx,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_prfchw,
- &feature_slowShld,
- &feature_tbm,
- &feature_x87,
- &feature_xop,
- &feature_xsave,
- &feature_xsaveopt,
- },
-};
-
-pub const cpu_bonnell = Cpu{
- .name = "bonnell",
- .llvm_name = "bonnell",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_sahf,
- &feature_leaSp,
- &feature_leaUsesAg,
- &feature_mmx,
- &feature_movbe,
- &feature_nopl,
- &feature_padShortFunctions,
- &feature_sse,
- &feature_ssse3,
- &feature_idivlToDivb,
- &feature_idivqToDivl,
- &feature_slowTwoMemOps,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_broadwell = Cpu{
- .name = "broadwell",
- .llvm_name = "broadwell",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_adx,
- &feature_sse,
- &feature_avx,
- &feature_avx2,
- &feature_bmi,
- &feature_bmi2,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_ermsb,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_fastVariableShuffle,
- &feature_invpcid,
- &feature_sahf,
- &feature_lzcnt,
- &feature_falseDepsLzcntTzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_prfchw,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_sse42,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_x87,
- &feature_xsave,
- &feature_xsaveopt,
- },
-};
-
-pub const cpu_btver1 = Cpu{
- .name = "btver1",
- .llvm_name = "btver1",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_fast15bytenop,
- &feature_fastScalarShiftMasks,
- &feature_fastVectorShiftMasks,
- &feature_sahf,
- &feature_lzcnt,
- &feature_mmx,
- &feature_nopl,
- &feature_popcnt,
- &feature_prfchw,
- &feature_sse,
- &feature_sse4a,
- &feature_ssse3,
- &feature_slowShld,
- &feature_x87,
- },
-};
-
-pub const cpu_btver2 = Cpu{
- .name = "btver2",
- .llvm_name = "btver2",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_sse,
- &feature_aes,
- &feature_avx,
- &feature_bmi,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_f16c,
- &feature_fxsr,
- &feature_fast15bytenop,
- &feature_fastBextr,
- &feature_fastHops,
- &feature_fastLzcnt,
- &feature_fastPartialYmmOrZmmWrite,
- &feature_fastScalarShiftMasks,
- &feature_fastVectorShiftMasks,
- &feature_sahf,
- &feature_lzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_prfchw,
- &feature_sse4a,
- &feature_ssse3,
- &feature_slowShld,
- &feature_x87,
- &feature_xsave,
- &feature_xsaveopt,
- },
-};
-
-pub const cpu_c3 = Cpu{
- .name = "c3",
- .llvm_name = "c3",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnow3,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_c32 = Cpu{
- .name = "c32",
- .llvm_name = "c3-2",
- .dependencies = &[_]*const Feature {
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_mmx,
- &feature_sse,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_cannonlake = Cpu{
- .name = "cannonlake",
- .llvm_name = "cannonlake",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_adx,
- &feature_sse,
- &feature_aes,
- &feature_avx,
- &feature_avx2,
- &feature_avx512f,
- &feature_bmi,
- &feature_bmi2,
- &feature_avx512bw,
- &feature_avx512cd,
- &feature_clflushopt,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_avx512dq,
- &feature_ermsb,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_fastVariableShuffle,
- &feature_fastVectorFsqrt,
- &feature_fastGather,
- &feature_avx512ifma,
- &feature_invpcid,
- &feature_sahf,
- &feature_lzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_mpx,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_pku,
- &feature_popcnt,
- &feature_prfchw,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_sgx,
- &feature_sha,
- &feature_sse42,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_avx512vbmi,
- &feature_avx512vl,
- &feature_x87,
- &feature_xsave,
- &feature_xsavec,
- &feature_xsaveopt,
- &feature_xsaves,
- },
-};
-
-pub const cpu_cascadelake = Cpu{
- .name = "cascadelake",
- .llvm_name = "cascadelake",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_adx,
- &feature_sse,
- &feature_aes,
- &feature_avx,
- &feature_avx2,
- &feature_avx512f,
- &feature_bmi,
- &feature_bmi2,
- &feature_avx512bw,
- &feature_avx512cd,
- &feature_clflushopt,
- &feature_clwb,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_avx512dq,
- &feature_ermsb,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_fastVariableShuffle,
- &feature_fastVectorFsqrt,
- &feature_fastGather,
- &feature_invpcid,
- &feature_sahf,
- &feature_lzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_mpx,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_pku,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_prfchw,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_sse42,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_avx512vl,
- &feature_avx512vnni,
- &feature_x87,
- &feature_xsave,
- &feature_xsavec,
- &feature_xsaveopt,
- &feature_xsaves,
- },
-};
-
-pub const cpu_cooperlake = Cpu{
- .name = "cooperlake",
- .llvm_name = "cooperlake",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_adx,
- &feature_sse,
- &feature_aes,
- &feature_avx,
- &feature_avx2,
- &feature_avx512f,
- &feature_avx512bf16,
- &feature_bmi,
- &feature_bmi2,
- &feature_avx512bw,
- &feature_avx512cd,
- &feature_clflushopt,
- &feature_clwb,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_avx512dq,
- &feature_ermsb,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_fastVariableShuffle,
- &feature_fastVectorFsqrt,
- &feature_fastGather,
- &feature_invpcid,
- &feature_sahf,
- &feature_lzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_mpx,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_pku,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_prfchw,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_sse42,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_avx512vl,
- &feature_avx512vnni,
- &feature_x87,
- &feature_xsave,
- &feature_xsavec,
- &feature_xsaveopt,
- &feature_xsaves,
- },
-};
-
-pub const cpu_coreAvxI = Cpu{
- .name = "coreAvxI",
- .llvm_name = "core-avx-i",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_sse,
- &feature_avx,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_f16c,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_sahf,
- &feature_mmx,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_rdrnd,
- &feature_sse42,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_slowUnalignedMem32,
- &feature_x87,
- &feature_xsave,
- &feature_xsaveopt,
- },
-};
-
-pub const cpu_coreAvx2 = Cpu{
- .name = "coreAvx2",
- .llvm_name = "core-avx2",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_sse,
- &feature_avx,
- &feature_avx2,
- &feature_bmi,
- &feature_bmi2,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_ermsb,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_fastVariableShuffle,
- &feature_invpcid,
- &feature_sahf,
- &feature_lzcnt,
- &feature_falseDepsLzcntTzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_rdrnd,
- &feature_sse42,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_x87,
- &feature_xsave,
- &feature_xsaveopt,
- },
-};
-
-pub const cpu_core2 = Cpu{
- .name = "core2",
- .llvm_name = "core2",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_sahf,
- &feature_mmx,
- &feature_macrofusion,
- &feature_nopl,
- &feature_sse,
- &feature_ssse3,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_corei7 = Cpu{
- .name = "corei7",
- .llvm_name = "corei7",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_sahf,
- &feature_mmx,
- &feature_macrofusion,
- &feature_nopl,
- &feature_popcnt,
- &feature_sse,
- &feature_sse42,
- &feature_x87,
- },
-};
-
-pub const cpu_corei7Avx = Cpu{
- .name = "corei7Avx",
- .llvm_name = "corei7-avx",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_sse,
- &feature_avx,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_sahf,
- &feature_mmx,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_sse42,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_slowUnalignedMem32,
- &feature_x87,
- &feature_xsave,
- &feature_xsaveopt,
- },
-};
-
-pub const cpu_generic = Cpu{
- .name = "generic",
- .llvm_name = "generic",
- .dependencies = &[_]*const Feature {
- &feature_cx8,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_geode = Cpu{
- .name = "geode",
- .llvm_name = "geode",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnowa3,
- &feature_cx8,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_goldmont = Cpu{
- .name = "goldmont",
- .llvm_name = "goldmont",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_sse,
- &feature_aes,
- &feature_clflushopt,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_sahf,
- &feature_mmx,
- &feature_movbe,
- &feature_mpx,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_prfchw,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_sha,
- &feature_sse42,
- &feature_ssse3,
- &feature_slowIncdec,
- &feature_slowLea,
- &feature_slowTwoMemOps,
- &feature_x87,
- &feature_xsave,
- &feature_xsavec,
- &feature_xsaveopt,
- &feature_xsaves,
- },
-};
-
-pub const cpu_goldmontPlus = Cpu{
- .name = "goldmontPlus",
- .llvm_name = "goldmont-plus",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_sse,
- &feature_aes,
- &feature_clflushopt,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_sahf,
- &feature_mmx,
- &feature_movbe,
- &feature_mpx,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_prfchw,
- &feature_ptwrite,
- &feature_rdpid,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_sgx,
- &feature_sha,
- &feature_sse42,
- &feature_ssse3,
- &feature_slowIncdec,
- &feature_slowLea,
- &feature_slowTwoMemOps,
- &feature_x87,
- &feature_xsave,
- &feature_xsavec,
- &feature_xsaveopt,
- &feature_xsaves,
- },
-};
-
-pub const cpu_haswell = Cpu{
- .name = "haswell",
- .llvm_name = "haswell",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_sse,
- &feature_avx,
- &feature_avx2,
- &feature_bmi,
- &feature_bmi2,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_ermsb,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_fastVariableShuffle,
- &feature_invpcid,
- &feature_sahf,
- &feature_lzcnt,
- &feature_falseDepsLzcntTzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_rdrnd,
- &feature_sse42,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_x87,
- &feature_xsave,
- &feature_xsaveopt,
- },
-};
-
-pub const cpu_i386 = Cpu{
- .name = "i386",
- .llvm_name = "i386",
- .dependencies = &[_]*const Feature {
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_i486 = Cpu{
- .name = "i486",
- .llvm_name = "i486",
- .dependencies = &[_]*const Feature {
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_i586 = Cpu{
- .name = "i586",
- .llvm_name = "i586",
- .dependencies = &[_]*const Feature {
- &feature_cx8,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_i686 = Cpu{
- .name = "i686",
- .llvm_name = "i686",
- .dependencies = &[_]*const Feature {
- &feature_cmov,
- &feature_cx8,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_icelakeClient = Cpu{
- .name = "icelakeClient",
- .llvm_name = "icelake-client",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_adx,
- &feature_sse,
- &feature_aes,
- &feature_avx,
- &feature_avx2,
- &feature_avx512f,
- &feature_avx512bitalg,
- &feature_bmi,
- &feature_bmi2,
- &feature_avx512bw,
- &feature_avx512cd,
- &feature_clflushopt,
- &feature_clwb,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_avx512dq,
- &feature_ermsb,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_fastVariableShuffle,
- &feature_fastVectorFsqrt,
- &feature_gfni,
- &feature_fastGather,
- &feature_avx512ifma,
- &feature_invpcid,
- &feature_sahf,
- &feature_lzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_mpx,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_pku,
- &feature_popcnt,
- &feature_prfchw,
- &feature_rdpid,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_sgx,
- &feature_sha,
- &feature_sse42,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_vaes,
- &feature_avx512vbmi,
- &feature_avx512vbmi2,
- &feature_avx512vl,
- &feature_avx512vnni,
- &feature_vpclmulqdq,
- &feature_avx512vpopcntdq,
- &feature_x87,
- &feature_xsave,
- &feature_xsavec,
- &feature_xsaveopt,
- &feature_xsaves,
- },
-};
-
-pub const cpu_icelakeServer = Cpu{
- .name = "icelakeServer",
- .llvm_name = "icelake-server",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_adx,
- &feature_sse,
- &feature_aes,
- &feature_avx,
- &feature_avx2,
- &feature_avx512f,
- &feature_avx512bitalg,
- &feature_bmi,
- &feature_bmi2,
- &feature_avx512bw,
- &feature_avx512cd,
- &feature_clflushopt,
- &feature_clwb,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_avx512dq,
- &feature_ermsb,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_fastVariableShuffle,
- &feature_fastVectorFsqrt,
- &feature_gfni,
- &feature_fastGather,
- &feature_avx512ifma,
- &feature_invpcid,
- &feature_sahf,
- &feature_lzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_mpx,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_pconfig,
- &feature_pku,
- &feature_popcnt,
- &feature_prfchw,
- &feature_rdpid,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_sgx,
- &feature_sha,
- &feature_sse42,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_vaes,
- &feature_avx512vbmi,
- &feature_avx512vbmi2,
- &feature_avx512vl,
- &feature_avx512vnni,
- &feature_vpclmulqdq,
- &feature_avx512vpopcntdq,
- &feature_wbnoinvd,
- &feature_x87,
- &feature_xsave,
- &feature_xsavec,
- &feature_xsaveopt,
- &feature_xsaves,
- },
-};
-
-pub const cpu_ivybridge = Cpu{
- .name = "ivybridge",
- .llvm_name = "ivybridge",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_sse,
- &feature_avx,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_f16c,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_sahf,
- &feature_mmx,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_rdrnd,
- &feature_sse42,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_slowUnalignedMem32,
- &feature_x87,
- &feature_xsave,
- &feature_xsaveopt,
- },
-};
-
-pub const cpu_k6 = Cpu{
- .name = "k6",
- .llvm_name = "k6",
- .dependencies = &[_]*const Feature {
- &feature_cx8,
- &feature_mmx,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_k62 = Cpu{
- .name = "k62",
- .llvm_name = "k6-2",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnow3,
- &feature_cx8,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_k63 = Cpu{
- .name = "k63",
- .llvm_name = "k6-3",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnow3,
- &feature_cx8,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_k8 = Cpu{
- .name = "k8",
- .llvm_name = "k8",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnowa3,
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_fastScalarShiftMasks,
- &feature_nopl,
- &feature_sse,
- &feature_sse2,
- &feature_slowShld,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_k8Sse3 = Cpu{
- .name = "k8Sse3",
- .llvm_name = "k8-sse3",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnowa3,
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_fastScalarShiftMasks,
- &feature_nopl,
- &feature_sse,
- &feature_sse3,
- &feature_slowShld,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_knl = Cpu{
- .name = "knl",
- .llvm_name = "knl",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_adx,
- &feature_sse,
- &feature_aes,
- &feature_avx512f,
- &feature_bmi,
- &feature_bmi2,
- &feature_avx512cd,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_avx512er,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fastPartialYmmOrZmmWrite,
- &feature_fastGather,
- &feature_sahf,
- &feature_lzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_nopl,
- &feature_pclmul,
- &feature_avx512pf,
- &feature_popcnt,
- &feature_prefetchwt1,
- &feature_prfchw,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_slowIncdec,
- &feature_slowPmaddwd,
- &feature_slowTwoMemOps,
- &feature_x87,
- &feature_xsave,
- &feature_xsaveopt,
- },
-};
-
-pub const cpu_knm = Cpu{
- .name = "knm",
- .llvm_name = "knm",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_adx,
- &feature_sse,
- &feature_aes,
- &feature_avx512f,
- &feature_bmi,
- &feature_bmi2,
- &feature_avx512cd,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_avx512er,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fastPartialYmmOrZmmWrite,
- &feature_fastGather,
- &feature_sahf,
- &feature_lzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_nopl,
- &feature_pclmul,
- &feature_avx512pf,
- &feature_popcnt,
- &feature_prefetchwt1,
- &feature_prfchw,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_slowIncdec,
- &feature_slowPmaddwd,
- &feature_slowTwoMemOps,
- &feature_avx512vpopcntdq,
- &feature_x87,
- &feature_xsave,
- &feature_xsaveopt,
- },
-};
-
-pub const cpu_lakemont = Cpu{
- .name = "lakemont",
- .llvm_name = "lakemont",
- .dependencies = &[_]*const Feature {
- },
-};
-
-pub const cpu_nehalem = Cpu{
- .name = "nehalem",
- .llvm_name = "nehalem",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_sahf,
- &feature_mmx,
- &feature_macrofusion,
- &feature_nopl,
- &feature_popcnt,
- &feature_sse,
- &feature_sse42,
- &feature_x87,
- },
-};
-
-pub const cpu_nocona = Cpu{
- .name = "nocona",
- .llvm_name = "nocona",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_mmx,
- &feature_nopl,
- &feature_sse,
- &feature_sse3,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_opteron = Cpu{
- .name = "opteron",
- .llvm_name = "opteron",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnowa3,
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_fastScalarShiftMasks,
- &feature_nopl,
- &feature_sse,
- &feature_sse2,
- &feature_slowShld,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_opteronSse3 = Cpu{
- .name = "opteronSse3",
- .llvm_name = "opteron-sse3",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnowa3,
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_fastScalarShiftMasks,
- &feature_nopl,
- &feature_sse,
- &feature_sse3,
- &feature_slowShld,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_penryn = Cpu{
- .name = "penryn",
- .llvm_name = "penryn",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_sahf,
- &feature_mmx,
- &feature_macrofusion,
- &feature_nopl,
- &feature_sse,
- &feature_sse41,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_pentium = Cpu{
- .name = "pentium",
- .llvm_name = "pentium",
- .dependencies = &[_]*const Feature {
- &feature_cx8,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_pentiumM = Cpu{
- .name = "pentiumM",
- .llvm_name = "pentium-m",
- .dependencies = &[_]*const Feature {
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_mmx,
- &feature_nopl,
- &feature_sse,
- &feature_sse2,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_pentiumMmx = Cpu{
- .name = "pentiumMmx",
- .llvm_name = "pentium-mmx",
- .dependencies = &[_]*const Feature {
- &feature_cx8,
- &feature_mmx,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_pentium2 = Cpu{
- .name = "pentium2",
- .llvm_name = "pentium2",
- .dependencies = &[_]*const Feature {
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_mmx,
- &feature_nopl,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_pentium3 = Cpu{
- .name = "pentium3",
- .llvm_name = "pentium3",
- .dependencies = &[_]*const Feature {
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_mmx,
- &feature_nopl,
- &feature_sse,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_pentium3m = Cpu{
- .name = "pentium3m",
- .llvm_name = "pentium3m",
- .dependencies = &[_]*const Feature {
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_mmx,
- &feature_nopl,
- &feature_sse,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_pentium4 = Cpu{
- .name = "pentium4",
- .llvm_name = "pentium4",
- .dependencies = &[_]*const Feature {
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_mmx,
- &feature_nopl,
- &feature_sse,
- &feature_sse2,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_pentium4m = Cpu{
- .name = "pentium4m",
- .llvm_name = "pentium4m",
- .dependencies = &[_]*const Feature {
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_mmx,
- &feature_nopl,
- &feature_sse,
- &feature_sse2,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_pentiumpro = Cpu{
- .name = "pentiumpro",
- .llvm_name = "pentiumpro",
- .dependencies = &[_]*const Feature {
- &feature_cmov,
- &feature_cx8,
- &feature_nopl,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_prescott = Cpu{
- .name = "prescott",
- .llvm_name = "prescott",
- .dependencies = &[_]*const Feature {
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_mmx,
- &feature_nopl,
- &feature_sse,
- &feature_sse3,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_sandybridge = Cpu{
- .name = "sandybridge",
- .llvm_name = "sandybridge",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_sse,
- &feature_avx,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_sahf,
- &feature_mmx,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_sse42,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_slowUnalignedMem32,
- &feature_x87,
- &feature_xsave,
- &feature_xsaveopt,
- },
-};
-
-pub const cpu_silvermont = Cpu{
- .name = "silvermont",
- .llvm_name = "silvermont",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_sahf,
- &feature_mmx,
- &feature_movbe,
- &feature_nopl,
- &feature_sse,
- &feature_pclmul,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_prfchw,
- &feature_rdrnd,
- &feature_sse42,
- &feature_ssse3,
- &feature_idivqToDivl,
- &feature_slowIncdec,
- &feature_slowLea,
- &feature_slowPmulld,
- &feature_slowTwoMemOps,
- &feature_x87,
- },
-};
-
-pub const cpu_skx = Cpu{
- .name = "skx",
- .llvm_name = "skx",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_adx,
- &feature_sse,
- &feature_aes,
- &feature_avx,
- &feature_avx2,
- &feature_avx512f,
- &feature_bmi,
- &feature_bmi2,
- &feature_avx512bw,
- &feature_avx512cd,
- &feature_clflushopt,
- &feature_clwb,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_avx512dq,
- &feature_ermsb,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_fastVariableShuffle,
- &feature_fastVectorFsqrt,
- &feature_fastGather,
- &feature_invpcid,
- &feature_sahf,
- &feature_lzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_mpx,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_pku,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_prfchw,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_sse42,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_avx512vl,
- &feature_x87,
- &feature_xsave,
- &feature_xsavec,
- &feature_xsaveopt,
- &feature_xsaves,
- },
-};
-
-pub const cpu_skylake = Cpu{
- .name = "skylake",
- .llvm_name = "skylake",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_adx,
- &feature_sse,
- &feature_aes,
- &feature_avx,
- &feature_avx2,
- &feature_bmi,
- &feature_bmi2,
- &feature_clflushopt,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_ermsb,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_fastVariableShuffle,
- &feature_fastVectorFsqrt,
- &feature_fastGather,
- &feature_invpcid,
- &feature_sahf,
- &feature_lzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_mpx,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_prfchw,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_sgx,
- &feature_sse42,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_x87,
- &feature_xsave,
- &feature_xsavec,
- &feature_xsaveopt,
- &feature_xsaves,
- },
-};
-
-pub const cpu_skylakeAvx512 = Cpu{
- .name = "skylakeAvx512",
- .llvm_name = "skylake-avx512",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_adx,
- &feature_sse,
- &feature_aes,
- &feature_avx,
- &feature_avx2,
- &feature_avx512f,
- &feature_bmi,
- &feature_bmi2,
- &feature_avx512bw,
- &feature_avx512cd,
- &feature_clflushopt,
- &feature_clwb,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_avx512dq,
- &feature_ermsb,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fastShldRotate,
- &feature_fastScalarFsqrt,
- &feature_fastVariableShuffle,
- &feature_fastVectorFsqrt,
- &feature_fastGather,
- &feature_invpcid,
- &feature_sahf,
- &feature_lzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_mpx,
- &feature_macrofusion,
- &feature_mergeToThreewayBranch,
- &feature_nopl,
- &feature_pclmul,
- &feature_pku,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_prfchw,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_sse42,
- &feature_slow3opsLea,
- &feature_idivqToDivl,
- &feature_avx512vl,
- &feature_x87,
- &feature_xsave,
- &feature_xsavec,
- &feature_xsaveopt,
- &feature_xsaves,
- },
-};
-
-pub const cpu_slm = Cpu{
- .name = "slm",
- .llvm_name = "slm",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_sahf,
- &feature_mmx,
- &feature_movbe,
- &feature_nopl,
- &feature_sse,
- &feature_pclmul,
- &feature_popcnt,
- &feature_falseDepsPopcnt,
- &feature_prfchw,
- &feature_rdrnd,
- &feature_sse42,
- &feature_ssse3,
- &feature_idivqToDivl,
- &feature_slowIncdec,
- &feature_slowLea,
- &feature_slowPmulld,
- &feature_slowTwoMemOps,
- &feature_x87,
- },
-};
-
-pub const cpu_tremont = Cpu{
- .name = "tremont",
- .llvm_name = "tremont",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_sse,
- &feature_aes,
- &feature_cldemote,
- &feature_clflushopt,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_gfni,
- &feature_sahf,
- &feature_mmx,
- &feature_movbe,
- &feature_movdir64b,
- &feature_movdiri,
- &feature_mpx,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_prfchw,
- &feature_ptwrite,
- &feature_rdpid,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_sgx,
- &feature_sha,
- &feature_sse42,
- &feature_ssse3,
- &feature_slowIncdec,
- &feature_slowLea,
- &feature_slowTwoMemOps,
- &feature_waitpkg,
- &feature_x87,
- &feature_xsave,
- &feature_xsavec,
- &feature_xsaveopt,
- &feature_xsaves,
- },
-};
-
-pub const cpu_westmere = Cpu{
- .name = "westmere",
- .llvm_name = "westmere",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_fxsr,
- &feature_sahf,
- &feature_mmx,
- &feature_macrofusion,
- &feature_nopl,
- &feature_sse,
- &feature_pclmul,
- &feature_popcnt,
- &feature_sse42,
- &feature_x87,
- },
-};
-
-pub const cpu_winchipC6 = Cpu{
- .name = "winchipC6",
- .llvm_name = "winchip-c6",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_winchip2 = Cpu{
- .name = "winchip2",
- .llvm_name = "winchip2",
- .dependencies = &[_]*const Feature {
- &feature_mmx,
- &feature_dnow3,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_x8664 = Cpu{
- .name = "x8664",
- .llvm_name = "x86-64",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_mmx,
- &feature_macrofusion,
- &feature_nopl,
- &feature_sse,
- &feature_sse2,
- &feature_slow3opsLea,
- &feature_slowIncdec,
- &feature_x87,
- },
-};
-
-pub const cpu_yonah = Cpu{
- .name = "yonah",
- .llvm_name = "yonah",
- .dependencies = &[_]*const Feature {
- &feature_cmov,
- &feature_cx8,
- &feature_fxsr,
- &feature_mmx,
- &feature_nopl,
- &feature_sse,
- &feature_sse3,
- &feature_slowUnalignedMem16,
- &feature_x87,
- },
-};
-
-pub const cpu_znver1 = Cpu{
- .name = "znver1",
- .llvm_name = "znver1",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_adx,
- &feature_sse,
- &feature_aes,
- &feature_avx2,
- &feature_bmi,
- &feature_bmi2,
- &feature_branchfusion,
- &feature_clflushopt,
- &feature_clzero,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fast15bytenop,
- &feature_fastBextr,
- &feature_fastLzcnt,
- &feature_fastScalarShiftMasks,
- &feature_sahf,
- &feature_lzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_mwaitx,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_prfchw,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_sha,
- &feature_sse4a,
- &feature_slowShld,
- &feature_x87,
- &feature_xsave,
- &feature_xsavec,
- &feature_xsaveopt,
- &feature_xsaves,
- },
-};
-
-pub const cpu_znver2 = Cpu{
- .name = "znver2",
- .llvm_name = "znver2",
- .dependencies = &[_]*const Feature {
- &feature_bit64,
- &feature_adx,
- &feature_sse,
- &feature_aes,
- &feature_avx2,
- &feature_bmi,
- &feature_bmi2,
- &feature_branchfusion,
- &feature_clflushopt,
- &feature_clwb,
- &feature_clzero,
- &feature_cmov,
- &feature_cx8,
- &feature_cx16,
- &feature_f16c,
- &feature_fma,
- &feature_fsgsbase,
- &feature_fxsr,
- &feature_fast15bytenop,
- &feature_fastBextr,
- &feature_fastLzcnt,
- &feature_fastScalarShiftMasks,
- &feature_sahf,
- &feature_lzcnt,
- &feature_mmx,
- &feature_movbe,
- &feature_mwaitx,
- &feature_nopl,
- &feature_pclmul,
- &feature_popcnt,
- &feature_prfchw,
- &feature_rdpid,
- &feature_rdrnd,
- &feature_rdseed,
- &feature_sha,
- &feature_sse4a,
- &feature_slowShld,
- &feature_wbnoinvd,
- &feature_x87,
- &feature_xsave,
- &feature_xsavec,
- &feature_xsaveopt,
- &feature_xsaves,
- },
-};
-
-pub const cpus = &[_]*const Cpu {
- &cpu_amdfam10,
- &cpu_athlon,
- &cpu_athlon4,
- &cpu_athlonFx,
- &cpu_athlonMp,
- &cpu_athlonTbird,
- &cpu_athlonXp,
- &cpu_athlon64,
- &cpu_athlon64Sse3,
- &cpu_atom,
- &cpu_barcelona,
- &cpu_bdver1,
- &cpu_bdver2,
- &cpu_bdver3,
- &cpu_bdver4,
- &cpu_bonnell,
- &cpu_broadwell,
- &cpu_btver1,
- &cpu_btver2,
- &cpu_c3,
- &cpu_c32,
- &cpu_cannonlake,
- &cpu_cascadelake,
- &cpu_cooperlake,
- &cpu_coreAvxI,
- &cpu_coreAvx2,
- &cpu_core2,
- &cpu_corei7,
- &cpu_corei7Avx,
- &cpu_generic,
- &cpu_geode,
- &cpu_goldmont,
- &cpu_goldmontPlus,
- &cpu_haswell,
- &cpu_i386,
- &cpu_i486,
- &cpu_i586,
- &cpu_i686,
- &cpu_icelakeClient,
- &cpu_icelakeServer,
- &cpu_ivybridge,
- &cpu_k6,
- &cpu_k62,
- &cpu_k63,
- &cpu_k8,
- &cpu_k8Sse3,
- &cpu_knl,
- &cpu_knm,
- &cpu_lakemont,
- &cpu_nehalem,
- &cpu_nocona,
- &cpu_opteron,
- &cpu_opteronSse3,
- &cpu_penryn,
- &cpu_pentium,
- &cpu_pentiumM,
- &cpu_pentiumMmx,
- &cpu_pentium2,
- &cpu_pentium3,
- &cpu_pentium3m,
- &cpu_pentium4,
- &cpu_pentium4m,
- &cpu_pentiumpro,
- &cpu_prescott,
- &cpu_sandybridge,
- &cpu_silvermont,
- &cpu_skx,
- &cpu_skylake,
- &cpu_skylakeAvx512,
- &cpu_slm,
- &cpu_tremont,
- &cpu_westmere,
- &cpu_winchipC6,
- &cpu_winchip2,
- &cpu_x8664,
- &cpu_yonah,
- &cpu_znver1,
- &cpu_znver2,
+const std = @import("../std.zig");
+const Cpu = std.Target.Cpu;
+
+pub const Feature = enum {
+ @"16bit_mode",
+ @"32bit_mode",
+ @"3dnow",
+ @"3dnowa",
+ @"64bit",
+ @"64bit_mode",
+ adx,
+ aes,
+ avx,
+ avx2,
+ avx512bf16,
+ avx512bitalg,
+ avx512bw,
+ avx512cd,
+ avx512dq,
+ avx512er,
+ avx512f,
+ avx512ifma,
+ avx512pf,
+ avx512vbmi,
+ avx512vbmi2,
+ avx512vl,
+ avx512vnni,
+ avx512vp2intersect,
+ avx512vpopcntdq,
+ bmi,
+ bmi2,
+ branchfusion,
+ cldemote,
+ clflushopt,
+ clwb,
+ clzero,
+ cmov,
+ cx16,
+ cx8,
+ enqcmd,
+ ermsb,
+ f16c,
+ false_deps_lzcnt_tzcnt,
+ false_deps_popcnt,
+ fast_11bytenop,
+ fast_15bytenop,
+ fast_bextr,
+ fast_gather,
+ fast_hops,
+ fast_lzcnt,
+ fast_partial_ymm_or_zmm_write,
+ fast_scalar_fsqrt,
+ fast_scalar_shift_masks,
+ fast_shld_rotate,
+ fast_variable_shuffle,
+ fast_vector_fsqrt,
+ fast_vector_shift_masks,
+ fma,
+ fma4,
+ fsgsbase,
+ fxsr,
+ gfni,
+ idivl_to_divb,
+ idivq_to_divl,
+ invpcid,
+ lea_sp,
+ lea_uses_ag,
+ lwp,
+ lzcnt,
+ macrofusion,
+ merge_to_threeway_branch,
+ mmx,
+ movbe,
+ movdir64b,
+ movdiri,
+ mpx,
+ mwaitx,
+ nopl,
+ pad_short_functions,
+ pclmul,
+ pconfig,
+ pku,
+ popcnt,
+ prefer_256_bit,
+ prefetchwt1,
+ prfchw,
+ ptwrite,
+ rdpid,
+ rdrnd,
+ rdseed,
+ retpoline,
+ retpoline_external_thunk,
+ retpoline_indirect_branches,
+ retpoline_indirect_calls,
+ rtm,
+ sahf,
+ sgx,
+ sha,
+ shstk,
+ slow_3ops_lea,
+ slow_incdec,
+ slow_lea,
+ slow_pmaddwd,
+ slow_pmulld,
+ slow_shld,
+ slow_two_mem_ops,
+ slow_unaligned_mem_16,
+ slow_unaligned_mem_32,
+ soft_float,
+ sse,
+ sse2,
+ sse3,
+ sse4_1,
+ sse4_2,
+ sse4a,
+ sse_unaligned_mem,
+ ssse3,
+ tbm,
+ vaes,
+ vpclmulqdq,
+ waitpkg,
+ wbnoinvd,
+ x87,
+ xop,
+ xsave,
+ xsavec,
+ xsaveopt,
+ xsaves,
+};
+
+pub usingnamespace Cpu.Feature.feature_set_fns(Feature);
+
+pub const all_features = blk: {
+ const len = @typeInfo(Feature).Enum.fields.len;
+ std.debug.assert(len <= @typeInfo(Cpu.Feature.Set).Int.bits);
+ var result: [len]Cpu.Feature = undefined;
+
+ result[@enumToInt(Feature.@"16bit_mode")] = .{
+ .index = @enumToInt(Feature.@"16bit_mode"),
+ .name = @tagName(Feature.@"16bit_mode"),
+ .llvm_name = "16bit-mode",
+ .description = "16-bit mode (i8086)",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.@"32bit_mode")] = .{
+ .index = @enumToInt(Feature.@"32bit_mode"),
+ .name = @tagName(Feature.@"32bit_mode"),
+ .llvm_name = "32bit-mode",
+ .description = "32-bit mode (80386)",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.@"3dnow")] = .{
+ .index = @enumToInt(Feature.@"3dnow"),
+ .name = @tagName(Feature.@"3dnow"),
+ .llvm_name = "3dnow",
+ .description = "Enable 3DNow! instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ }),
+ };
+
+ result[@enumToInt(Feature.@"3dnowa")] = .{
+ .index = @enumToInt(Feature.@"3dnowa"),
+ .name = @tagName(Feature.@"3dnowa"),
+ .llvm_name = "3dnowa",
+ .description = "Enable 3DNow! Athlon instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ }),
+ };
+
+ result[@enumToInt(Feature.@"64bit")] = .{
+ .index = @enumToInt(Feature.@"64bit"),
+ .name = @tagName(Feature.@"64bit"),
+ .llvm_name = "64bit",
+ .description = "Support 64-bit instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.@"64bit_mode")] = .{
+ .index = @enumToInt(Feature.@"64bit_mode"),
+ .name = @tagName(Feature.@"64bit_mode"),
+ .llvm_name = "64bit-mode",
+ .description = "64-bit mode (x86_64)",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.adx)] = .{
+ .index = @enumToInt(Feature.adx),
+ .name = @tagName(Feature.adx),
+ .llvm_name = "adx",
+ .description = "Support ADX instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+
+ result[@enumToInt(Feature.aes)] = .{
+ .index = @enumToInt(Feature.aes),
+ .name = @tagName(Feature.aes),
+ .llvm_name = "aes",
+ .description = "Enable AES instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.avx)] = .{
+ .index = @enumToInt(Feature.avx),
+ .name = @tagName(Feature.avx),
+ .llvm_name = "avx",
+ .description = "Enable AVX instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.avx2)] = .{
+ .index = @enumToInt(Feature.avx2),
+ .name = @tagName(Feature.avx2),
+ .llvm_name = "avx2",
+ .description = "Enable AVX2 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.avx512f)] = .{
+ .index = @enumToInt(Feature.avx512f),
+ .name = @tagName(Feature.avx512f),
+ .llvm_name = "avx512f",
+ .description = "Enable AVX-512 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.avx512bf16)] = .{
+ .index = @enumToInt(Feature.avx512bf16),
+ .name = @tagName(Feature.avx512bf16),
+ .llvm_name = "avx512bf16",
+ .description = "Support bfloat16 floating point",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.avx512bitalg)] = .{
+ .index = @enumToInt(Feature.avx512bitalg),
+ .name = @tagName(Feature.avx512bitalg),
+ .llvm_name = "avx512bitalg",
+ .description = "Enable AVX-512 Bit Algorithms",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.bmi)] = .{
+ .index = @enumToInt(Feature.bmi),
+ .name = @tagName(Feature.bmi),
+ .llvm_name = "bmi",
+ .description = "Support BMI instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+
+ result[@enumToInt(Feature.bmi2)] = .{
+ .index = @enumToInt(Feature.bmi2),
+ .name = @tagName(Feature.bmi2),
+ .llvm_name = "bmi2",
+ .description = "Support BMI2 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+
+ result[@enumToInt(Feature.avx512bw)] = .{
+ .index = @enumToInt(Feature.avx512bw),
+ .name = @tagName(Feature.avx512bw),
+ .llvm_name = "avx512bw",
+ .description = "Enable AVX-512 Byte and Word Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.branchfusion)] = .{
+ .index = @enumToInt(Feature.branchfusion),
+ .name = @tagName(Feature.branchfusion),
+ .llvm_name = "branchfusion",
+ .description = "CMP/TEST can be fused with conditional branches",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+
+ result[@enumToInt(Feature.avx512cd)] = .{
+ .index = @enumToInt(Feature.avx512cd),
+ .name = @tagName(Feature.avx512cd),
+ .llvm_name = "avx512cd",
+ .description = "Enable AVX-512 Conflict Detection Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.cldemote)] = .{
+ .index = @enumToInt(Feature.cldemote),
+ .name = @tagName(Feature.cldemote),
+ .llvm_name = "cldemote",
+ .description = "Enable Cache Demote",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+
+ result[@enumToInt(Feature.clflushopt)] = .{
+ .index = @enumToInt(Feature.clflushopt),
+ .name = @tagName(Feature.clflushopt),
+ .llvm_name = "clflushopt",
+ .description = "Flush A Cache Line Optimized",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+
+ result[@enumToInt(Feature.clwb)] = .{
+ .index = @enumToInt(Feature.clwb),
+ .name = @tagName(Feature.clwb),
+ .llvm_name = "clwb",
+ .description = "Cache Line Write Back",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+
+ result[@enumToInt(Feature.clzero)] = .{
+ .index = @enumToInt(Feature.clzero),
+ .name = @tagName(Feature.clzero),
+ .llvm_name = "clzero",
+ .description = "Enable Cache Line Zero",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+
+ result[@enumToInt(Feature.cmov)] = .{
+ .index = @enumToInt(Feature.cmov),
+ .name = @tagName(Feature.cmov),
+ .llvm_name = "cmov",
+ .description = "Enable conditional move instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+
+ result[@enumToInt(Feature.cx8)] = .{
+ .index = @enumToInt(Feature.cx8),
+ .name = @tagName(Feature.cx8),
+ .llvm_name = "cx8",
+ .description = "Support CMPXCHG8B instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+
+ result[@enumToInt(Feature.cx16)] = .{
+ .index = @enumToInt(Feature.cx16),
+ .name = @tagName(Feature.cx16),
+ .llvm_name = "cx16",
+ .description = "64-bit with cmpxchg16b",
+ .dependencies = featureSet(&[_]Feature{
+ .cx8,
+ }),
+ };
+
+ result[@enumToInt(Feature.avx512dq)] = .{
+ .index = @enumToInt(Feature.avx512dq),
+ .name = @tagName(Feature.avx512dq),
+ .llvm_name = "avx512dq",
+ .description = "Enable AVX-512 Doubleword and Quadword Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.enqcmd)] = .{
+ .index = @enumToInt(Feature.enqcmd),
+ .name = @tagName(Feature.enqcmd),
+ .llvm_name = "enqcmd",
+ .description = "Has ENQCMD instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.avx512er)] = .{
+ .index = @enumToInt(Feature.avx512er),
+ .name = @tagName(Feature.avx512er),
+ .llvm_name = "avx512er",
+ .description = "Enable AVX-512 Exponential and Reciprocal Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.ermsb)] = .{
+ .index = @enumToInt(Feature.ermsb),
+ .name = @tagName(Feature.ermsb),
+ .llvm_name = "ermsb",
+ .description = "REP MOVS/STOS are fast",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.f16c)] = .{
+ .index = @enumToInt(Feature.f16c),
+ .name = @tagName(Feature.f16c),
+ .llvm_name = "f16c",
+ .description = "Support 16-bit floating point conversion instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.fma)] = .{
+ .index = @enumToInt(Feature.fma),
+ .name = @tagName(Feature.fma),
+ .llvm_name = "fma",
+ .description = "Enable three-operand fused multiple-add",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.fma4)] = .{
+ .index = @enumToInt(Feature.fma4),
+ .name = @tagName(Feature.fma4),
+ .llvm_name = "fma4",
+ .description = "Enable four-operand fused multiple-add",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.fsgsbase)] = .{
+ .index = @enumToInt(Feature.fsgsbase),
+ .name = @tagName(Feature.fsgsbase),
+ .llvm_name = "fsgsbase",
+ .description = "Support FS/GS Base instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.fxsr)] = .{
+ .index = @enumToInt(Feature.fxsr),
+ .name = @tagName(Feature.fxsr),
+ .llvm_name = "fxsr",
+ .description = "Support fxsave/fxrestore instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.fast_11bytenop)] = .{
+ .index = @enumToInt(Feature.fast_11bytenop),
+ .name = @tagName(Feature.fast_11bytenop),
+ .llvm_name = "fast-11bytenop",
+ .description = "Target can quickly decode up to 11 byte NOPs",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.fast_15bytenop)] = .{
+ .index = @enumToInt(Feature.fast_15bytenop),
+ .name = @tagName(Feature.fast_15bytenop),
+ .llvm_name = "fast-15bytenop",
+ .description = "Target can quickly decode up to 15 byte NOPs",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.fast_bextr)] = .{
+ .index = @enumToInt(Feature.fast_bextr),
+ .name = @tagName(Feature.fast_bextr),
+ .llvm_name = "fast-bextr",
+ .description = "Indicates that the BEXTR instruction is implemented as a single uop with good throughput",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.fast_hops)] = .{
+ .index = @enumToInt(Feature.fast_hops),
+ .name = @tagName(Feature.fast_hops),
+ .llvm_name = "fast-hops",
+ .description = "Prefer horizontal vector math instructions (haddp, phsub, etc.) over normal vector instructions with shuffles",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.fast_lzcnt)] = .{
+ .index = @enumToInt(Feature.fast_lzcnt),
+ .name = @tagName(Feature.fast_lzcnt),
+ .llvm_name = "fast-lzcnt",
+ .description = "LZCNT instructions are as fast as most simple integer ops",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.fast_partial_ymm_or_zmm_write)] = .{
+ .index = @enumToInt(Feature.fast_partial_ymm_or_zmm_write),
+ .name = @tagName(Feature.fast_partial_ymm_or_zmm_write),
+ .llvm_name = "fast-partial-ymm-or-zmm-write",
+ .description = "Partial writes to YMM/ZMM registers are fast",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.fast_shld_rotate)] = .{
+ .index = @enumToInt(Feature.fast_shld_rotate),
+ .name = @tagName(Feature.fast_shld_rotate),
+ .llvm_name = "fast-shld-rotate",
+ .description = "SHLD can be used as a faster rotate",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.fast_scalar_fsqrt)] = .{
+ .index = @enumToInt(Feature.fast_scalar_fsqrt),
+ .name = @tagName(Feature.fast_scalar_fsqrt),
+ .llvm_name = "fast-scalar-fsqrt",
+ .description = "Scalar SQRT is fast (disable Newton-Raphson)",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.fast_scalar_shift_masks)] = .{
+ .index = @enumToInt(Feature.fast_scalar_shift_masks),
+ .name = @tagName(Feature.fast_scalar_shift_masks),
+ .llvm_name = "fast-scalar-shift-masks",
+ .description = "Prefer a left/right scalar logical shift pair over a shift+and pair",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.fast_variable_shuffle)] = .{
+ .index = @enumToInt(Feature.fast_variable_shuffle),
+ .name = @tagName(Feature.fast_variable_shuffle),
+ .llvm_name = "fast-variable-shuffle",
+ .description = "Shuffles with variable masks are fast",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.fast_vector_fsqrt)] = .{
+ .index = @enumToInt(Feature.fast_vector_fsqrt),
+ .name = @tagName(Feature.fast_vector_fsqrt),
+ .llvm_name = "fast-vector-fsqrt",
+ .description = "Vector SQRT is fast (disable Newton-Raphson)",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.fast_vector_shift_masks)] = .{
+ .index = @enumToInt(Feature.fast_vector_shift_masks),
+ .name = @tagName(Feature.fast_vector_shift_masks),
+ .llvm_name = "fast-vector-shift-masks",
+ .description = "Prefer a left/right vector logical shift pair over a shift+and pair",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.gfni)] = .{
+ .index = @enumToInt(Feature.gfni),
+ .name = @tagName(Feature.gfni),
+ .llvm_name = "gfni",
+ .description = "Enable Galois Field Arithmetic Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.fast_gather)] = .{
+ .index = @enumToInt(Feature.fast_gather),
+ .name = @tagName(Feature.fast_gather),
+ .llvm_name = "fast-gather",
+ .description = "Indicates if gather is reasonably fast",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.avx512ifma)] = .{
+ .index = @enumToInt(Feature.avx512ifma),
+ .name = @tagName(Feature.avx512ifma),
+ .llvm_name = "avx512ifma",
+ .description = "Enable AVX-512 Integer Fused Multiple-Add",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.invpcid)] = .{
+ .index = @enumToInt(Feature.invpcid),
+ .name = @tagName(Feature.invpcid),
+ .llvm_name = "invpcid",
+ .description = "Invalidate Process-Context Identifier",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.sahf)] = .{
+ .index = @enumToInt(Feature.sahf),
+ .name = @tagName(Feature.sahf),
+ .llvm_name = "sahf",
+ .description = "Support LAHF and SAHF instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.lea_sp)] = .{
+ .index = @enumToInt(Feature.lea_sp),
+ .name = @tagName(Feature.lea_sp),
+ .llvm_name = "lea-sp",
+ .description = "Use LEA for adjusting the stack pointer",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.lea_uses_ag)] = .{
+ .index = @enumToInt(Feature.lea_uses_ag),
+ .name = @tagName(Feature.lea_uses_ag),
+ .llvm_name = "lea-uses-ag",
+ .description = "LEA instruction needs inputs at AG stage",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.lwp)] = .{
+ .index = @enumToInt(Feature.lwp),
+ .name = @tagName(Feature.lwp),
+ .llvm_name = "lwp",
+ .description = "Enable LWP instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.lzcnt)] = .{
+ .index = @enumToInt(Feature.lzcnt),
+ .name = @tagName(Feature.lzcnt),
+ .llvm_name = "lzcnt",
+ .description = "Support LZCNT instruction",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.false_deps_lzcnt_tzcnt)] = .{
+ .index = @enumToInt(Feature.false_deps_lzcnt_tzcnt),
+ .name = @tagName(Feature.false_deps_lzcnt_tzcnt),
+ .llvm_name = "false-deps-lzcnt-tzcnt",
+ .description = "LZCNT/TZCNT have a false dependency on dest register",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.mmx)] = .{
+ .index = @enumToInt(Feature.mmx),
+ .name = @tagName(Feature.mmx),
+ .llvm_name = "mmx",
+ .description = "Enable MMX instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.movbe)] = .{
+ .index = @enumToInt(Feature.movbe),
+ .name = @tagName(Feature.movbe),
+ .llvm_name = "movbe",
+ .description = "Support MOVBE instruction",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.movdir64b)] = .{
+ .index = @enumToInt(Feature.movdir64b),
+ .name = @tagName(Feature.movdir64b),
+ .llvm_name = "movdir64b",
+ .description = "Support movdir64b instruction",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.movdiri)] = .{
+ .index = @enumToInt(Feature.movdiri),
+ .name = @tagName(Feature.movdiri),
+ .llvm_name = "movdiri",
+ .description = "Support movdiri instruction",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.mpx)] = .{
+ .index = @enumToInt(Feature.mpx),
+ .name = @tagName(Feature.mpx),
+ .llvm_name = "mpx",
+ .description = "Support MPX instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.mwaitx)] = .{
+ .index = @enumToInt(Feature.mwaitx),
+ .name = @tagName(Feature.mwaitx),
+ .llvm_name = "mwaitx",
+ .description = "Enable MONITORX/MWAITX timer functionality",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.macrofusion)] = .{
+ .index = @enumToInt(Feature.macrofusion),
+ .name = @tagName(Feature.macrofusion),
+ .llvm_name = "macrofusion",
+ .description = "Various instructions can be fused with conditional branches",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.merge_to_threeway_branch)] = .{
+ .index = @enumToInt(Feature.merge_to_threeway_branch),
+ .name = @tagName(Feature.merge_to_threeway_branch),
+ .llvm_name = "merge-to-threeway-branch",
+ .description = "Merge branches to a three-way conditional branch",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.nopl)] = .{
+ .index = @enumToInt(Feature.nopl),
+ .name = @tagName(Feature.nopl),
+ .llvm_name = "nopl",
+ .description = "Enable NOPL instruction",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.pclmul)] = .{
+ .index = @enumToInt(Feature.pclmul),
+ .name = @tagName(Feature.pclmul),
+ .llvm_name = "pclmul",
+ .description = "Enable packed carry-less multiplication instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.pconfig)] = .{
+ .index = @enumToInt(Feature.pconfig),
+ .name = @tagName(Feature.pconfig),
+ .llvm_name = "pconfig",
+ .description = "platform configuration instruction",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.avx512pf)] = .{
+ .index = @enumToInt(Feature.avx512pf),
+ .name = @tagName(Feature.avx512pf),
+ .llvm_name = "avx512pf",
+ .description = "Enable AVX-512 PreFetch Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.pku)] = .{
+ .index = @enumToInt(Feature.pku),
+ .name = @tagName(Feature.pku),
+ .llvm_name = "pku",
+ .description = "Enable protection keys",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.popcnt)] = .{
+ .index = @enumToInt(Feature.popcnt),
+ .name = @tagName(Feature.popcnt),
+ .llvm_name = "popcnt",
+ .description = "Support POPCNT instruction",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.false_deps_popcnt)] = .{
+ .index = @enumToInt(Feature.false_deps_popcnt),
+ .name = @tagName(Feature.false_deps_popcnt),
+ .llvm_name = "false-deps-popcnt",
+ .description = "POPCNT has a false dependency on dest register",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.prefetchwt1)] = .{
+ .index = @enumToInt(Feature.prefetchwt1),
+ .name = @tagName(Feature.prefetchwt1),
+ .llvm_name = "prefetchwt1",
+ .description = "Prefetch with Intent to Write and T1 Hint",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.prfchw)] = .{
+ .index = @enumToInt(Feature.prfchw),
+ .name = @tagName(Feature.prfchw),
+ .llvm_name = "prfchw",
+ .description = "Support PRFCHW instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.ptwrite)] = .{
+ .index = @enumToInt(Feature.ptwrite),
+ .name = @tagName(Feature.ptwrite),
+ .llvm_name = "ptwrite",
+ .description = "Support ptwrite instruction",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.pad_short_functions)] = .{
+ .index = @enumToInt(Feature.pad_short_functions),
+ .name = @tagName(Feature.pad_short_functions),
+ .llvm_name = "pad-short-functions",
+ .description = "Pad short functions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.prefer_256_bit)] = .{
+ .index = @enumToInt(Feature.prefer_256_bit),
+ .name = @tagName(Feature.prefer_256_bit),
+ .llvm_name = "prefer-256-bit",
+ .description = "Prefer 256-bit AVX instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.rdpid)] = .{
+ .index = @enumToInt(Feature.rdpid),
+ .name = @tagName(Feature.rdpid),
+ .llvm_name = "rdpid",
+ .description = "Support RDPID instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.rdrnd)] = .{
+ .index = @enumToInt(Feature.rdrnd),
+ .name = @tagName(Feature.rdrnd),
+ .llvm_name = "rdrnd",
+ .description = "Support RDRAND instruction",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.rdseed)] = .{
+ .index = @enumToInt(Feature.rdseed),
+ .name = @tagName(Feature.rdseed),
+ .llvm_name = "rdseed",
+ .description = "Support RDSEED instruction",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.rtm)] = .{
+ .index = @enumToInt(Feature.rtm),
+ .name = @tagName(Feature.rtm),
+ .llvm_name = "rtm",
+ .description = "Support RTM instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.retpoline)] = .{
+ .index = @enumToInt(Feature.retpoline),
+ .name = @tagName(Feature.retpoline),
+ .llvm_name = "retpoline",
+ .description = "Remove speculation of indirect branches from the generated code, either by avoiding them entirely or lowering them with a speculation blocking construct",
+ .dependencies = featureSet(&[_]Feature{
+ .retpoline_indirect_calls,
+ .retpoline_indirect_branches,
+ }),
+ };
+
+ result[@enumToInt(Feature.retpoline_external_thunk)] = .{
+ .index = @enumToInt(Feature.retpoline_external_thunk),
+ .name = @tagName(Feature.retpoline_external_thunk),
+ .llvm_name = "retpoline-external-thunk",
+ .description = "When lowering an indirect call or branch using a `retpoline`, rely on the specified user provided thunk rather than emitting one ourselves. Only has effect when combined with some other retpoline feature",
+ .dependencies = featureSet(&[_]Feature{
+ .retpoline_indirect_calls,
+ }),
+ };
+
+ result[@enumToInt(Feature.retpoline_indirect_branches)] = .{
+ .index = @enumToInt(Feature.retpoline_indirect_branches),
+ .name = @tagName(Feature.retpoline_indirect_branches),
+ .llvm_name = "retpoline-indirect-branches",
+ .description = "Remove speculation of indirect branches from the generated code",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.retpoline_indirect_calls)] = .{
+ .index = @enumToInt(Feature.retpoline_indirect_calls),
+ .name = @tagName(Feature.retpoline_indirect_calls),
+ .llvm_name = "retpoline-indirect-calls",
+ .description = "Remove speculation of indirect calls from the generated code",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.sgx)] = .{
+ .index = @enumToInt(Feature.sgx),
+ .name = @tagName(Feature.sgx),
+ .llvm_name = "sgx",
+ .description = "Enable Software Guard Extensions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.sha)] = .{
+ .index = @enumToInt(Feature.sha),
+ .name = @tagName(Feature.sha),
+ .llvm_name = "sha",
+ .description = "Enable SHA instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.shstk)] = .{
+ .index = @enumToInt(Feature.shstk),
+ .name = @tagName(Feature.shstk),
+ .llvm_name = "shstk",
+ .description = "Support CET Shadow-Stack instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.sse)] = .{
+ .index = @enumToInt(Feature.sse),
+ .name = @tagName(Feature.sse),
+ .llvm_name = "sse",
+ .description = "Enable SSE instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.sse2)] = .{
+ .index = @enumToInt(Feature.sse2),
+ .name = @tagName(Feature.sse2),
+ .llvm_name = "sse2",
+ .description = "Enable SSE2 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.sse3)] = .{
+ .index = @enumToInt(Feature.sse3),
+ .name = @tagName(Feature.sse3),
+ .llvm_name = "sse3",
+ .description = "Enable SSE3 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.sse4a)] = .{
+ .index = @enumToInt(Feature.sse4a),
+ .name = @tagName(Feature.sse4a),
+ .llvm_name = "sse4a",
+ .description = "Support SSE 4a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.sse4_1)] = .{
+ .index = @enumToInt(Feature.sse4_1),
+ .name = @tagName(Feature.sse4_1),
+ .llvm_name = "sse4.1",
+ .description = "Enable SSE 4.1 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.sse4_2)] = .{
+ .index = @enumToInt(Feature.sse4_2),
+ .name = @tagName(Feature.sse4_2),
+ .llvm_name = "sse4.2",
+ .description = "Enable SSE 4.2 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.sse_unaligned_mem)] = .{
+ .index = @enumToInt(Feature.sse_unaligned_mem),
+ .name = @tagName(Feature.sse_unaligned_mem),
+ .llvm_name = "sse-unaligned-mem",
+ .description = "Allow unaligned memory operands with SSE instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.ssse3)] = .{
+ .index = @enumToInt(Feature.ssse3),
+ .name = @tagName(Feature.ssse3),
+ .llvm_name = "ssse3",
+ .description = "Enable SSSE3 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.slow_3ops_lea)] = .{
+ .index = @enumToInt(Feature.slow_3ops_lea),
+ .name = @tagName(Feature.slow_3ops_lea),
+ .llvm_name = "slow-3ops-lea",
+ .description = "LEA instruction with 3 ops or certain registers is slow",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.idivl_to_divb)] = .{
+ .index = @enumToInt(Feature.idivl_to_divb),
+ .name = @tagName(Feature.idivl_to_divb),
+ .llvm_name = "idivl-to-divb",
+ .description = "Use 8-bit divide for positive values less than 256",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.idivq_to_divl)] = .{
+ .index = @enumToInt(Feature.idivq_to_divl),
+ .name = @tagName(Feature.idivq_to_divl),
+ .llvm_name = "idivq-to-divl",
+ .description = "Use 32-bit divide for positive values less than 2^32",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.slow_incdec)] = .{
+ .index = @enumToInt(Feature.slow_incdec),
+ .name = @tagName(Feature.slow_incdec),
+ .llvm_name = "slow-incdec",
+ .description = "INC and DEC instructions are slower than ADD and SUB",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.slow_lea)] = .{
+ .index = @enumToInt(Feature.slow_lea),
+ .name = @tagName(Feature.slow_lea),
+ .llvm_name = "slow-lea",
+ .description = "LEA instruction with certain arguments is slow",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.slow_pmaddwd)] = .{
+ .index = @enumToInt(Feature.slow_pmaddwd),
+ .name = @tagName(Feature.slow_pmaddwd),
+ .llvm_name = "slow-pmaddwd",
+ .description = "PMADDWD is slower than PMULLD",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.slow_pmulld)] = .{
+ .index = @enumToInt(Feature.slow_pmulld),
+ .name = @tagName(Feature.slow_pmulld),
+ .llvm_name = "slow-pmulld",
+ .description = "PMULLD instruction is slow",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.slow_shld)] = .{
+ .index = @enumToInt(Feature.slow_shld),
+ .name = @tagName(Feature.slow_shld),
+ .llvm_name = "slow-shld",
+ .description = "SHLD instruction is slow",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.slow_two_mem_ops)] = .{
+ .index = @enumToInt(Feature.slow_two_mem_ops),
+ .name = @tagName(Feature.slow_two_mem_ops),
+ .llvm_name = "slow-two-mem-ops",
+ .description = "Two memory operand instructions are slow",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.slow_unaligned_mem_16)] = .{
+ .index = @enumToInt(Feature.slow_unaligned_mem_16),
+ .name = @tagName(Feature.slow_unaligned_mem_16),
+ .llvm_name = "slow-unaligned-mem-16",
+ .description = "Slow unaligned 16-byte memory access",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.slow_unaligned_mem_32)] = .{
+ .index = @enumToInt(Feature.slow_unaligned_mem_32),
+ .name = @tagName(Feature.slow_unaligned_mem_32),
+ .llvm_name = "slow-unaligned-mem-32",
+ .description = "Slow unaligned 32-byte memory access",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.soft_float)] = .{
+ .index = @enumToInt(Feature.soft_float),
+ .name = @tagName(Feature.soft_float),
+ .llvm_name = "soft-float",
+ .description = "Use software floating point features",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.tbm)] = .{
+ .index = @enumToInt(Feature.tbm),
+ .name = @tagName(Feature.tbm),
+ .llvm_name = "tbm",
+ .description = "Enable TBM instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.vaes)] = .{
+ .index = @enumToInt(Feature.vaes),
+ .name = @tagName(Feature.vaes),
+ .llvm_name = "vaes",
+ .description = "Promote selected AES instructions to AVX512/AVX registers",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.avx512vbmi)] = .{
+ .index = @enumToInt(Feature.avx512vbmi),
+ .name = @tagName(Feature.avx512vbmi),
+ .llvm_name = "avx512vbmi",
+ .description = "Enable AVX-512 Vector Byte Manipulation Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.avx512vbmi2)] = .{
+ .index = @enumToInt(Feature.avx512vbmi2),
+ .name = @tagName(Feature.avx512vbmi2),
+ .llvm_name = "avx512vbmi2",
+ .description = "Enable AVX-512 further Vector Byte Manipulation Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.avx512vl)] = .{
+ .index = @enumToInt(Feature.avx512vl),
+ .name = @tagName(Feature.avx512vl),
+ .llvm_name = "avx512vl",
+ .description = "Enable AVX-512 Vector Length eXtensions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.avx512vnni)] = .{
+ .index = @enumToInt(Feature.avx512vnni),
+ .name = @tagName(Feature.avx512vnni),
+ .llvm_name = "avx512vnni",
+ .description = "Enable AVX-512 Vector Neural Network Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.avx512vp2intersect)] = .{
+ .index = @enumToInt(Feature.avx512vp2intersect),
+ .name = @tagName(Feature.avx512vp2intersect),
+ .llvm_name = "avx512vp2intersect",
+ .description = "Enable AVX-512 vp2intersect",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.vpclmulqdq)] = .{
+ .index = @enumToInt(Feature.vpclmulqdq),
+ .name = @tagName(Feature.vpclmulqdq),
+ .llvm_name = "vpclmulqdq",
+ .description = "Enable vpclmulqdq instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.avx512vpopcntdq)] = .{
+ .index = @enumToInt(Feature.avx512vpopcntdq),
+ .name = @tagName(Feature.avx512vpopcntdq),
+ .llvm_name = "avx512vpopcntdq",
+ .description = "Enable AVX-512 Population Count Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.waitpkg)] = .{
+ .index = @enumToInt(Feature.waitpkg),
+ .name = @tagName(Feature.waitpkg),
+ .llvm_name = "waitpkg",
+ .description = "Wait and pause enhancements",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.wbnoinvd)] = .{
+ .index = @enumToInt(Feature.wbnoinvd),
+ .name = @tagName(Feature.wbnoinvd),
+ .llvm_name = "wbnoinvd",
+ .description = "Write Back No Invalidate",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.x87)] = .{
+ .index = @enumToInt(Feature.x87),
+ .name = @tagName(Feature.x87),
+ .llvm_name = "x87",
+ .description = "Enable X87 float instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.xop)] = .{
+ .index = @enumToInt(Feature.xop),
+ .name = @tagName(Feature.xop),
+ .llvm_name = "xop",
+ .description = "Enable XOP instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+
+ result[@enumToInt(Feature.xsave)] = .{
+ .index = @enumToInt(Feature.xsave),
+ .name = @tagName(Feature.xsave),
+ .llvm_name = "xsave",
+ .description = "Support xsave instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.xsavec)] = .{
+ .index = @enumToInt(Feature.xsavec),
+ .name = @tagName(Feature.xsavec),
+ .llvm_name = "xsavec",
+ .description = "Support xsavec instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.xsaveopt)] = .{
+ .index = @enumToInt(Feature.xsaveopt),
+ .name = @tagName(Feature.xsaveopt),
+ .llvm_name = "xsaveopt",
+ .description = "Support xsaveopt instructions",
+ .dependencies = 0,
+ };
+
+ result[@enumToInt(Feature.xsaves)] = .{
+ .index = @enumToInt(Feature.xsaves),
+ .name = @tagName(Feature.xsaves),
+ .llvm_name = "xsaves",
+ .description = "Support xsaves instructions",
+ .dependencies = 0,
+ };
+
+ break :blk result;
+};
+
+pub const cpu = struct {
+ pub const amdfam10 = Cpu{
+ .name = "amdfam10",
+ .llvm_name = "amdfam10",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnowa3,
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .fast_scalar_shift_masks,
+ .sahf,
+ .lzcnt,
+ .nopl,
+ .popcnt,
+ .sse,
+ .sse4a,
+ .slow_shld,
+ .x87,
+ }),
+ };
+
+ pub const athlon = Cpu{
+ .name = "athlon",
+ .llvm_name = "athlon",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnowa3,
+ .cmov,
+ .cx8,
+ .nopl,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const athlon4 = Cpu{
+ .name = "athlon_4",
+ .llvm_name = "athlon-4",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnowa3,
+ .cmov,
+ .cx8,
+ .fxsr,
+ .nopl,
+ .sse,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const athlon_fx = Cpu{
+ .name = "athlon_fx",
+ .llvm_name = "athlon-fx",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnowa3,
+ .bit64,
+ .cmov,
+ .cx8,
+ .fxsr,
+ .fast_scalar_shift_masks,
+ .nopl,
+ .sse,
+ .sse2,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const athlon_mp = Cpu{
+ .name = "athlon_mp",
+ .llvm_name = "athlon-mp",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnowa3,
+ .cmov,
+ .cx8,
+ .fxsr,
+ .nopl,
+ .sse,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const athlon_tbird = Cpu{
+ .name = "athlon_tbird",
+ .llvm_name = "athlon-tbird",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnowa3,
+ .cmov,
+ .cx8,
+ .nopl,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const athlon_xp = Cpu{
+ .name = "athlon_xp",
+ .llvm_name = "athlon-xp",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnowa3,
+ .cmov,
+ .cx8,
+ .fxsr,
+ .nopl,
+ .sse,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const athlon64 = Cpu{
+ .name = "athlon64",
+ .llvm_name = "athlon64",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnowa3,
+ .bit64,
+ .cmov,
+ .cx8,
+ .fxsr,
+ .fast_scalar_shift_masks,
+ .nopl,
+ .sse,
+ .sse2,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const athlon64_sse3 = Cpu{
+ .name = "athlon64_sse3",
+ .llvm_name = "athlon64-sse3",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnowa3,
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .fast_scalar_shift_masks,
+ .nopl,
+ .sse,
+ .sse3,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const atom = Cpu{
+ .name = "atom",
+ .llvm_name = "atom",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .sahf,
+ .lea_sp,
+ .lea_uses_ag,
+ .mmx,
+ .movbe,
+ .nopl,
+ .pad_short_functions,
+ .sse,
+ .ssse3,
+ .idivl_to_divb,
+ .idivq_to_divl,
+ .slow_two_mem_ops,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const barcelona = Cpu{
+ .name = "barcelona",
+ .llvm_name = "barcelona",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnowa3,
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .fast_scalar_shift_masks,
+ .sahf,
+ .lzcnt,
+ .nopl,
+ .popcnt,
+ .sse,
+ .sse4a,
+ .slow_shld,
+ .x87,
+ }),
+ };
+
+ pub const bdver1 = Cpu{
+ .name = "bdver1",
+ .llvm_name = "bdver1",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .sse,
+ .aes,
+ .branchfusion,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .fast11bytenop,
+ .fast_scalar_shift_masks,
+ .sahf,
+ .lwp,
+ .lzcnt,
+ .mmx,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .slow_shld,
+ .x87,
+ .xop,
+ .xsave,
+ }),
+ };
+
+ pub const bdver2 = Cpu{
+ .name = "bdver2",
+ .llvm_name = "bdver2",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .sse,
+ .aes,
+ .bmi,
+ .branchfusion,
+ .cmov,
+ .cx8,
+ .cx16,
+ .f16c,
+ .fma,
+ .fxsr,
+ .fast11bytenop,
+ .fast_bextr,
+ .fast_scalar_shift_masks,
+ .sahf,
+ .lwp,
+ .lzcnt,
+ .mmx,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .slow_shld,
+ .tbm,
+ .x87,
+ .xop,
+ .xsave,
+ }),
+ };
+
+ pub const bdver3 = Cpu{
+ .name = "bdver3",
+ .llvm_name = "bdver3",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .sse,
+ .aes,
+ .bmi,
+ .branchfusion,
+ .cmov,
+ .cx8,
+ .cx16,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast11bytenop,
+ .fast_bextr,
+ .fast_scalar_shift_masks,
+ .sahf,
+ .lwp,
+ .lzcnt,
+ .mmx,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .slow_shld,
+ .tbm,
+ .x87,
+ .xop,
+ .xsave,
+ .xsaveopt,
+ }),
+ };
+
+ pub const bdver4 = Cpu{
+ .name = "bdver4",
+ .llvm_name = "bdver4",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .sse,
+ .aes,
+ .avx2,
+ .bmi,
+ .bmi2,
+ .branchfusion,
+ .cmov,
+ .cx8,
+ .cx16,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast11bytenop,
+ .fast_bextr,
+ .fast_scalar_shift_masks,
+ .sahf,
+ .lwp,
+ .lzcnt,
+ .mmx,
+ .mwaitx,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .slow_shld,
+ .tbm,
+ .x87,
+ .xop,
+ .xsave,
+ .xsaveopt,
+ }),
+ };
+
+ pub const bonnell = Cpu{
+ .name = "bonnell",
+ .llvm_name = "bonnell",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .sahf,
+ .lea_sp,
+ .lea_uses_ag,
+ .mmx,
+ .movbe,
+ .nopl,
+ .pad_short_functions,
+ .sse,
+ .ssse3,
+ .idivl_to_divb,
+ .idivq_to_divl,
+ .slow_two_mem_ops,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const broadwell = Cpu{
+ .name = "broadwell",
+ .llvm_name = "broadwell",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .adx,
+ .sse,
+ .avx,
+ .avx2,
+ .bmi,
+ .bmi2,
+ .cmov,
+ .cx8,
+ .cx16,
+ .ermsb,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast_shld_rotate,
+ .fast_scalar_fsqrt,
+ .fast_variable_shuffle,
+ .invpcid,
+ .sahf,
+ .lzcnt,
+ .false_deps_lzcnt_tzcnt,
+ .mmx,
+ .movbe,
+ .macrofusion,
+ .merge_to_threeway_branch,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .false_deps_popcnt,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sse42,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .x87,
+ .xsave,
+ .xsaveopt,
+ }),
+ };
+
+ pub const btver1 = Cpu{
+ .name = "btver1",
+ .llvm_name = "btver1",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .fast15bytenop,
+ .fast_scalar_shift_masks,
+ .fast_vector_shift_masks,
+ .sahf,
+ .lzcnt,
+ .mmx,
+ .nopl,
+ .popcnt,
+ .prfchw,
+ .sse,
+ .sse4a,
+ .ssse3,
+ .slow_shld,
+ .x87,
+ }),
+ };
+
+ pub const btver2 = Cpu{
+ .name = "btver2",
+ .llvm_name = "btver2",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .sse,
+ .aes,
+ .avx,
+ .bmi,
+ .cmov,
+ .cx8,
+ .cx16,
+ .f16c,
+ .fxsr,
+ .fast15bytenop,
+ .fast_bextr,
+ .fast_hops,
+ .fast_lzcnt,
+ .fast_partial_ymm_or_zmm_write,
+ .fast_scalar_shift_masks,
+ .fast_vector_shift_masks,
+ .sahf,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .sse4a,
+ .ssse3,
+ .slow_shld,
+ .x87,
+ .xsave,
+ .xsaveopt,
+ }),
+ };
+
+ pub const c3 = Cpu{
+ .name = "c3",
+ .llvm_name = "c3",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnow3,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const c32 = Cpu{
+ .name = "c3_2",
+ .llvm_name = "c3-2",
+ .dependencies = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .sse,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const cannonlake = Cpu{
+ .name = "cannonlake",
+ .llvm_name = "cannonlake",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .adx,
+ .sse,
+ .aes,
+ .avx,
+ .avx2,
+ .avx512f,
+ .bmi,
+ .bmi2,
+ .avx512bw,
+ .avx512cd,
+ .clflushopt,
+ .cmov,
+ .cx8,
+ .cx16,
+ .avx512dq,
+ .ermsb,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast_shld_rotate,
+ .fast_scalar_fsqrt,
+ .fast_variable_shuffle,
+ .fast_vector_fsqrt,
+ .fast_gather,
+ .avx512ifma,
+ .invpcid,
+ .sahf,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .mpx,
+ .macrofusion,
+ .merge_to_threeway_branch,
+ .nopl,
+ .pclmul,
+ .pku,
+ .popcnt,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sgx,
+ .sha,
+ .sse42,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .avx512vbmi,
+ .avx512vl,
+ .x87,
+ .xsave,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+
+ pub const cascadelake = Cpu{
+ .name = "cascadelake",
+ .llvm_name = "cascadelake",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .adx,
+ .sse,
+ .aes,
+ .avx,
+ .avx2,
+ .avx512f,
+ .bmi,
+ .bmi2,
+ .avx512bw,
+ .avx512cd,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .cx8,
+ .cx16,
+ .avx512dq,
+ .ermsb,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast_shld_rotate,
+ .fast_scalar_fsqrt,
+ .fast_variable_shuffle,
+ .fast_vector_fsqrt,
+ .fast_gather,
+ .invpcid,
+ .sahf,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .mpx,
+ .macrofusion,
+ .merge_to_threeway_branch,
+ .nopl,
+ .pclmul,
+ .pku,
+ .popcnt,
+ .false_deps_popcnt,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sse42,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .avx512vl,
+ .avx512vnni,
+ .x87,
+ .xsave,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+
+ pub const cooperlake = Cpu{
+ .name = "cooperlake",
+ .llvm_name = "cooperlake",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .adx,
+ .sse,
+ .aes,
+ .avx,
+ .avx2,
+ .avx512f,
+ .avx512bf16,
+ .bmi,
+ .bmi2,
+ .avx512bw,
+ .avx512cd,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .cx8,
+ .cx16,
+ .avx512dq,
+ .ermsb,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast_shld_rotate,
+ .fast_scalar_fsqrt,
+ .fast_variable_shuffle,
+ .fast_vector_fsqrt,
+ .fast_gather,
+ .invpcid,
+ .sahf,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .mpx,
+ .macrofusion,
+ .merge_to_threeway_branch,
+ .nopl,
+ .pclmul,
+ .pku,
+ .popcnt,
+ .false_deps_popcnt,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sse42,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .avx512vl,
+ .avx512vnni,
+ .x87,
+ .xsave,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+
+ pub const core_avx_i = Cpu{
+ .name = "core_avx_i",
+ .llvm_name = "core-avx-i",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .sse,
+ .avx,
+ .cmov,
+ .cx8,
+ .cx16,
+ .f16c,
+ .fsgsbase,
+ .fxsr,
+ .fast_shld_rotate,
+ .fast_scalar_fsqrt,
+ .sahf,
+ .mmx,
+ .macrofusion,
+ .merge_to_threeway_branch,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .false_deps_popcnt,
+ .rdrnd,
+ .sse42,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .slow_unaligned_mem_32,
+ .x87,
+ .xsave,
+ .xsaveopt,
+ }),
+ };
+
+ pub const core_avx2 = Cpu{
+ .name = "core_avx2",
+ .llvm_name = "core-avx2",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .sse,
+ .avx,
+ .avx2,
+ .bmi,
+ .bmi2,
+ .cmov,
+ .cx8,
+ .cx16,
+ .ermsb,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast_shld_rotate,
+ .fast_scalar_fsqrt,
+ .fast_variable_shuffle,
+ .invpcid,
+ .sahf,
+ .lzcnt,
+ .false_deps_lzcnt_tzcnt,
+ .mmx,
+ .movbe,
+ .macrofusion,
+ .merge_to_threeway_branch,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .false_deps_popcnt,
+ .rdrnd,
+ .sse42,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .x87,
+ .xsave,
+ .xsaveopt,
+ }),
+ };
+
+ pub const core2 = Cpu{
+ .name = "core2",
+ .llvm_name = "core2",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .sahf,
+ .mmx,
+ .macrofusion,
+ .nopl,
+ .sse,
+ .ssse3,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const corei7 = Cpu{
+ .name = "corei7",
+ .llvm_name = "corei7",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .sahf,
+ .mmx,
+ .macrofusion,
+ .nopl,
+ .popcnt,
+ .sse,
+ .sse42,
+ .x87,
+ }),
+ };
+
+ pub const corei7_avx = Cpu{
+ .name = "corei7_avx",
+ .llvm_name = "corei7-avx",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .sse,
+ .avx,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .fast_shld_rotate,
+ .fast_scalar_fsqrt,
+ .sahf,
+ .mmx,
+ .macrofusion,
+ .merge_to_threeway_branch,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .false_deps_popcnt,
+ .sse42,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .slow_unaligned_mem_32,
+ .x87,
+ .xsave,
+ .xsaveopt,
+ }),
+ };
+
+ pub const generic = Cpu{
+ .name = "generic",
+ .llvm_name = "generic",
+ .dependencies = featureSet(&[_]Feature{
+ .cx8,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const geode = Cpu{
+ .name = "geode",
+ .llvm_name = "geode",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnowa3,
+ .cx8,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const goldmont = Cpu{
+ .name = "goldmont",
+ .llvm_name = "goldmont",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .sse,
+ .aes,
+ .clflushopt,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fsgsbase,
+ .fxsr,
+ .sahf,
+ .mmx,
+ .movbe,
+ .mpx,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .false_deps_popcnt,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sha,
+ .sse42,
+ .ssse3,
+ .slow_incdec,
+ .slowLea,
+ .slow_two_mem_ops,
+ .x87,
+ .xsave,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+
+ pub const goldmont_plus = Cpu{
+ .name = "goldmont_plus",
+ .llvm_name = "goldmont-plus",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .sse,
+ .aes,
+ .clflushopt,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fsgsbase,
+ .fxsr,
+ .sahf,
+ .mmx,
+ .movbe,
+ .mpx,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .ptwrite,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sgx,
+ .sha,
+ .sse42,
+ .ssse3,
+ .slow_incdec,
+ .slowLea,
+ .slow_two_mem_ops,
+ .x87,
+ .xsave,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+
+ pub const haswell = Cpu{
+ .name = "haswell",
+ .llvm_name = "haswell",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .sse,
+ .avx,
+ .avx2,
+ .bmi,
+ .bmi2,
+ .cmov,
+ .cx8,
+ .cx16,
+ .ermsb,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast_shld_rotate,
+ .fast_scalar_fsqrt,
+ .fast_variable_shuffle,
+ .invpcid,
+ .sahf,
+ .lzcnt,
+ .false_deps_lzcnt_tzcnt,
+ .mmx,
+ .movbe,
+ .macrofusion,
+ .merge_to_threeway_branch,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .false_deps_popcnt,
+ .rdrnd,
+ .sse42,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .x87,
+ .xsave,
+ .xsaveopt,
+ }),
+ };
+
+ pub const i386 = Cpu{
+ .name = "i386",
+ .llvm_name = "i386",
+ .dependencies = featureSet(&[_]Feature{
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const i486 = Cpu{
+ .name = "i486",
+ .llvm_name = "i486",
+ .dependencies = featureSet(&[_]Feature{
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const i586 = Cpu{
+ .name = "i586",
+ .llvm_name = "i586",
+ .dependencies = featureSet(&[_]Feature{
+ .cx8,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const i686 = Cpu{
+ .name = "i686",
+ .llvm_name = "i686",
+ .dependencies = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const icelake_client = Cpu{
+ .name = "icelake_client",
+ .llvm_name = "icelake-client",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .adx,
+ .sse,
+ .aes,
+ .avx,
+ .avx2,
+ .avx512f,
+ .avx512bitalg,
+ .bmi,
+ .bmi2,
+ .avx512bw,
+ .avx512cd,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .cx8,
+ .cx16,
+ .avx512dq,
+ .ermsb,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast_shld_rotate,
+ .fast_scalar_fsqrt,
+ .fast_variable_shuffle,
+ .fast_vector_fsqrt,
+ .gfni,
+ .fast_gather,
+ .avx512ifma,
+ .invpcid,
+ .sahf,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .mpx,
+ .macrofusion,
+ .merge_to_threeway_branch,
+ .nopl,
+ .pclmul,
+ .pku,
+ .popcnt,
+ .prfchw,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sgx,
+ .sha,
+ .sse42,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .vaes,
+ .avx512vbmi,
+ .avx512vbmi2,
+ .avx512vl,
+ .avx512vnni,
+ .vpclmulqdq,
+ .avx512vpopcntdq,
+ .x87,
+ .xsave,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+
+ pub const icelake_server = Cpu{
+ .name = "icelake_server",
+ .llvm_name = "icelake-server",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .adx,
+ .sse,
+ .aes,
+ .avx,
+ .avx2,
+ .avx512f,
+ .avx512bitalg,
+ .bmi,
+ .bmi2,
+ .avx512bw,
+ .avx512cd,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .cx8,
+ .cx16,
+ .avx512dq,
+ .ermsb,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast_shld_rotate,
+ .fast_scalar_fsqrt,
+ .fast_variable_shuffle,
+ .fast_vector_fsqrt,
+ .gfni,
+ .fast_gather,
+ .avx512ifma,
+ .invpcid,
+ .sahf,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .mpx,
+ .macrofusion,
+ .merge_to_threeway_branch,
+ .nopl,
+ .pclmul,
+ .pconfig,
+ .pku,
+ .popcnt,
+ .prfchw,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sgx,
+ .sha,
+ .sse42,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .vaes,
+ .avx512vbmi,
+ .avx512vbmi2,
+ .avx512vl,
+ .avx512vnni,
+ .vpclmulqdq,
+ .avx512vpopcntdq,
+ .wbnoinvd,
+ .x87,
+ .xsave,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+
+ pub const ivybridge = Cpu{
+ .name = "ivybridge",
+ .llvm_name = "ivybridge",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .sse,
+ .avx,
+ .cmov,
+ .cx8,
+ .cx16,
+ .f16c,
+ .fsgsbase,
+ .fxsr,
+ .fast_shld_rotate,
+ .fast_scalar_fsqrt,
+ .sahf,
+ .mmx,
+ .macrofusion,
+ .merge_to_threeway_branch,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .false_deps_popcnt,
+ .rdrnd,
+ .sse42,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .slow_unaligned_mem_32,
+ .x87,
+ .xsave,
+ .xsaveopt,
+ }),
+ };
+
+ pub const k6 = Cpu{
+ .name = "k6",
+ .llvm_name = "k6",
+ .dependencies = featureSet(&[_]Feature{
+ .cx8,
+ .mmx,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const k62 = Cpu{
+ .name = "k6_2",
+ .llvm_name = "k6-2",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnow3,
+ .cx8,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const k63 = Cpu{
+ .name = "k6_3",
+ .llvm_name = "k6-3",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnow3,
+ .cx8,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const k8 = Cpu{
+ .name = "k8",
+ .llvm_name = "k8",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnowa3,
+ .bit64,
+ .cmov,
+ .cx8,
+ .fxsr,
+ .fast_scalar_shift_masks,
+ .nopl,
+ .sse,
+ .sse2,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const k8_sse3 = Cpu{
+ .name = "k8_sse3",
+ .llvm_name = "k8-sse3",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnowa3,
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .fast_scalar_shift_masks,
+ .nopl,
+ .sse,
+ .sse3,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const knl = Cpu{
+ .name = "knl",
+ .llvm_name = "knl",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .adx,
+ .sse,
+ .aes,
+ .avx512f,
+ .bmi,
+ .bmi2,
+ .avx512cd,
+ .cmov,
+ .cx8,
+ .cx16,
+ .avx512er,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast_partial_ymm_or_zmm_write,
+ .fast_gather,
+ .sahf,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .nopl,
+ .pclmul,
+ .avx512pf,
+ .popcnt,
+ .prefetchwt1,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .slow_incdec,
+ .slow_pmaddwd,
+ .slow_two_mem_ops,
+ .x87,
+ .xsave,
+ .xsaveopt,
+ }),
+ };
+
+ pub const knm = Cpu{
+ .name = "knm",
+ .llvm_name = "knm",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .adx,
+ .sse,
+ .aes,
+ .avx512f,
+ .bmi,
+ .bmi2,
+ .avx512cd,
+ .cmov,
+ .cx8,
+ .cx16,
+ .avx512er,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast_partial_ymm_or_zmm_write,
+ .fast_gather,
+ .sahf,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .nopl,
+ .pclmul,
+ .avx512pf,
+ .popcnt,
+ .prefetchwt1,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .slow_incdec,
+ .slow_pmaddwd,
+ .slow_two_mem_ops,
+ .avx512vpopcntdq,
+ .x87,
+ .xsave,
+ .xsaveopt,
+ }),
+ };
+
+ pub const lakemont = Cpu{
+ .name = "lakemont",
+ .llvm_name = "lakemont",
+ .dependencies = 0,
+ };
+
+ pub const nehalem = Cpu{
+ .name = "nehalem",
+ .llvm_name = "nehalem",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .sahf,
+ .mmx,
+ .macrofusion,
+ .nopl,
+ .popcnt,
+ .sse,
+ .sse42,
+ .x87,
+ }),
+ };
+
+ pub const nocona = Cpu{
+ .name = "nocona",
+ .llvm_name = "nocona",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .sse,
+ .sse3,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const opteron = Cpu{
+ .name = "opteron",
+ .llvm_name = "opteron",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnowa3,
+ .bit64,
+ .cmov,
+ .cx8,
+ .fxsr,
+ .fast_scalar_shift_masks,
+ .nopl,
+ .sse,
+ .sse2,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const opteron_sse3 = Cpu{
+ .name = "opteron_sse3",
+ .llvm_name = "opteron-sse3",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnowa3,
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .fast_scalar_shift_masks,
+ .nopl,
+ .sse,
+ .sse3,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const penryn = Cpu{
+ .name = "penryn",
+ .llvm_name = "penryn",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .sahf,
+ .mmx,
+ .macrofusion,
+ .nopl,
+ .sse,
+ .sse41,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const pentium = Cpu{
+ .name = "pentium",
+ .llvm_name = "pentium",
+ .dependencies = featureSet(&[_]Feature{
+ .cx8,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const pentium_m = Cpu{
+ .name = "pentium_m",
+ .llvm_name = "pentium-m",
+ .dependencies = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .sse,
+ .sse2,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const pentium_mmx = Cpu{
+ .name = "pentium_mmx",
+ .llvm_name = "pentium-mmx",
+ .dependencies = featureSet(&[_]Feature{
+ .cx8,
+ .mmx,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const pentium2 = Cpu{
+ .name = "pentium2",
+ .llvm_name = "pentium2",
+ .dependencies = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const pentium3 = Cpu{
+ .name = "pentium3",
+ .llvm_name = "pentium3",
+ .dependencies = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .sse,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const pentium3m = Cpu{
+ .name = "pentium3m",
+ .llvm_name = "pentium3m",
+ .dependencies = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .sse,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const pentium4 = Cpu{
+ .name = "pentium4",
+ .llvm_name = "pentium4",
+ .dependencies = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .sse,
+ .sse2,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const pentium4m = Cpu{
+ .name = "pentium4m",
+ .llvm_name = "pentium4m",
+ .dependencies = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .sse,
+ .sse2,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const pentiumpro = Cpu{
+ .name = "pentiumpro",
+ .llvm_name = "pentiumpro",
+ .dependencies = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .nopl,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const prescott = Cpu{
+ .name = "prescott",
+ .llvm_name = "prescott",
+ .dependencies = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .sse,
+ .sse3,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const sandybridge = Cpu{
+ .name = "sandybridge",
+ .llvm_name = "sandybridge",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .sse,
+ .avx,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .fast_shld_rotate,
+ .fast_scalar_fsqrt,
+ .sahf,
+ .mmx,
+ .macrofusion,
+ .merge_to_threeway_branch,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .false_deps_popcnt,
+ .sse42,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .slow_unaligned_mem_32,
+ .x87,
+ .xsave,
+ .xsaveopt,
+ }),
+ };
+
+ pub const silvermont = Cpu{
+ .name = "silvermont",
+ .llvm_name = "silvermont",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .sahf,
+ .mmx,
+ .movbe,
+ .nopl,
+ .sse,
+ .pclmul,
+ .popcnt,
+ .false_deps_popcnt,
+ .prfchw,
+ .rdrnd,
+ .sse42,
+ .ssse3,
+ .idivq_to_divl,
+ .slow_incdec,
+ .slowLea,
+ .slowPmulld,
+ .slow_two_mem_ops,
+ .x87,
+ }),
+ };
+
+ pub const skx = Cpu{
+ .name = "skx",
+ .llvm_name = "skx",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .adx,
+ .sse,
+ .aes,
+ .avx,
+ .avx2,
+ .avx512f,
+ .bmi,
+ .bmi2,
+ .avx512bw,
+ .avx512cd,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .cx8,
+ .cx16,
+ .avx512dq,
+ .ermsb,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast_shld_rotate,
+ .fast_scalar_fsqrt,
+ .fast_variable_shuffle,
+ .fast_vector_fsqrt,
+ .fast_gather,
+ .invpcid,
+ .sahf,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .mpx,
+ .macrofusion,
+ .merge_to_threeway_branch,
+ .nopl,
+ .pclmul,
+ .pku,
+ .popcnt,
+ .false_deps_popcnt,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sse42,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .avx512vl,
+ .x87,
+ .xsave,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+
+ pub const skylake = Cpu{
+ .name = "skylake",
+ .llvm_name = "skylake",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .adx,
+ .sse,
+ .aes,
+ .avx,
+ .avx2,
+ .bmi,
+ .bmi2,
+ .clflushopt,
+ .cmov,
+ .cx8,
+ .cx16,
+ .ermsb,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast_shld_rotate,
+ .fast_scalar_fsqrt,
+ .fast_variable_shuffle,
+ .fast_vector_fsqrt,
+ .fast_gather,
+ .invpcid,
+ .sahf,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .mpx,
+ .macrofusion,
+ .merge_to_threeway_branch,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .false_deps_popcnt,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sgx,
+ .sse42,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .x87,
+ .xsave,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+
+ pub const skylake_avx512 = Cpu{
+ .name = "skylake_avx512",
+ .llvm_name = "skylake-avx512",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .adx,
+ .sse,
+ .aes,
+ .avx,
+ .avx2,
+ .avx512f,
+ .bmi,
+ .bmi2,
+ .avx512bw,
+ .avx512cd,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .cx8,
+ .cx16,
+ .avx512dq,
+ .ermsb,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast_shld_rotate,
+ .fast_scalar_fsqrt,
+ .fast_variable_shuffle,
+ .fast_vector_fsqrt,
+ .fast_gather,
+ .invpcid,
+ .sahf,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .mpx,
+ .macrofusion,
+ .merge_to_threeway_branch,
+ .nopl,
+ .pclmul,
+ .pku,
+ .popcnt,
+ .false_deps_popcnt,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sse42,
+ .slow_3ops_lea,
+ .idivq_to_divl,
+ .avx512vl,
+ .x87,
+ .xsave,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+
+ pub const slm = Cpu{
+ .name = "slm",
+ .llvm_name = "slm",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .sahf,
+ .mmx,
+ .movbe,
+ .nopl,
+ .sse,
+ .pclmul,
+ .popcnt,
+ .false_deps_popcnt,
+ .prfchw,
+ .rdrnd,
+ .sse42,
+ .ssse3,
+ .idivq_to_divl,
+ .slow_incdec,
+ .slowLea,
+ .slowPmulld,
+ .slow_two_mem_ops,
+ .x87,
+ }),
+ };
+
+ pub const tremont = Cpu{
+ .name = "tremont",
+ .llvm_name = "tremont",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .sse,
+ .aes,
+ .cldemote,
+ .clflushopt,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fsgsbase,
+ .fxsr,
+ .gfni,
+ .sahf,
+ .mmx,
+ .movbe,
+ .movdir64b,
+ .movdiri,
+ .mpx,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .ptwrite,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sgx,
+ .sha,
+ .sse42,
+ .ssse3,
+ .slow_incdec,
+ .slowLea,
+ .slow_two_mem_ops,
+ .waitpkg,
+ .x87,
+ .xsave,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+
+ pub const westmere = Cpu{
+ .name = "westmere",
+ .llvm_name = "westmere",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .cmov,
+ .cx8,
+ .cx16,
+ .fxsr,
+ .sahf,
+ .mmx,
+ .macrofusion,
+ .nopl,
+ .sse,
+ .pclmul,
+ .popcnt,
+ .sse42,
+ .x87,
+ }),
+ };
+
+ pub const winchip_c6 = Cpu{
+ .name = "winchip_c6",
+ .llvm_name = "winchip-c6",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const winchip2 = Cpu{
+ .name = "winchip2",
+ .llvm_name = "winchip2",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ .dnow3,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const x86_64 = Cpu{
+ .name = "x86_64",
+ .llvm_name = "x86-64",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .macrofusion,
+ .nopl,
+ .sse,
+ .sse2,
+ .slow_3ops_lea,
+ .slow_incdec,
+ .x87,
+ }),
+ };
+
+ pub const yonah = Cpu{
+ .name = "yonah",
+ .llvm_name = "yonah",
+ .dependencies = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .sse,
+ .sse3,
+ .slow_unaligned_mem_16,
+ .x87,
+ }),
+ };
+
+ pub const znver1 = Cpu{
+ .name = "znver1",
+ .llvm_name = "znver1",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .adx,
+ .sse,
+ .aes,
+ .avx2,
+ .bmi,
+ .bmi2,
+ .branchfusion,
+ .clflushopt,
+ .clzero,
+ .cmov,
+ .cx8,
+ .cx16,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast15bytenop,
+ .fast_bextr,
+ .fast_lzcnt,
+ .fast_scalar_shift_masks,
+ .sahf,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .mwaitx,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sha,
+ .sse4a,
+ .slow_shld,
+ .x87,
+ .xsave,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+
+ pub const znver2 = Cpu{
+ .name = "znver2",
+ .llvm_name = "znver2",
+ .dependencies = featureSet(&[_]Feature{
+ .bit64,
+ .adx,
+ .sse,
+ .aes,
+ .avx2,
+ .bmi,
+ .bmi2,
+ .branchfusion,
+ .clflushopt,
+ .clwb,
+ .clzero,
+ .cmov,
+ .cx8,
+ .cx16,
+ .f16c,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .fast15bytenop,
+ .fast_bextr,
+ .fast_lzcnt,
+ .fast_scalar_shift_masks,
+ .sahf,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .mwaitx,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sha,
+ .sse4a,
+ .slow_shld,
+ .wbnoinvd,
+ .x87,
+ .xsave,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+};
+
+pub const all_cpus = &[_]*const Cpu{
+ &cpu.amdfam10,
+ &cpu.athlon,
+ &cpu.athlon4,
+ &cpu.athlon_fx,
+ &cpu.athlon_mp,
+ &cpu.athlon_tbird,
+ &cpu.athlon_xp,
+ &cpu.athlon64,
+ &cpu.athlon64_sse3,
+ &cpu.atom,
+ &cpu.barcelona,
+ &cpu.bdver1,
+ &cpu.bdver2,
+ &cpu.bdver3,
+ &cpu.bdver4,
+ &cpu.bonnell,
+ &cpu.broadwell,
+ &cpu.btver1,
+ &cpu.btver2,
+ &cpu.c3,
+ &cpu.c32,
+ &cpu.cannonlake,
+ &cpu.cascadelake,
+ &cpu.cooperlake,
+ &cpu.core_avx_i,
+ &cpu.core_avx2,
+ &cpu.core2,
+ &cpu.corei7,
+ &cpu.corei7_avx,
+ &cpu.generic,
+ &cpu.geode,
+ &cpu.goldmont,
+ &cpu.goldmont_plus,
+ &cpu.haswell,
+ &cpu.i386,
+ &cpu.i486,
+ &cpu.i586,
+ &cpu.i686,
+ &cpu.icelake_client,
+ &cpu.icelake_server,
+ &cpu.ivybridge,
+ &cpu.k6,
+ &cpu.k62,
+ &cpu.k63,
+ &cpu.k8,
+ &cpu.k8_sse3,
+ &cpu.knl,
+ &cpu.knm,
+ &cpu.lakemont,
+ &cpu.nehalem,
+ &cpu.nocona,
+ &cpu.opteron,
+ &cpu.opteron_sse3,
+ &cpu.penryn,
+ &cpu.pentium,
+ &cpu.pentium_m,
+ &cpu.pentium_mmx,
+ &cpu.pentium2,
+ &cpu.pentium3,
+ &cpu.pentium3m,
+ &cpu.pentium4,
+ &cpu.pentium4m,
+ &cpu.pentiumpro,
+ &cpu.prescott,
+ &cpu.sandybridge,
+ &cpu.silvermont,
+ &cpu.skx,
+ &cpu.skylake,
+ &cpu.skylake_avx512,
+ &cpu.slm,
+ &cpu.tremont,
+ &cpu.westmere,
+ &cpu.winchip_c6,
+ &cpu.winchip2,
+ &cpu.x86_64,
+ &cpu.yonah,
+ &cpu.znver1,
+ &cpu.znver2,
};
lib/std/target.zig
@@ -401,25 +401,25 @@ pub const Target = union(enum) {
}
/// All CPU features Zig is aware of, sorted lexicographically by name.
- pub fn allFeaturesList(arch: Arch) []const *const Cpu.Feature {
+ pub fn allFeaturesList(arch: Arch) []const Cpu.Feature {
return switch (arch) {
- .arm, .armeb, .thumb, .thumbeb => arm.all_features,
- .aarch64, .aarch64_be, .aarch64_32 => aarch64.all_features,
- .avr => avr.all_features,
- .bpfel, .bpfeb => bpf.all_features,
- .hexagon => hexagon.all_features,
- .mips, .mipsel, .mips64, .mips64el => mips.all_features,
- .msp430 => msp430.all_features,
- .powerpc, .powerpc64, .powerpc64le => powerpc.all_features,
- .amdgcn => amdgpu.all_features,
- .riscv32, .riscv64 => riscv.all_features,
- .sparc, .sparcv9, .sparcel => sparc.all_features,
- .s390x => systemz.all_features,
- .i386, .x86_64 => x86.all_features,
- .nvptx, .nvptx64 => nvptx.all_features,
- .wasm32, .wasm64 => wasm.all_features,
-
- else => &[0]*const Cpu.Feature{},
+ // TODO .arm, .armeb, .thumb, .thumbeb => arm.all_features,
+ .aarch64, .aarch64_be, .aarch64_32 => &aarch64.all_features,
+ // TODO .avr => avr.all_features,
+ // TODO .bpfel, .bpfeb => bpf.all_features,
+ // TODO .hexagon => hexagon.all_features,
+ // TODO .mips, .mipsel, .mips64, .mips64el => mips.all_features,
+ // TODO .msp430 => msp430.all_features,
+ // TODO .powerpc, .powerpc64, .powerpc64le => powerpc.all_features,
+ // TODO .amdgcn => amdgpu.all_features,
+ // TODO .riscv32, .riscv64 => riscv.all_features,
+ // TODO .sparc, .sparcv9, .sparcel => sparc.all_features,
+ // TODO .s390x => systemz.all_features,
+ .i386, .x86_64 => &x86.all_features,
+ // TODO .nvptx, .nvptx64 => nvptx.all_features,
+ // TODO .wasm32, .wasm64 => wasm.all_features,
+
+ else => &[0]Cpu.Feature{},
};
}
@@ -427,23 +427,24 @@ pub const Target = union(enum) {
/// of features that is expected to be supported on most available hardware.
pub fn baselineFeatures(arch: Arch) Cpu.Feature.Set {
return switch (arch) {
- .arm, .armeb, .thumb, .thumbeb => arm.baseline_features,
+ // TODO .arm, .armeb, .thumb, .thumbeb => arm.baseline_features,
.aarch64, .aarch64_be, .aarch64_32 => aarch64.cpu.generic.features,
- .avr => avr.baseline_features,
- .bpfel, .bpfeb => bpf.baseline_features,
- .hexagon => hexagon.baseline_features,
- .mips, .mipsel, .mips64, .mips64el => mips.baseline_features,
- .msp430 => msp430.baseline_features,
- .powerpc, .powerpc64, .powerpc64le => powerpc.baseline_features,
- .amdgcn => amdgpu.baseline_features,
- .riscv32, .riscv64 => riscv.baseline_features,
- .sparc, .sparcv9, .sparcel => sparc.baseline_features,
- .s390x => systemz.baseline_features,
- .i386, .x86_64 => x86.baseline_features,
- .nvptx, .nvptx64 => nvptx.baseline_features,
- .wasm32, .wasm64 => wasm.baseline_features,
-
- else => &[0]*const Cpu.Feature{},
+ // TODO .avr => avr.baseline_features,
+ // TODO .bpfel, .bpfeb => bpf.baseline_features,
+ // TODO .hexagon => hexagon.baseline_features,
+ // TODO .mips, .mipsel, .mips64, .mips64el => mips.baseline_features,
+ // TODO .msp430 => msp430.baseline_features,
+ // TODO .powerpc, .powerpc64, .powerpc64le => powerpc.baseline_features,
+ // TODO .amdgcn => amdgpu.baseline_features,
+ // TODO .riscv32, .riscv64 => riscv.baseline_features,
+ // TODO .sparc, .sparcv9, .sparcel => sparc.baseline_features,
+ // TODO .s390x => systemz.baseline_features,
+ .i386 => x86.cpu.pentium4.features,
+ .x86_64 => x86.cpu.x8664.features,
+ // TODO .nvptx, .nvptx64 => nvptx.baseline_features,
+ // TODO .wasm32, .wasm64 => wasm.baseline_features,
+
+ else => 0,
};
}
@@ -515,6 +516,22 @@ pub const Target = union(enum) {
pub fn isEnabled(set: Set, arch_feature_index: u7) bool {
return (set & (@as(Set, 1) << arch_feature_index)) != 0;
}
+
+ pub fn feature_set_fns(comptime F: type) type {
+ return struct {
+ pub fn featureSet(features: []const F) Set {
+ var x: Set = 0;
+ for (features) |feature| {
+ x |= @as(Set, 1) << @enumToInt(feature);
+ }
+ return x;
+ }
+
+ pub fn featureSetHas(set: Set, feature: F) bool {
+ return (set & (@as(Set, 1) << @enumToInt(feature))) != 0;
+ }
+ };
+ }
};
};
BRANCH_TODO
@@ -1,8 +1,5 @@
Finish these thigns before merging teh branch
- * need to populate builtin.zig cpu_features, undefined is incorrect. I guess for zig0 it will be always baseline
- * need to populate std.Target.current.cpu_features even for native target
-
* finish refactoring target/arch/*
* `zig builtin` integration
* move target details to better location
@@ -29,18 +26,6 @@ const riscv64_default_features: []*const std.target.Feature = &[_]*const std.tar
&std.target.riscv.feature_relax,
};
-const i386_default_features: []*const std.target.Feature = &[_]*const std.target.Feature{
- &std.target.x86.feature_cmov,
- &std.target.x86.feature_cx8,
- &std.target.x86.feature_fxsr,
- &std.target.x86.feature_mmx,
- &std.target.x86.feature_nopl,
- &std.target.x86.feature_sse,
- &std.target.x86.feature_sse2,
- &std.target.x86.feature_slowUnalignedMem16,
- &std.target.x86.feature_x87,
-};
-
// Same as above but without sse.
const i386_default_features_freestanding: []*const std.target.Feature = &[_]*const std.target.Feature{
&std.target.x86.feature_cmov,