1*06f32e7eSjoerg//===--- X86Target.def - X86 Feature/Processor Database ---------*- C++ -*-===// 2*06f32e7eSjoerg// 3*06f32e7eSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*06f32e7eSjoerg// See https://llvm.org/LICENSE.txt for license information. 5*06f32e7eSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*06f32e7eSjoerg// 7*06f32e7eSjoerg//===----------------------------------------------------------------------===// 8*06f32e7eSjoerg// 9*06f32e7eSjoerg// This file defines the X86-specific Features and Processors, as used by 10*06f32e7eSjoerg// the X86 Targets. 11*06f32e7eSjoerg// 12*06f32e7eSjoerg//===----------------------------------------------------------------------===// 13*06f32e7eSjoerg 14*06f32e7eSjoerg#ifndef FEATURE 15*06f32e7eSjoerg#define FEATURE(ENUM) 16*06f32e7eSjoerg#endif 17*06f32e7eSjoerg 18*06f32e7eSjoerg#ifndef CPU_SPECIFIC 19*06f32e7eSjoerg#define CPU_SPECIFIC(NAME, MANGLING, FEATURES) 20*06f32e7eSjoerg#endif 21*06f32e7eSjoerg 22*06f32e7eSjoerg#ifndef CPU_SPECIFIC_ALIAS 23*06f32e7eSjoerg#define CPU_SPECIFIC_ALIAS(NEW_NAME, NAME) 24*06f32e7eSjoerg#endif 25*06f32e7eSjoerg 26*06f32e7eSjoerg// List of CPU Supports features in order. These need to remain in the order 27*06f32e7eSjoerg// required by attribute 'target' checking. Note that not all are supported/ 28*06f32e7eSjoerg// prioritized by GCC, so synchronization with GCC's implementation may require 29*06f32e7eSjoerg// changing some existing values. 30*06f32e7eSjoergFEATURE(FEATURE_CMOV) 31*06f32e7eSjoergFEATURE(FEATURE_MMX) 32*06f32e7eSjoergFEATURE(FEATURE_SSE) 33*06f32e7eSjoergFEATURE(FEATURE_SSE2) 34*06f32e7eSjoergFEATURE(FEATURE_SSE3) 35*06f32e7eSjoergFEATURE(FEATURE_SSSE3) 36*06f32e7eSjoergFEATURE(FEATURE_SSE4_A) 37*06f32e7eSjoergFEATURE(FEATURE_SSE4_1) 38*06f32e7eSjoergFEATURE(FEATURE_SSE4_2) 39*06f32e7eSjoergFEATURE(FEATURE_POPCNT) 40*06f32e7eSjoergFEATURE(FEATURE_AES) 41*06f32e7eSjoergFEATURE(FEATURE_PCLMUL) 42*06f32e7eSjoergFEATURE(FEATURE_AVX) 43*06f32e7eSjoergFEATURE(FEATURE_BMI) 44*06f32e7eSjoergFEATURE(FEATURE_FMA4) 45*06f32e7eSjoergFEATURE(FEATURE_XOP) 46*06f32e7eSjoergFEATURE(FEATURE_FMA) 47*06f32e7eSjoergFEATURE(FEATURE_BMI2) 48*06f32e7eSjoergFEATURE(FEATURE_AVX2) 49*06f32e7eSjoergFEATURE(FEATURE_AVX512F) 50*06f32e7eSjoergFEATURE(FEATURE_AVX512VL) 51*06f32e7eSjoergFEATURE(FEATURE_AVX512BW) 52*06f32e7eSjoergFEATURE(FEATURE_AVX512DQ) 53*06f32e7eSjoergFEATURE(FEATURE_AVX512CD) 54*06f32e7eSjoergFEATURE(FEATURE_AVX512ER) 55*06f32e7eSjoergFEATURE(FEATURE_AVX512PF) 56*06f32e7eSjoergFEATURE(FEATURE_AVX512VBMI) 57*06f32e7eSjoergFEATURE(FEATURE_AVX512IFMA) 58*06f32e7eSjoergFEATURE(FEATURE_AVX5124VNNIW) 59*06f32e7eSjoergFEATURE(FEATURE_AVX5124FMAPS) 60*06f32e7eSjoergFEATURE(FEATURE_AVX512VPOPCNTDQ) 61*06f32e7eSjoergFEATURE(FEATURE_AVX512VBMI2) 62*06f32e7eSjoergFEATURE(FEATURE_GFNI) 63*06f32e7eSjoergFEATURE(FEATURE_VPCLMULQDQ) 64*06f32e7eSjoergFEATURE(FEATURE_AVX512VNNI) 65*06f32e7eSjoergFEATURE(FEATURE_AVX512BITALG) 66*06f32e7eSjoergFEATURE(FEATURE_AVX512BF16) 67*06f32e7eSjoergFEATURE(FEATURE_AVX512VP2INTERSECT) 68*06f32e7eSjoerg 69*06f32e7eSjoerg 70*06f32e7eSjoerg// FIXME: When commented out features are supported in LLVM, enable them here. 71*06f32e7eSjoergCPU_SPECIFIC("generic", 'A', "") 72*06f32e7eSjoergCPU_SPECIFIC("pentium", 'B', "") 73*06f32e7eSjoergCPU_SPECIFIC("pentium_pro", 'C', "+cmov") 74*06f32e7eSjoergCPU_SPECIFIC("pentium_mmx", 'D', "+mmx") 75*06f32e7eSjoergCPU_SPECIFIC("pentium_ii", 'E', "+cmov,+mmx") 76*06f32e7eSjoergCPU_SPECIFIC("pentium_iii", 'H', "+cmov,+mmx,+sse") 77*06f32e7eSjoergCPU_SPECIFIC_ALIAS("pentium_iii_no_xmm_regs", "pentium_iii") 78*06f32e7eSjoergCPU_SPECIFIC("pentium_4", 'J', "+cmov,+mmx,+sse,+sse2") 79*06f32e7eSjoergCPU_SPECIFIC("pentium_m", 'K', "+cmov,+mmx,+sse,+sse2") 80*06f32e7eSjoergCPU_SPECIFIC("pentium_4_sse3", 'L', "+cmov,+mmx,+sse,+sse2,+sse3") 81*06f32e7eSjoergCPU_SPECIFIC("core_2_duo_ssse3", 'M', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3") 82*06f32e7eSjoergCPU_SPECIFIC("core_2_duo_sse4_1", 'N', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1") 83*06f32e7eSjoergCPU_SPECIFIC("atom", 'O', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+movbe") 84*06f32e7eSjoergCPU_SPECIFIC("atom_sse4_2", 'c', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+popcnt") 85*06f32e7eSjoergCPU_SPECIFIC("core_i7_sse4_2", 'P', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+popcnt") 86*06f32e7eSjoergCPU_SPECIFIC("core_aes_pclmulqdq", 'Q', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+popcnt") 87*06f32e7eSjoergCPU_SPECIFIC("atom_sse4_2_movbe", 'd', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+movbe,+popcnt") 88*06f32e7eSjoergCPU_SPECIFIC("goldmont", 'i', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+movbe,+popcnt") 89*06f32e7eSjoergCPU_SPECIFIC("sandybridge", 'R', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+popcnt,+avx") 90*06f32e7eSjoergCPU_SPECIFIC_ALIAS("core_2nd_gen_avx", "sandybridge") 91*06f32e7eSjoergCPU_SPECIFIC("ivybridge", 'S', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+popcnt,+f16c,+avx") 92*06f32e7eSjoergCPU_SPECIFIC_ALIAS("core_3rd_gen_avx", "ivybridge") 93*06f32e7eSjoergCPU_SPECIFIC("haswell", 'V', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+movbe,+popcnt,+f16c,+avx,+fma,+bmi,+lzcnt,+avx2") 94*06f32e7eSjoergCPU_SPECIFIC_ALIAS("core_4th_gen_avx", "haswell") 95*06f32e7eSjoergCPU_SPECIFIC("core_4th_gen_avx_tsx", 'W', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+movbe,+popcnt,+f16c,+avx,+fma,+bmi,+lzcnt,+avx2") 96*06f32e7eSjoergCPU_SPECIFIC("broadwell", 'X', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+movbe,+popcnt,+f16c,+avx,+fma,+bmi,+lzcnt,+avx2,+adx") 97*06f32e7eSjoergCPU_SPECIFIC_ALIAS("core_5th_gen_avx", "broadwell") 98*06f32e7eSjoergCPU_SPECIFIC("core_5th_gen_avx_tsx", 'Y', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+movbe,+popcnt,+f16c,+avx,+fma,+bmi,+lzcnt,+avx2,+adx") 99*06f32e7eSjoergCPU_SPECIFIC("knl", 'Z', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+movbe,+popcnt,+f16c,+avx,+fma,+bmi,+lzcnt,+avx2,+avx512f,+adx,+avx512er,+avx512pf,+avx512cd") 100*06f32e7eSjoergCPU_SPECIFIC_ALIAS("mic_avx512", "knl") 101*06f32e7eSjoergCPU_SPECIFIC("skylake", 'b', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+movbe,+popcnt,+f16c,+avx,+fma,+bmi,+lzcnt,+avx2,+adx,+mpx") 102*06f32e7eSjoergCPU_SPECIFIC( "skylake_avx512", 'a', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+movbe,+popcnt,+f16c,+avx,+fma,+bmi,+lzcnt,+avx2,+avx512dq,+avx512f,+adx,+avx512cd,+avx512bw,+avx512vl,+clwb") 103*06f32e7eSjoergCPU_SPECIFIC("cannonlake", 'e', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+movbe,+popcnt,+f16c,+avx,+fma,+bmi,+lzcnt,+avx2,+avx512dq,+avx512f,+adx,+avx512ifma,+avx512cd,+avx512bw,+avx512vl,+avx512vbmi") 104*06f32e7eSjoergCPU_SPECIFIC("knm", 'j', "+cmov,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+movbe,+popcnt,+f16c,+avx,+fma,+bmi,+lzcnt,+avx2,+avx512f,+adx,+avx512er,+avx512pf,+avx512cd,+avx5124fmaps,+avx5124vnniw,+avx512vpopcntdq") 105*06f32e7eSjoerg 106*06f32e7eSjoerg#undef CPU_SPECIFIC_ALIAS 107*06f32e7eSjoerg#undef CPU_SPECIFIC 108*06f32e7eSjoerg#undef PROC_64_BIT 109*06f32e7eSjoerg#undef PROC_32_BIT 110*06f32e7eSjoerg#undef FEATURE 111