Path: blob/main/cranelift/codegen/meta/src/isa/x86.rs
1693 views
use crate::cdsl::isa::TargetIsa;1use crate::cdsl::settings::{PredicateNode, SettingGroupBuilder};23pub(crate) fn define() -> TargetIsa {4let mut settings = SettingGroupBuilder::new("x86");56// CPUID.01H:ECX7let has_sse3 = settings.add_bool(8"has_sse3",9"Has support for SSE3.",10"SSE3: CPUID.01H:ECX.SSE3[bit 0]",11false,12);13let has_ssse3 = settings.add_bool(14"has_ssse3",15"Has support for SSSE3.",16"SSSE3: CPUID.01H:ECX.SSSE3[bit 9]",17false,18);19let has_cmpxchg16b = settings.add_bool(20"has_cmpxchg16b",21"Has support for CMPXCHG16b.",22"CMPXCHG16b: CPUID.01H:ECX.CMPXCHG16B[bit 13]",23false,24);25let has_sse41 = settings.add_bool(26"has_sse41",27"Has support for SSE4.1.",28"SSE4.1: CPUID.01H:ECX.SSE4_1[bit 19]",29false,30);31let has_sse42 = settings.add_bool(32"has_sse42",33"Has support for SSE4.2.",34"SSE4.2: CPUID.01H:ECX.SSE4_2[bit 20]",35false,36);37let has_avx = settings.add_bool(38"has_avx",39"Has support for AVX.",40"AVX: CPUID.01H:ECX.AVX[bit 28]",41false,42);43let has_avx2 = settings.add_bool(44"has_avx2",45"Has support for AVX2.",46"AVX2: CPUID.07H:EBX.AVX2[bit 5]",47false,48);49let has_fma = settings.add_bool(50"has_fma",51"Has support for FMA.",52"FMA: CPUID.01H:ECX.FMA[bit 12]",53false,54);55let has_avx512bitalg = settings.add_bool(56"has_avx512bitalg",57"Has support for AVX512BITALG.",58"AVX512BITALG: CPUID.07H:ECX.AVX512BITALG[bit 12]",59false,60);61let has_avx512dq = settings.add_bool(62"has_avx512dq",63"Has support for AVX512DQ.",64"AVX512DQ: CPUID.07H:EBX.AVX512DQ[bit 17]",65false,66);67let has_avx512vl = settings.add_bool(68"has_avx512vl",69"Has support for AVX512VL.",70"AVX512VL: CPUID.07H:EBX.AVX512VL[bit 31]",71false,72);73let has_avx512vbmi = settings.add_bool(74"has_avx512vbmi",75"Has support for AVX512VMBI.",76"AVX512VBMI: CPUID.07H:ECX.AVX512VBMI[bit 1]",77false,78);79let has_avx512f = settings.add_bool(80"has_avx512f",81"Has support for AVX512F.",82"AVX512F: CPUID.07H:EBX.AVX512F[bit 16]",83false,84);85let has_popcnt = settings.add_bool(86"has_popcnt",87"Has support for POPCNT.",88"POPCNT: CPUID.01H:ECX.POPCNT[bit 23]",89false,90);9192// CPUID.(EAX=07H, ECX=0H):EBX93let has_bmi1 = settings.add_bool(94"has_bmi1",95"Has support for BMI1.",96"BMI1: CPUID.(EAX=07H, ECX=0H):EBX.BMI1[bit 3]",97false,98);99let has_bmi2 = settings.add_bool(100"has_bmi2",101"Has support for BMI2.",102"BMI2: CPUID.(EAX=07H, ECX=0H):EBX.BMI2[bit 8]",103false,104);105106// CPUID.EAX=80000001H:ECX107let has_lzcnt = settings.add_bool(108"has_lzcnt",109"Has support for LZCNT.",110"LZCNT: CPUID.EAX=80000001H:ECX.LZCNT[bit 5]",111false,112);113114settings.add_predicate("use_cmpxchg16b", predicate!(has_cmpxchg16b));115settings.add_predicate("use_sse3", predicate!(has_sse3));116settings.add_predicate("use_ssse3", predicate!(has_ssse3));117settings.add_predicate("use_sse41", predicate!(has_sse41));118settings.add_predicate("use_sse42", predicate!(has_sse41 && has_sse42));119settings.add_predicate("use_fma", predicate!(has_avx && has_fma));120121settings.add_predicate("use_avx", predicate!(has_avx));122settings.add_predicate("use_avx2", predicate!(has_avx && has_avx2));123settings.add_predicate("use_avx512bitalg", predicate!(has_avx512bitalg));124settings.add_predicate("use_avx512dq", predicate!(has_avx512dq));125settings.add_predicate("use_avx512vl", predicate!(has_avx512vl));126settings.add_predicate("use_avx512vbmi", predicate!(has_avx512vbmi));127settings.add_predicate("use_avx512f", predicate!(has_avx512f));128129settings.add_predicate("use_popcnt", predicate!(has_popcnt && has_sse42));130settings.add_predicate("use_bmi1", predicate!(has_bmi1));131settings.add_predicate("use_bmi2", predicate!(has_bmi2));132settings.add_predicate("use_lzcnt", predicate!(has_lzcnt));133134let sse3 = settings.add_preset("sse3", "SSE3 and earlier.", preset!(has_sse3));135let ssse3 = settings.add_preset("ssse3", "SSSE3 and earlier.", preset!(sse3 && has_ssse3));136let sse41 = settings.add_preset("sse41", "SSE4.1 and earlier.", preset!(ssse3 && has_sse41));137let sse42 = settings.add_preset("sse42", "SSE4.2 and earlier.", preset!(sse41 && has_sse42));138139// Presets corresponding to x86 CPUs.140// Features and architecture names are from LLVM's x86 presets:141// https://github.com/llvm/llvm-project/blob/d4493dd1ed58ac3f1eab0c4ca6e363e2b15bfd1c/llvm/lib/Target/X86/X86.td#L1300-L1643142settings.add_preset(143"baseline",144"A baseline preset with no extensions enabled.",145preset!(),146);147148// Intel CPUs149150// Netburst151settings.add_preset(152"nocona",153"Nocona microarchitecture.",154preset!(sse3 && has_cmpxchg16b),155);156157// Intel Core 2 Solo/Duo158settings.add_preset(159"core2",160"Core 2 microarchitecture.",161preset!(sse3 && has_cmpxchg16b),162);163settings.add_preset(164"penryn",165"Penryn microarchitecture.",166preset!(sse41 && has_cmpxchg16b),167);168169// Intel Atom CPUs170let atom = settings.add_preset(171"atom",172"Atom microarchitecture.",173preset!(ssse3 && has_cmpxchg16b),174);175settings.add_preset("bonnell", "Bonnell microarchitecture.", preset!(atom));176let silvermont = settings.add_preset(177"silvermont",178"Silvermont microarchitecture.",179preset!(atom && sse42 && has_popcnt),180);181settings.add_preset("slm", "Silvermont microarchitecture.", preset!(silvermont));182let goldmont = settings.add_preset(183"goldmont",184"Goldmont microarchitecture.",185preset!(silvermont),186);187settings.add_preset(188"goldmont-plus",189"Goldmont Plus microarchitecture.",190preset!(goldmont),191);192let tremont = settings.add_preset("tremont", "Tremont microarchitecture.", preset!(goldmont));193194let alderlake = settings.add_preset(195"alderlake",196"Alderlake microarchitecture.",197preset!(tremont && has_bmi1 && has_bmi2 && has_lzcnt && has_fma),198);199let sierra_forest = settings.add_preset(200"sierraforest",201"Sierra Forest microarchitecture.",202preset!(alderlake),203);204settings.add_preset(205"grandridge",206"Grandridge microarchitecture.",207preset!(sierra_forest),208);209let nehalem = settings.add_preset(210"nehalem",211"Nehalem microarchitecture.",212preset!(sse42 && has_popcnt && has_cmpxchg16b),213);214settings.add_preset("corei7", "Core i7 microarchitecture.", preset!(nehalem));215let westmere = settings.add_preset("westmere", "Westmere microarchitecture.", preset!(nehalem));216let sandy_bridge = settings.add_preset(217"sandybridge",218"Sandy Bridge microarchitecture.",219preset!(westmere && has_avx),220);221settings.add_preset(222"corei7-avx",223"Core i7 AVX microarchitecture.",224preset!(sandy_bridge),225);226let ivy_bridge = settings.add_preset(227"ivybridge",228"Ivy Bridge microarchitecture.",229preset!(sandy_bridge),230);231settings.add_preset(232"core-avx-i",233"Intel Core CPU with 64-bit extensions.",234preset!(ivy_bridge),235);236let haswell = settings.add_preset(237"haswell",238"Haswell microarchitecture.",239preset!(ivy_bridge && has_avx2 && has_bmi1 && has_bmi2 && has_fma && has_lzcnt),240);241settings.add_preset(242"core-avx2",243"Intel Core CPU with AVX2 extensions.",244preset!(haswell),245);246let broadwell = settings.add_preset(247"broadwell",248"Broadwell microarchitecture.",249preset!(haswell),250);251let skylake = settings.add_preset("skylake", "Skylake microarchitecture.", preset!(broadwell));252let knights_landing = settings.add_preset(253"knl",254"Knights Landing microarchitecture.",255preset!(256has_popcnt257&& has_avx512f258&& has_fma259&& has_bmi1260&& has_bmi2261&& has_lzcnt262&& has_cmpxchg16b263),264);265settings.add_preset(266"knm",267"Knights Mill microarchitecture.",268preset!(knights_landing),269);270let skylake_avx512 = settings.add_preset(271"skylake-avx512",272"Skylake AVX512 microarchitecture.",273preset!(broadwell && has_avx512f && has_avx512dq && has_avx512vl),274);275settings.add_preset(276"skx",277"Skylake AVX512 microarchitecture.",278preset!(skylake_avx512),279);280let cascadelake = settings.add_preset(281"cascadelake",282"Cascade Lake microarchitecture.",283preset!(skylake_avx512),284);285settings.add_preset(286"cooperlake",287"Cooper Lake microarchitecture.",288preset!(cascadelake),289);290let cannonlake = settings.add_preset(291"cannonlake",292"Canon Lake microarchitecture.",293preset!(skylake && has_avx512f && has_avx512dq && has_avx512vl && has_avx512vbmi),294);295let icelake_client = settings.add_preset(296"icelake-client",297"Ice Lake microarchitecture.",298preset!(cannonlake && has_avx512bitalg),299);300// LLVM doesn't use the name "icelake" but Cranelift did in the past; alias it301settings.add_preset(302"icelake",303"Ice Lake microarchitecture",304preset!(icelake_client),305);306let icelake_server = settings.add_preset(307"icelake-server",308"Ice Lake (server) microarchitecture.",309preset!(icelake_client),310);311settings.add_preset(312"tigerlake",313"Tiger Lake microarchitecture.",314preset!(icelake_client),315);316let sapphire_rapids = settings.add_preset(317"sapphirerapids",318"Sapphire Rapids microarchitecture.",319preset!(icelake_server),320);321settings.add_preset(322"raptorlake",323"Raptor Lake microarchitecture.",324preset!(alderlake),325);326settings.add_preset(327"meteorlake",328"Meteor Lake microarchitecture.",329preset!(alderlake),330);331settings.add_preset(332"graniterapids",333"Granite Rapids microarchitecture.",334preset!(sapphire_rapids),335);336337// AMD CPUs338339settings.add_preset("opteron", "Opteron microarchitecture.", preset!());340settings.add_preset("k8", "K8 Hammer microarchitecture.", preset!());341settings.add_preset("athlon64", "Athlon64 microarchitecture.", preset!());342settings.add_preset("athlon-fx", "Athlon FX microarchitecture.", preset!());343settings.add_preset(344"opteron-sse3",345"Opteron microarchitecture with support for SSE3 instructions.",346preset!(sse3 && has_cmpxchg16b),347);348settings.add_preset(349"k8-sse3",350"K8 Hammer microarchitecture with support for SSE3 instructions.",351preset!(sse3 && has_cmpxchg16b),352);353settings.add_preset(354"athlon64-sse3",355"Athlon 64 microarchitecture with support for SSE3 instructions.",356preset!(sse3 && has_cmpxchg16b),357);358let barcelona = settings.add_preset(359"barcelona",360"Barcelona microarchitecture.",361preset!(has_popcnt && has_lzcnt && has_cmpxchg16b),362);363settings.add_preset(364"amdfam10",365"AMD Family 10h microarchitecture",366preset!(barcelona),367);368369let btver1 = settings.add_preset(370"btver1",371"Bobcat microarchitecture.",372preset!(ssse3 && has_lzcnt && has_popcnt && has_cmpxchg16b),373);374settings.add_preset(375"btver2",376"Jaguar microarchitecture.",377preset!(btver1 && has_avx && has_bmi1),378);379380let bdver1 = settings.add_preset(381"bdver1",382"Bulldozer microarchitecture",383preset!(has_lzcnt && has_popcnt && ssse3 && has_cmpxchg16b),384);385let bdver2 = settings.add_preset(386"bdver2",387"Piledriver microarchitecture.",388preset!(bdver1 && has_bmi1),389);390let bdver3 = settings.add_preset("bdver3", "Steamroller microarchitecture.", preset!(bdver2));391settings.add_preset(392"bdver4",393"Excavator microarchitecture.",394preset!(bdver3 && has_avx2 && has_bmi2),395);396397let znver1 = settings.add_preset(398"znver1",399"Zen (first generation) microarchitecture.",400preset!(401sse42 && has_popcnt && has_bmi1 && has_bmi2 && has_lzcnt && has_fma && has_cmpxchg16b402),403);404let znver2 = settings.add_preset(405"znver2",406"Zen (second generation) microarchitecture.",407preset!(znver1),408);409let znver3 = settings.add_preset(410"znver3",411"Zen (third generation) microarchitecture.",412preset!(znver2),413);414settings.add_preset(415"znver4",416"Zen (fourth generation) microarchitecture.",417preset!(418znver3419&& has_avx512bitalg420&& has_avx512dq421&& has_avx512f422&& has_avx512vbmi423&& has_avx512vl424),425);426427// Generic428429settings.add_preset("x86-64", "Generic x86-64 microarchitecture.", preset!());430let x86_64_v2 = settings.add_preset(431"x86-64-v2",432"Generic x86-64 (V2) microarchitecture.",433preset!(sse42 && has_popcnt && has_cmpxchg16b),434);435let x86_64_v3 = settings.add_preset(436"x84_64_v3",437"Generic x86_64 (V3) microarchitecture.",438preset!(x86_64_v2 && has_bmi1 && has_bmi2 && has_fma && has_lzcnt && has_avx2),439);440settings.add_preset(441"x86_64_v4",442"Generic x86_64 (V4) microarchitecture.",443preset!(x86_64_v3 && has_avx512dq && has_avx512vl),444);445446TargetIsa::new("x86", settings.build())447}448449450