LLVM API Documentation
00001 //===-- X86IntinsicsInfo.h - X86 Instrinsics ------------*- C++ -*-===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // This file contains the details for lowering X86 intrinsics 00011 // 00012 //===----------------------------------------------------------------------===// 00013 00014 #ifndef LLVM_LIB_TARGET_X86_X86INTRINSICSINFO_H 00015 #define LLVM_LIB_TARGET_X86_X86INTRINSICSINFO_H 00016 00017 namespace llvm { 00018 00019 enum IntrinsicType { 00020 INTR_NO_TYPE, 00021 GATHER, SCATTER, PREFETCH, RDSEED, RDRAND, RDPMC, RDTSC, XTEST, ADX, 00022 INTR_TYPE_1OP, INTR_TYPE_2OP, INTR_TYPE_3OP, VSHIFT, 00023 COMI 00024 }; 00025 00026 struct IntrinsicData { 00027 00028 unsigned Id; 00029 IntrinsicType Type; 00030 unsigned Opc0; 00031 unsigned Opc1; 00032 00033 bool operator<(const IntrinsicData &RHS) const { 00034 return Id < RHS.Id; 00035 } 00036 bool operator==(const IntrinsicData &RHS) const { 00037 return RHS.Id == Id; 00038 } 00039 }; 00040 00041 #define X86_INTRINSIC_DATA(id, type, op0, op1) \ 00042 { Intrinsic::x86_##id, type, op0, op1 } 00043 00044 /* 00045 * IntrinsicsWithChain - the table should be sorted by Intrinsic ID - in 00046 * the alphabetical order. 00047 */ 00048 static const IntrinsicData IntrinsicsWithChain[] = { 00049 X86_INTRINSIC_DATA(addcarry_u32, ADX, X86ISD::ADC, 0), 00050 X86_INTRINSIC_DATA(addcarry_u64, ADX, X86ISD::ADC, 0), 00051 X86_INTRINSIC_DATA(addcarryx_u32, ADX, X86ISD::ADC, 0), 00052 X86_INTRINSIC_DATA(addcarryx_u64, ADX, X86ISD::ADC, 0), 00053 00054 X86_INTRINSIC_DATA(avx512_gather_dpd_512, GATHER, X86::VGATHERDPDZrm, 0), 00055 X86_INTRINSIC_DATA(avx512_gather_dpi_512, GATHER, X86::VPGATHERDDZrm, 0), 00056 X86_INTRINSIC_DATA(avx512_gather_dpq_512, GATHER, X86::VPGATHERDQZrm, 0), 00057 X86_INTRINSIC_DATA(avx512_gather_dps_512, GATHER, X86::VGATHERDPSZrm, 0), 00058 X86_INTRINSIC_DATA(avx512_gather_qpd_512, GATHER, X86::VGATHERQPDZrm, 0), 00059 X86_INTRINSIC_DATA(avx512_gather_qpi_512, GATHER, X86::VPGATHERQDZrm, 0), 00060 X86_INTRINSIC_DATA(avx512_gather_qpq_512, GATHER, X86::VPGATHERQQZrm, 0), 00061 X86_INTRINSIC_DATA(avx512_gather_qps_512, GATHER, X86::VGATHERQPSZrm, 0), 00062 00063 X86_INTRINSIC_DATA(avx512_gatherpf_dpd_512, PREFETCH, 00064 X86::VGATHERPF0DPDm, X86::VGATHERPF1DPDm), 00065 X86_INTRINSIC_DATA(avx512_gatherpf_dps_512, PREFETCH, 00066 X86::VGATHERPF0DPSm, X86::VGATHERPF1DPSm), 00067 X86_INTRINSIC_DATA(avx512_gatherpf_qpd_512, PREFETCH, 00068 X86::VGATHERPF0QPDm, X86::VGATHERPF1QPDm), 00069 X86_INTRINSIC_DATA(avx512_gatherpf_qps_512, PREFETCH, 00070 X86::VGATHERPF0QPSm, X86::VGATHERPF1QPSm), 00071 00072 X86_INTRINSIC_DATA(avx512_scatter_dpd_512, SCATTER, X86::VSCATTERDPDZmr, 0), 00073 X86_INTRINSIC_DATA(avx512_scatter_dpi_512, SCATTER, X86::VPSCATTERDDZmr, 0), 00074 X86_INTRINSIC_DATA(avx512_scatter_dpq_512, SCATTER, X86::VPSCATTERDQZmr, 0), 00075 X86_INTRINSIC_DATA(avx512_scatter_dps_512, SCATTER, X86::VSCATTERDPSZmr, 0), 00076 X86_INTRINSIC_DATA(avx512_scatter_qpd_512, SCATTER, X86::VSCATTERQPDZmr, 0), 00077 X86_INTRINSIC_DATA(avx512_scatter_qpi_512, SCATTER, X86::VPSCATTERQDZmr, 0), 00078 X86_INTRINSIC_DATA(avx512_scatter_qpq_512, SCATTER, X86::VPSCATTERQQZmr, 0), 00079 X86_INTRINSIC_DATA(avx512_scatter_qps_512, SCATTER, X86::VSCATTERQPSZmr, 0), 00080 00081 X86_INTRINSIC_DATA(avx512_scatterpf_dpd_512, PREFETCH, 00082 X86::VSCATTERPF0DPDm, X86::VSCATTERPF1DPDm), 00083 X86_INTRINSIC_DATA(avx512_scatterpf_dps_512, PREFETCH, 00084 X86::VSCATTERPF0DPSm, X86::VSCATTERPF1DPSm), 00085 X86_INTRINSIC_DATA(avx512_scatterpf_qpd_512, PREFETCH, 00086 X86::VSCATTERPF0QPDm, X86::VSCATTERPF1QPDm), 00087 X86_INTRINSIC_DATA(avx512_scatterpf_qps_512, PREFETCH, 00088 X86::VSCATTERPF0QPSm, X86::VSCATTERPF1QPSm), 00089 00090 X86_INTRINSIC_DATA(rdpmc, RDPMC, X86ISD::RDPMC_DAG, 0), 00091 X86_INTRINSIC_DATA(rdrand_16, RDRAND, X86ISD::RDRAND, 0), 00092 X86_INTRINSIC_DATA(rdrand_32, RDRAND, X86ISD::RDRAND, 0), 00093 X86_INTRINSIC_DATA(rdrand_64, RDRAND, X86ISD::RDRAND, 0), 00094 X86_INTRINSIC_DATA(rdseed_16, RDSEED, X86ISD::RDSEED, 0), 00095 X86_INTRINSIC_DATA(rdseed_32, RDSEED, X86ISD::RDSEED, 0), 00096 X86_INTRINSIC_DATA(rdseed_64, RDSEED, X86ISD::RDSEED, 0), 00097 X86_INTRINSIC_DATA(rdtsc, RDTSC, X86ISD::RDTSC_DAG, 0), 00098 X86_INTRINSIC_DATA(rdtscp, RDTSC, X86ISD::RDTSCP_DAG, 0), 00099 00100 X86_INTRINSIC_DATA(subborrow_u32, ADX, X86ISD::SBB, 0), 00101 X86_INTRINSIC_DATA(subborrow_u64, ADX, X86ISD::SBB, 0), 00102 X86_INTRINSIC_DATA(xtest, XTEST, X86ISD::XTEST, 0), 00103 }; 00104 00105 /* 00106 * Find Intrinsic data by intrinsic ID 00107 */ 00108 static const IntrinsicData* getIntrinsicWithChain(unsigned IntNo) { 00109 00110 IntrinsicData IntrinsicToFind = {IntNo, INTR_NO_TYPE, 0, 0 }; 00111 const IntrinsicData *Data = std::lower_bound(std::begin(IntrinsicsWithChain), 00112 std::end(IntrinsicsWithChain), 00113 IntrinsicToFind); 00114 if (Data != std::end(IntrinsicsWithChain) && *Data == IntrinsicToFind) 00115 return Data; 00116 return nullptr; 00117 } 00118 00119 /* 00120 * IntrinsicsWithoutChain - the table should be sorted by Intrinsic ID - in 00121 * the alphabetical order. 00122 */ 00123 static const IntrinsicData IntrinsicsWithoutChain[] = { 00124 X86_INTRINSIC_DATA(avx2_phadd_d, INTR_TYPE_2OP, X86ISD::HADD, 0), 00125 X86_INTRINSIC_DATA(avx2_phadd_w, INTR_TYPE_2OP, X86ISD::HADD, 0), 00126 X86_INTRINSIC_DATA(avx2_phsub_d, INTR_TYPE_2OP, X86ISD::HSUB, 0), 00127 X86_INTRINSIC_DATA(avx2_phsub_w, INTR_TYPE_2OP, X86ISD::HSUB, 0), 00128 X86_INTRINSIC_DATA(avx2_pmaxs_b, INTR_TYPE_2OP, X86ISD::SMAX, 0), 00129 X86_INTRINSIC_DATA(avx2_pmaxs_d, INTR_TYPE_2OP, X86ISD::SMAX, 0), 00130 X86_INTRINSIC_DATA(avx2_pmaxs_w, INTR_TYPE_2OP, X86ISD::SMAX, 0), 00131 X86_INTRINSIC_DATA(avx2_pmaxu_b, INTR_TYPE_2OP, X86ISD::UMAX, 0), 00132 X86_INTRINSIC_DATA(avx2_pmaxu_d, INTR_TYPE_2OP, X86ISD::UMAX, 0), 00133 X86_INTRINSIC_DATA(avx2_pmaxu_w, INTR_TYPE_2OP, X86ISD::UMAX, 0), 00134 X86_INTRINSIC_DATA(avx2_pmins_b, INTR_TYPE_2OP, X86ISD::SMIN, 0), 00135 X86_INTRINSIC_DATA(avx2_pmins_d, INTR_TYPE_2OP, X86ISD::SMIN, 0), 00136 X86_INTRINSIC_DATA(avx2_pmins_w, INTR_TYPE_2OP, X86ISD::SMIN, 0), 00137 X86_INTRINSIC_DATA(avx2_pminu_b, INTR_TYPE_2OP, X86ISD::UMIN, 0), 00138 X86_INTRINSIC_DATA(avx2_pminu_d, INTR_TYPE_2OP, X86ISD::UMIN, 0), 00139 X86_INTRINSIC_DATA(avx2_pminu_w, INTR_TYPE_2OP, X86ISD::UMIN, 0), 00140 X86_INTRINSIC_DATA(avx2_psll_d, INTR_TYPE_2OP, X86ISD::VSHL, 0), 00141 X86_INTRINSIC_DATA(avx2_psll_q, INTR_TYPE_2OP, X86ISD::VSHL, 0), 00142 X86_INTRINSIC_DATA(avx2_psll_w, INTR_TYPE_2OP, X86ISD::VSHL, 0), 00143 X86_INTRINSIC_DATA(avx2_pslli_d, VSHIFT, X86ISD::VSHLI, 0), 00144 X86_INTRINSIC_DATA(avx2_pslli_q, VSHIFT, X86ISD::VSHLI, 0), 00145 X86_INTRINSIC_DATA(avx2_pslli_w, VSHIFT, X86ISD::VSHLI, 0), 00146 X86_INTRINSIC_DATA(avx2_psra_d, INTR_TYPE_2OP, X86ISD::VSRA, 0), 00147 X86_INTRINSIC_DATA(avx2_psra_w, INTR_TYPE_2OP, X86ISD::VSRA, 0), 00148 X86_INTRINSIC_DATA(avx2_psrai_d, VSHIFT, X86ISD::VSRAI, 0), 00149 X86_INTRINSIC_DATA(avx2_psrai_w, VSHIFT, X86ISD::VSRAI, 0), 00150 X86_INTRINSIC_DATA(avx2_psrl_d, INTR_TYPE_2OP, X86ISD::VSRL, 0), 00151 X86_INTRINSIC_DATA(avx2_psrl_q, INTR_TYPE_2OP, X86ISD::VSRL, 0), 00152 X86_INTRINSIC_DATA(avx2_psrl_w, INTR_TYPE_2OP, X86ISD::VSRL, 0), 00153 X86_INTRINSIC_DATA(avx2_psrli_d, VSHIFT, X86ISD::VSRLI, 0), 00154 X86_INTRINSIC_DATA(avx2_psrli_q, VSHIFT, X86ISD::VSRLI, 0), 00155 X86_INTRINSIC_DATA(avx2_psrli_w, VSHIFT, X86ISD::VSRLI, 0), 00156 X86_INTRINSIC_DATA(avx2_psubus_b, INTR_TYPE_2OP, X86ISD::SUBUS, 0), 00157 X86_INTRINSIC_DATA(avx2_psubus_w, INTR_TYPE_2OP, X86ISD::SUBUS, 0), 00158 X86_INTRINSIC_DATA(avx2_vperm2i128, INTR_TYPE_3OP, X86ISD::VPERM2X128, 0), 00159 X86_INTRINSIC_DATA(avx_hadd_pd_256, INTR_TYPE_2OP, X86ISD::FHADD, 0), 00160 X86_INTRINSIC_DATA(avx_hadd_ps_256, INTR_TYPE_2OP, X86ISD::FHADD, 0), 00161 X86_INTRINSIC_DATA(avx_hsub_pd_256, INTR_TYPE_2OP, X86ISD::FHSUB, 0), 00162 X86_INTRINSIC_DATA(avx_hsub_ps_256, INTR_TYPE_2OP, X86ISD::FHSUB, 0), 00163 X86_INTRINSIC_DATA(avx_sqrt_pd_256, INTR_TYPE_1OP, ISD::FSQRT, 0), 00164 X86_INTRINSIC_DATA(avx_sqrt_ps_256, INTR_TYPE_1OP, ISD::FSQRT, 0), 00165 X86_INTRINSIC_DATA(avx_vperm2f128_pd_256, INTR_TYPE_3OP, X86ISD::VPERM2X128, 0), 00166 X86_INTRINSIC_DATA(avx_vperm2f128_ps_256, INTR_TYPE_3OP, X86ISD::VPERM2X128, 0), 00167 X86_INTRINSIC_DATA(avx_vperm2f128_si_256, INTR_TYPE_3OP, X86ISD::VPERM2X128, 0), 00168 X86_INTRINSIC_DATA(sse2_comieq_sd, COMI, X86ISD::COMI, ISD::SETEQ), 00169 X86_INTRINSIC_DATA(sse2_comige_sd, COMI, X86ISD::COMI, ISD::SETGE), 00170 X86_INTRINSIC_DATA(sse2_comigt_sd, COMI, X86ISD::COMI, ISD::SETGT), 00171 X86_INTRINSIC_DATA(sse2_comile_sd, COMI, X86ISD::COMI, ISD::SETLE), 00172 X86_INTRINSIC_DATA(sse2_comilt_sd, COMI, X86ISD::COMI, ISD::SETLT), 00173 X86_INTRINSIC_DATA(sse2_comineq_sd, COMI, X86ISD::COMI, ISD::SETNE), 00174 X86_INTRINSIC_DATA(sse2_pmaxs_w, INTR_TYPE_2OP, X86ISD::SMAX, 0), 00175 X86_INTRINSIC_DATA(sse2_pmaxu_b, INTR_TYPE_2OP, X86ISD::UMAX, 0), 00176 X86_INTRINSIC_DATA(sse2_pmins_w, INTR_TYPE_2OP, X86ISD::SMIN, 0), 00177 X86_INTRINSIC_DATA(sse2_pminu_b, INTR_TYPE_2OP, X86ISD::UMIN, 0), 00178 X86_INTRINSIC_DATA(sse2_psll_d, INTR_TYPE_2OP, X86ISD::VSHL, 0), 00179 X86_INTRINSIC_DATA(sse2_psll_q, INTR_TYPE_2OP, X86ISD::VSHL, 0), 00180 X86_INTRINSIC_DATA(sse2_psll_w, INTR_TYPE_2OP, X86ISD::VSHL, 0), 00181 X86_INTRINSIC_DATA(sse2_pslli_d, VSHIFT, X86ISD::VSHLI, 0), 00182 X86_INTRINSIC_DATA(sse2_pslli_q, VSHIFT, X86ISD::VSHLI, 0), 00183 X86_INTRINSIC_DATA(sse2_pslli_w, VSHIFT, X86ISD::VSHLI, 0), 00184 X86_INTRINSIC_DATA(sse2_psra_d, INTR_TYPE_2OP, X86ISD::VSRA, 0), 00185 X86_INTRINSIC_DATA(sse2_psra_w, INTR_TYPE_2OP, X86ISD::VSRA, 0), 00186 X86_INTRINSIC_DATA(sse2_psrai_d, VSHIFT, X86ISD::VSRAI, 0), 00187 X86_INTRINSIC_DATA(sse2_psrai_w, VSHIFT, X86ISD::VSRAI, 0), 00188 X86_INTRINSIC_DATA(sse2_psrl_d, INTR_TYPE_2OP, X86ISD::VSRL, 0), 00189 X86_INTRINSIC_DATA(sse2_psrl_q, INTR_TYPE_2OP, X86ISD::VSRL, 0), 00190 X86_INTRINSIC_DATA(sse2_psrl_w, INTR_TYPE_2OP, X86ISD::VSRL, 0), 00191 X86_INTRINSIC_DATA(sse2_psrli_d, VSHIFT, X86ISD::VSRLI, 0), 00192 X86_INTRINSIC_DATA(sse2_psrli_q, VSHIFT, X86ISD::VSRLI, 0), 00193 X86_INTRINSIC_DATA(sse2_psrli_w, VSHIFT, X86ISD::VSRLI, 0), 00194 X86_INTRINSIC_DATA(sse2_psubus_b, INTR_TYPE_2OP, X86ISD::SUBUS, 0), 00195 X86_INTRINSIC_DATA(sse2_psubus_w, INTR_TYPE_2OP, X86ISD::SUBUS, 0), 00196 X86_INTRINSIC_DATA(sse2_sqrt_pd, INTR_TYPE_1OP, ISD::FSQRT, 0), 00197 X86_INTRINSIC_DATA(sse2_ucomieq_sd, COMI, X86ISD::UCOMI, ISD::SETEQ), 00198 X86_INTRINSIC_DATA(sse2_ucomige_sd, COMI, X86ISD::UCOMI, ISD::SETGE), 00199 X86_INTRINSIC_DATA(sse2_ucomigt_sd, COMI, X86ISD::UCOMI, ISD::SETGT), 00200 X86_INTRINSIC_DATA(sse2_ucomile_sd, COMI, X86ISD::UCOMI, ISD::SETLE), 00201 X86_INTRINSIC_DATA(sse2_ucomilt_sd, COMI, X86ISD::UCOMI, ISD::SETLT), 00202 X86_INTRINSIC_DATA(sse2_ucomineq_sd, COMI, X86ISD::UCOMI, ISD::SETNE), 00203 X86_INTRINSIC_DATA(sse3_hadd_pd, INTR_TYPE_2OP, X86ISD::FHADD, 0), 00204 X86_INTRINSIC_DATA(sse3_hadd_ps, INTR_TYPE_2OP, X86ISD::FHADD, 0), 00205 X86_INTRINSIC_DATA(sse3_hsub_pd, INTR_TYPE_2OP, X86ISD::FHSUB, 0), 00206 X86_INTRINSIC_DATA(sse3_hsub_ps, INTR_TYPE_2OP, X86ISD::FHSUB, 0), 00207 X86_INTRINSIC_DATA(sse41_insertps, INTR_TYPE_3OP, X86ISD::INSERTPS, 0), 00208 X86_INTRINSIC_DATA(sse41_pmaxsb, INTR_TYPE_2OP, X86ISD::SMAX, 0), 00209 X86_INTRINSIC_DATA(sse41_pmaxsd, INTR_TYPE_2OP, X86ISD::SMAX, 0), 00210 X86_INTRINSIC_DATA(sse41_pmaxud, INTR_TYPE_2OP, X86ISD::UMAX, 0), 00211 X86_INTRINSIC_DATA(sse41_pmaxuw, INTR_TYPE_2OP, X86ISD::UMAX, 0), 00212 X86_INTRINSIC_DATA(sse41_pminsb, INTR_TYPE_2OP, X86ISD::SMIN, 0), 00213 X86_INTRINSIC_DATA(sse41_pminsd, INTR_TYPE_2OP, X86ISD::SMIN, 0), 00214 X86_INTRINSIC_DATA(sse41_pminud, INTR_TYPE_2OP, X86ISD::UMIN, 0), 00215 X86_INTRINSIC_DATA(sse41_pminuw, INTR_TYPE_2OP, X86ISD::UMIN, 0), 00216 X86_INTRINSIC_DATA(sse_comieq_ss, COMI, X86ISD::COMI, ISD::SETEQ), 00217 X86_INTRINSIC_DATA(sse_comige_ss, COMI, X86ISD::COMI, ISD::SETGE), 00218 X86_INTRINSIC_DATA(sse_comigt_ss, COMI, X86ISD::COMI, ISD::SETGT), 00219 X86_INTRINSIC_DATA(sse_comile_ss, COMI, X86ISD::COMI, ISD::SETLE), 00220 X86_INTRINSIC_DATA(sse_comilt_ss, COMI, X86ISD::COMI, ISD::SETLT), 00221 X86_INTRINSIC_DATA(sse_comineq_ss, COMI, X86ISD::COMI, ISD::SETNE), 00222 X86_INTRINSIC_DATA(sse_sqrt_ps, INTR_TYPE_1OP, ISD::FSQRT, 0), 00223 X86_INTRINSIC_DATA(sse_ucomieq_ss, COMI, X86ISD::UCOMI, ISD::SETEQ), 00224 X86_INTRINSIC_DATA(sse_ucomige_ss, COMI, X86ISD::UCOMI, ISD::SETGE), 00225 X86_INTRINSIC_DATA(sse_ucomigt_ss, COMI, X86ISD::UCOMI, ISD::SETGT), 00226 X86_INTRINSIC_DATA(sse_ucomile_ss, COMI, X86ISD::UCOMI, ISD::SETLE), 00227 X86_INTRINSIC_DATA(sse_ucomilt_ss, COMI, X86ISD::UCOMI, ISD::SETLT), 00228 X86_INTRINSIC_DATA(sse_ucomineq_ss, COMI, X86ISD::UCOMI, ISD::SETNE), 00229 X86_INTRINSIC_DATA(ssse3_phadd_d_128, INTR_TYPE_2OP, X86ISD::HADD, 0), 00230 X86_INTRINSIC_DATA(ssse3_phadd_w_128, INTR_TYPE_2OP, X86ISD::HADD, 0), 00231 X86_INTRINSIC_DATA(ssse3_phsub_d_128, INTR_TYPE_2OP, X86ISD::HSUB, 0), 00232 X86_INTRINSIC_DATA(ssse3_phsub_w_128, INTR_TYPE_2OP, X86ISD::HSUB, 0) 00233 }; 00234 00235 /* 00236 * Retrieve data for Intrinsic without chain. 00237 * Return nullptr if intrinsic is not defined in the table. 00238 */ 00239 static const IntrinsicData* getIntrinsicWithoutChain(unsigned IntNo) { 00240 IntrinsicData IntrinsicToFind = { IntNo, INTR_NO_TYPE, 0, 0 }; 00241 const IntrinsicData *Data = std::lower_bound(std::begin(IntrinsicsWithoutChain), 00242 std::end(IntrinsicsWithoutChain), 00243 IntrinsicToFind); 00244 if (Data != std::end(IntrinsicsWithoutChain) && *Data == IntrinsicToFind) 00245 return Data; 00246 return nullptr; 00247 } 00248 00249 static void verifyIntrinsicTables() { 00250 assert(std::is_sorted(std::begin(IntrinsicsWithoutChain), 00251 std::end(IntrinsicsWithoutChain)) && 00252 std::is_sorted(std::begin(IntrinsicsWithChain), 00253 std::end(IntrinsicsWithChain)) && 00254 "Intrinsic data tables should be sorted by Intrinsic ID"); 00255 } 00256 00257 } // End llvm namespace 00258 00259 #endif