1*0fca6ea1SDimitry Andric //===------ SemaX86.cpp ---------- X86 target-specific routines -----------===// 2*0fca6ea1SDimitry Andric // 3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0fca6ea1SDimitry Andric // 7*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 8*0fca6ea1SDimitry Andric // 9*0fca6ea1SDimitry Andric // This file implements semantic analysis functions specific to X86. 10*0fca6ea1SDimitry Andric // 11*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 12*0fca6ea1SDimitry Andric 13*0fca6ea1SDimitry Andric #include "clang/Sema/SemaX86.h" 14*0fca6ea1SDimitry Andric #include "clang/Basic/DiagnosticSema.h" 15*0fca6ea1SDimitry Andric #include "clang/Basic/TargetBuiltins.h" 16*0fca6ea1SDimitry Andric #include "clang/Sema/Attr.h" 17*0fca6ea1SDimitry Andric #include "clang/Sema/ParsedAttr.h" 18*0fca6ea1SDimitry Andric #include "clang/Sema/Sema.h" 19*0fca6ea1SDimitry Andric #include "llvm/ADT/APSInt.h" 20*0fca6ea1SDimitry Andric #include "llvm/TargetParser/Triple.h" 21*0fca6ea1SDimitry Andric #include <bitset> 22*0fca6ea1SDimitry Andric 23*0fca6ea1SDimitry Andric namespace clang { 24*0fca6ea1SDimitry Andric 25*0fca6ea1SDimitry Andric SemaX86::SemaX86(Sema &S) : SemaBase(S) {} 26*0fca6ea1SDimitry Andric 27*0fca6ea1SDimitry Andric // Check if the rounding mode is legal. 28*0fca6ea1SDimitry Andric bool SemaX86::CheckBuiltinRoundingOrSAE(unsigned BuiltinID, CallExpr *TheCall) { 29*0fca6ea1SDimitry Andric // Indicates if this instruction has rounding control or just SAE. 30*0fca6ea1SDimitry Andric bool HasRC = false; 31*0fca6ea1SDimitry Andric 32*0fca6ea1SDimitry Andric unsigned ArgNum = 0; 33*0fca6ea1SDimitry Andric switch (BuiltinID) { 34*0fca6ea1SDimitry Andric default: 35*0fca6ea1SDimitry Andric return false; 36*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttsd2si32: 37*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttsd2si64: 38*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttsd2usi32: 39*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttsd2usi64: 40*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttss2si32: 41*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttss2si64: 42*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttss2usi32: 43*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttss2usi64: 44*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttsh2si32: 45*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttsh2si64: 46*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttsh2usi32: 47*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttsh2usi64: 48*0fca6ea1SDimitry Andric ArgNum = 1; 49*0fca6ea1SDimitry Andric break; 50*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_maxpd512: 51*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_maxps512: 52*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_minpd512: 53*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_minps512: 54*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_maxph512: 55*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_minph512: 56*0fca6ea1SDimitry Andric ArgNum = 2; 57*0fca6ea1SDimitry Andric break; 58*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtph2pd512_mask: 59*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtph2psx512_mask: 60*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtps2pd512_mask: 61*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvttpd2dq512_mask: 62*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvttpd2qq512_mask: 63*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvttpd2udq512_mask: 64*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvttpd2uqq512_mask: 65*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvttps2dq512_mask: 66*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvttps2qq512_mask: 67*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvttps2udq512_mask: 68*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvttps2uqq512_mask: 69*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttph2w512_mask: 70*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttph2uw512_mask: 71*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttph2dq512_mask: 72*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttph2udq512_mask: 73*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttph2qq512_mask: 74*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvttph2uqq512_mask: 75*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getexppd512_mask: 76*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getexpps512_mask: 77*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getexpph512_mask: 78*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcomisd: 79*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcomiss: 80*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcomish: 81*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtph2ps512_mask: 82*0fca6ea1SDimitry Andric ArgNum = 3; 83*0fca6ea1SDimitry Andric break; 84*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmppd512_mask: 85*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpps512_mask: 86*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpsd_mask: 87*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpss_mask: 88*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpsh_mask: 89*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtsh2sd_round_mask: 90*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtsh2ss_round_mask: 91*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtss2sd_round_mask: 92*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getexpsd128_round_mask: 93*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getexpss128_round_mask: 94*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getexpsh128_round_mask: 95*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantpd512_mask: 96*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantps512_mask: 97*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantph512_mask: 98*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_maxsd_round_mask: 99*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_maxss_round_mask: 100*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_maxsh_round_mask: 101*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_minsd_round_mask: 102*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_minss_round_mask: 103*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_minsh_round_mask: 104*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reducepd512_mask: 105*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reduceps512_mask: 106*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reduceph512_mask: 107*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscalepd_mask: 108*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscaleps_mask: 109*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscaleph_mask: 110*0fca6ea1SDimitry Andric ArgNum = 4; 111*0fca6ea1SDimitry Andric break; 112*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmpd512_mask: 113*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmpd512_maskz: 114*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmps512_mask: 115*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmps512_maskz: 116*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmsd_mask: 117*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmsd_maskz: 118*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmss_mask: 119*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmss_maskz: 120*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantsd_round_mask: 121*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantss_round_mask: 122*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantsh_round_mask: 123*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rangepd512_mask: 124*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rangeps512_mask: 125*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rangesd128_round_mask: 126*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rangess128_round_mask: 127*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reducesd_mask: 128*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reducess_mask: 129*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reducesh_mask: 130*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscalesd_round_mask: 131*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscaless_round_mask: 132*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscalesh_round_mask: 133*0fca6ea1SDimitry Andric ArgNum = 5; 134*0fca6ea1SDimitry Andric break; 135*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtsd2si64: 136*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtsd2si32: 137*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtsd2usi32: 138*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtsd2usi64: 139*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtss2si32: 140*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtss2si64: 141*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtss2usi32: 142*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtss2usi64: 143*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtsh2si32: 144*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtsh2si64: 145*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtsh2usi32: 146*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtsh2usi64: 147*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_sqrtpd512: 148*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_sqrtps512: 149*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_sqrtph512: 150*0fca6ea1SDimitry Andric ArgNum = 1; 151*0fca6ea1SDimitry Andric HasRC = true; 152*0fca6ea1SDimitry Andric break; 153*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_addph512: 154*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_divph512: 155*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_mulph512: 156*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_subph512: 157*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_addpd512: 158*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_addps512: 159*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_divpd512: 160*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_divps512: 161*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_mulpd512: 162*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_mulps512: 163*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_subpd512: 164*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_subps512: 165*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtsi2sd64: 166*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtsi2ss32: 167*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtsi2ss64: 168*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtusi2sd64: 169*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtusi2ss32: 170*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtusi2ss64: 171*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtusi2sh: 172*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtusi642sh: 173*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtsi2sh: 174*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtsi642sh: 175*0fca6ea1SDimitry Andric ArgNum = 2; 176*0fca6ea1SDimitry Andric HasRC = true; 177*0fca6ea1SDimitry Andric break; 178*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtdq2ps512_mask: 179*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtudq2ps512_mask: 180*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtpd2ph512_mask: 181*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtps2phx512_mask: 182*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtpd2ps512_mask: 183*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtpd2dq512_mask: 184*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtpd2qq512_mask: 185*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtpd2udq512_mask: 186*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtpd2uqq512_mask: 187*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtps2dq512_mask: 188*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtps2qq512_mask: 189*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtps2udq512_mask: 190*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtps2uqq512_mask: 191*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtqq2pd512_mask: 192*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtqq2ps512_mask: 193*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtuqq2pd512_mask: 194*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtuqq2ps512_mask: 195*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtdq2ph512_mask: 196*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtudq2ph512_mask: 197*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtw2ph512_mask: 198*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtuw2ph512_mask: 199*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtph2w512_mask: 200*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtph2uw512_mask: 201*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtph2dq512_mask: 202*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtph2udq512_mask: 203*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtph2qq512_mask: 204*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtph2uqq512_mask: 205*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtqq2ph512_mask: 206*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtuqq2ph512_mask: 207*0fca6ea1SDimitry Andric ArgNum = 3; 208*0fca6ea1SDimitry Andric HasRC = true; 209*0fca6ea1SDimitry Andric break; 210*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_addsh_round_mask: 211*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_addss_round_mask: 212*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_addsd_round_mask: 213*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_divsh_round_mask: 214*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_divss_round_mask: 215*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_divsd_round_mask: 216*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_mulsh_round_mask: 217*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_mulss_round_mask: 218*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_mulsd_round_mask: 219*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_subsh_round_mask: 220*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_subss_round_mask: 221*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_subsd_round_mask: 222*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scalefph512_mask: 223*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scalefpd512_mask: 224*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scalefps512_mask: 225*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scalefsd_round_mask: 226*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scalefss_round_mask: 227*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scalefsh_round_mask: 228*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cvtsd2ss_round_mask: 229*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtss2sh_round_mask: 230*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtsd2sh_round_mask: 231*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_sqrtsd_round_mask: 232*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_sqrtss_round_mask: 233*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_sqrtsh_round_mask: 234*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddsd3_mask: 235*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddsd3_maskz: 236*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddsd3_mask3: 237*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddss3_mask: 238*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddss3_maskz: 239*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddss3_mask3: 240*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddsh3_mask: 241*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddsh3_maskz: 242*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddsh3_mask3: 243*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddpd512_mask: 244*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddpd512_maskz: 245*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddpd512_mask3: 246*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmsubpd512_mask3: 247*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddps512_mask: 248*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddps512_maskz: 249*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddps512_mask3: 250*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmsubps512_mask3: 251*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddph512_mask: 252*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddph512_maskz: 253*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddph512_mask3: 254*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmsubph512_mask3: 255*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddsubpd512_mask: 256*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddsubpd512_maskz: 257*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddsubpd512_mask3: 258*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmsubaddpd512_mask3: 259*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddsubps512_mask: 260*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddsubps512_maskz: 261*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddsubps512_mask3: 262*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmsubaddps512_mask3: 263*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddsubph512_mask: 264*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddsubph512_maskz: 265*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddsubph512_mask3: 266*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmsubaddph512_mask3: 267*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddcsh_mask: 268*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddcsh_round_mask: 269*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddcsh_round_mask3: 270*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddcph512_mask: 271*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddcph512_maskz: 272*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmaddcph512_mask3: 273*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfcmaddcsh_mask: 274*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfcmaddcsh_round_mask: 275*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfcmaddcsh_round_mask3: 276*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfcmaddcph512_mask: 277*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfcmaddcph512_maskz: 278*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfcmaddcph512_mask3: 279*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmulcsh_mask: 280*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfmulcph512_mask: 281*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfcmulcsh_mask: 282*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vfcmulcph512_mask: 283*0fca6ea1SDimitry Andric ArgNum = 4; 284*0fca6ea1SDimitry Andric HasRC = true; 285*0fca6ea1SDimitry Andric break; 286*0fca6ea1SDimitry Andric } 287*0fca6ea1SDimitry Andric 288*0fca6ea1SDimitry Andric llvm::APSInt Result; 289*0fca6ea1SDimitry Andric 290*0fca6ea1SDimitry Andric // We can't check the value of a dependent argument. 291*0fca6ea1SDimitry Andric Expr *Arg = TheCall->getArg(ArgNum); 292*0fca6ea1SDimitry Andric if (Arg->isTypeDependent() || Arg->isValueDependent()) 293*0fca6ea1SDimitry Andric return false; 294*0fca6ea1SDimitry Andric 295*0fca6ea1SDimitry Andric // Check constant-ness first. 296*0fca6ea1SDimitry Andric if (SemaRef.BuiltinConstantArg(TheCall, ArgNum, Result)) 297*0fca6ea1SDimitry Andric return true; 298*0fca6ea1SDimitry Andric 299*0fca6ea1SDimitry Andric // Make sure rounding mode is either ROUND_CUR_DIRECTION or ROUND_NO_EXC bit 300*0fca6ea1SDimitry Andric // is set. If the intrinsic has rounding control(bits 1:0), make sure its only 301*0fca6ea1SDimitry Andric // combined with ROUND_NO_EXC. If the intrinsic does not have rounding 302*0fca6ea1SDimitry Andric // control, allow ROUND_NO_EXC and ROUND_CUR_DIRECTION together. 303*0fca6ea1SDimitry Andric if (Result == 4 /*ROUND_CUR_DIRECTION*/ || Result == 8 /*ROUND_NO_EXC*/ || 304*0fca6ea1SDimitry Andric (!HasRC && Result == 12 /*ROUND_CUR_DIRECTION|ROUND_NO_EXC*/) || 305*0fca6ea1SDimitry Andric (HasRC && Result.getZExtValue() >= 8 && Result.getZExtValue() <= 11)) 306*0fca6ea1SDimitry Andric return false; 307*0fca6ea1SDimitry Andric 308*0fca6ea1SDimitry Andric return Diag(TheCall->getBeginLoc(), diag::err_x86_builtin_invalid_rounding) 309*0fca6ea1SDimitry Andric << Arg->getSourceRange(); 310*0fca6ea1SDimitry Andric } 311*0fca6ea1SDimitry Andric 312*0fca6ea1SDimitry Andric // Check if the gather/scatter scale is legal. 313*0fca6ea1SDimitry Andric bool SemaX86::CheckBuiltinGatherScatterScale(unsigned BuiltinID, 314*0fca6ea1SDimitry Andric CallExpr *TheCall) { 315*0fca6ea1SDimitry Andric unsigned ArgNum = 0; 316*0fca6ea1SDimitry Andric switch (BuiltinID) { 317*0fca6ea1SDimitry Andric default: 318*0fca6ea1SDimitry Andric return false; 319*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherd_pd: 320*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherd_pd256: 321*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherq_pd: 322*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherq_pd256: 323*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherd_ps: 324*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherd_ps256: 325*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherq_ps: 326*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherq_ps256: 327*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherd_q: 328*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherd_q256: 329*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherq_q: 330*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherq_q256: 331*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherd_d: 332*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherd_d256: 333*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherq_d: 334*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherq_d256: 335*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3div2df: 336*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3div2di: 337*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3div4df: 338*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3div4di: 339*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3div4sf: 340*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3div4si: 341*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3div8sf: 342*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3div8si: 343*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3siv2df: 344*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3siv2di: 345*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3siv4df: 346*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3siv4di: 347*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3siv4sf: 348*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3siv4si: 349*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3siv8sf: 350*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gather3siv8si: 351*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gathersiv8df: 352*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gathersiv16sf: 353*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherdiv8df: 354*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherdiv16sf: 355*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gathersiv8di: 356*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gathersiv16si: 357*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherdiv8di: 358*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_gatherdiv16si: 359*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scatterdiv2df: 360*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scatterdiv2di: 361*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scatterdiv4df: 362*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scatterdiv4di: 363*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scatterdiv4sf: 364*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scatterdiv4si: 365*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scatterdiv8sf: 366*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scatterdiv8si: 367*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scattersiv2df: 368*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scattersiv2di: 369*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scattersiv4df: 370*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scattersiv4di: 371*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scattersiv4sf: 372*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scattersiv4si: 373*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scattersiv8sf: 374*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scattersiv8si: 375*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scattersiv8df: 376*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scattersiv16sf: 377*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scatterdiv8df: 378*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scatterdiv16sf: 379*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scattersiv8di: 380*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scattersiv16si: 381*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scatterdiv8di: 382*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_scatterdiv16si: 383*0fca6ea1SDimitry Andric ArgNum = 4; 384*0fca6ea1SDimitry Andric break; 385*0fca6ea1SDimitry Andric } 386*0fca6ea1SDimitry Andric 387*0fca6ea1SDimitry Andric llvm::APSInt Result; 388*0fca6ea1SDimitry Andric 389*0fca6ea1SDimitry Andric // We can't check the value of a dependent argument. 390*0fca6ea1SDimitry Andric Expr *Arg = TheCall->getArg(ArgNum); 391*0fca6ea1SDimitry Andric if (Arg->isTypeDependent() || Arg->isValueDependent()) 392*0fca6ea1SDimitry Andric return false; 393*0fca6ea1SDimitry Andric 394*0fca6ea1SDimitry Andric // Check constant-ness first. 395*0fca6ea1SDimitry Andric if (SemaRef.BuiltinConstantArg(TheCall, ArgNum, Result)) 396*0fca6ea1SDimitry Andric return true; 397*0fca6ea1SDimitry Andric 398*0fca6ea1SDimitry Andric if (Result == 1 || Result == 2 || Result == 4 || Result == 8) 399*0fca6ea1SDimitry Andric return false; 400*0fca6ea1SDimitry Andric 401*0fca6ea1SDimitry Andric return Diag(TheCall->getBeginLoc(), diag::err_x86_builtin_invalid_scale) 402*0fca6ea1SDimitry Andric << Arg->getSourceRange(); 403*0fca6ea1SDimitry Andric } 404*0fca6ea1SDimitry Andric 405*0fca6ea1SDimitry Andric enum { TileRegLow = 0, TileRegHigh = 7 }; 406*0fca6ea1SDimitry Andric 407*0fca6ea1SDimitry Andric bool SemaX86::CheckBuiltinTileArgumentsRange(CallExpr *TheCall, 408*0fca6ea1SDimitry Andric ArrayRef<int> ArgNums) { 409*0fca6ea1SDimitry Andric for (int ArgNum : ArgNums) { 410*0fca6ea1SDimitry Andric if (SemaRef.BuiltinConstantArgRange(TheCall, ArgNum, TileRegLow, 411*0fca6ea1SDimitry Andric TileRegHigh)) 412*0fca6ea1SDimitry Andric return true; 413*0fca6ea1SDimitry Andric } 414*0fca6ea1SDimitry Andric return false; 415*0fca6ea1SDimitry Andric } 416*0fca6ea1SDimitry Andric 417*0fca6ea1SDimitry Andric bool SemaX86::CheckBuiltinTileDuplicate(CallExpr *TheCall, 418*0fca6ea1SDimitry Andric ArrayRef<int> ArgNums) { 419*0fca6ea1SDimitry Andric // Because the max number of tile register is TileRegHigh + 1, so here we use 420*0fca6ea1SDimitry Andric // each bit to represent the usage of them in bitset. 421*0fca6ea1SDimitry Andric std::bitset<TileRegHigh + 1> ArgValues; 422*0fca6ea1SDimitry Andric for (int ArgNum : ArgNums) { 423*0fca6ea1SDimitry Andric Expr *Arg = TheCall->getArg(ArgNum); 424*0fca6ea1SDimitry Andric if (Arg->isTypeDependent() || Arg->isValueDependent()) 425*0fca6ea1SDimitry Andric continue; 426*0fca6ea1SDimitry Andric 427*0fca6ea1SDimitry Andric llvm::APSInt Result; 428*0fca6ea1SDimitry Andric if (SemaRef.BuiltinConstantArg(TheCall, ArgNum, Result)) 429*0fca6ea1SDimitry Andric return true; 430*0fca6ea1SDimitry Andric int ArgExtValue = Result.getExtValue(); 431*0fca6ea1SDimitry Andric assert((ArgExtValue >= TileRegLow && ArgExtValue <= TileRegHigh) && 432*0fca6ea1SDimitry Andric "Incorrect tile register num."); 433*0fca6ea1SDimitry Andric if (ArgValues.test(ArgExtValue)) 434*0fca6ea1SDimitry Andric return Diag(TheCall->getBeginLoc(), 435*0fca6ea1SDimitry Andric diag::err_x86_builtin_tile_arg_duplicate) 436*0fca6ea1SDimitry Andric << TheCall->getArg(ArgNum)->getSourceRange(); 437*0fca6ea1SDimitry Andric ArgValues.set(ArgExtValue); 438*0fca6ea1SDimitry Andric } 439*0fca6ea1SDimitry Andric return false; 440*0fca6ea1SDimitry Andric } 441*0fca6ea1SDimitry Andric 442*0fca6ea1SDimitry Andric bool SemaX86::CheckBuiltinTileRangeAndDuplicate(CallExpr *TheCall, 443*0fca6ea1SDimitry Andric ArrayRef<int> ArgNums) { 444*0fca6ea1SDimitry Andric return CheckBuiltinTileArgumentsRange(TheCall, ArgNums) || 445*0fca6ea1SDimitry Andric CheckBuiltinTileDuplicate(TheCall, ArgNums); 446*0fca6ea1SDimitry Andric } 447*0fca6ea1SDimitry Andric 448*0fca6ea1SDimitry Andric bool SemaX86::CheckBuiltinTileArguments(unsigned BuiltinID, CallExpr *TheCall) { 449*0fca6ea1SDimitry Andric switch (BuiltinID) { 450*0fca6ea1SDimitry Andric default: 451*0fca6ea1SDimitry Andric return false; 452*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_tileloadd64: 453*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_tileloaddt164: 454*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_tilestored64: 455*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_tilezero: 456*0fca6ea1SDimitry Andric return CheckBuiltinTileArgumentsRange(TheCall, 0); 457*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_tdpbssd: 458*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_tdpbsud: 459*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_tdpbusd: 460*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_tdpbuud: 461*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_tdpbf16ps: 462*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_tdpfp16ps: 463*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_tcmmimfp16ps: 464*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_tcmmrlfp16ps: 465*0fca6ea1SDimitry Andric return CheckBuiltinTileRangeAndDuplicate(TheCall, {0, 1, 2}); 466*0fca6ea1SDimitry Andric } 467*0fca6ea1SDimitry Andric } 468*0fca6ea1SDimitry Andric static bool isX86_32Builtin(unsigned BuiltinID) { 469*0fca6ea1SDimitry Andric // These builtins only work on x86-32 targets. 470*0fca6ea1SDimitry Andric switch (BuiltinID) { 471*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_readeflags_u32: 472*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_writeeflags_u32: 473*0fca6ea1SDimitry Andric return true; 474*0fca6ea1SDimitry Andric } 475*0fca6ea1SDimitry Andric 476*0fca6ea1SDimitry Andric return false; 477*0fca6ea1SDimitry Andric } 478*0fca6ea1SDimitry Andric 479*0fca6ea1SDimitry Andric bool SemaX86::CheckBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, 480*0fca6ea1SDimitry Andric CallExpr *TheCall) { 481*0fca6ea1SDimitry Andric // Check for 32-bit only builtins on a 64-bit target. 482*0fca6ea1SDimitry Andric const llvm::Triple &TT = TI.getTriple(); 483*0fca6ea1SDimitry Andric if (TT.getArch() != llvm::Triple::x86 && isX86_32Builtin(BuiltinID)) 484*0fca6ea1SDimitry Andric return Diag(TheCall->getCallee()->getBeginLoc(), 485*0fca6ea1SDimitry Andric diag::err_32_bit_builtin_64_bit_tgt); 486*0fca6ea1SDimitry Andric 487*0fca6ea1SDimitry Andric // If the intrinsic has rounding or SAE make sure its valid. 488*0fca6ea1SDimitry Andric if (CheckBuiltinRoundingOrSAE(BuiltinID, TheCall)) 489*0fca6ea1SDimitry Andric return true; 490*0fca6ea1SDimitry Andric 491*0fca6ea1SDimitry Andric // If the intrinsic has a gather/scatter scale immediate make sure its valid. 492*0fca6ea1SDimitry Andric if (CheckBuiltinGatherScatterScale(BuiltinID, TheCall)) 493*0fca6ea1SDimitry Andric return true; 494*0fca6ea1SDimitry Andric 495*0fca6ea1SDimitry Andric // If the intrinsic has a tile arguments, make sure they are valid. 496*0fca6ea1SDimitry Andric if (CheckBuiltinTileArguments(BuiltinID, TheCall)) 497*0fca6ea1SDimitry Andric return true; 498*0fca6ea1SDimitry Andric 499*0fca6ea1SDimitry Andric // For intrinsics which take an immediate value as part of the instruction, 500*0fca6ea1SDimitry Andric // range check them here. 501*0fca6ea1SDimitry Andric int i = 0, l = 0, u = 0; 502*0fca6ea1SDimitry Andric switch (BuiltinID) { 503*0fca6ea1SDimitry Andric default: 504*0fca6ea1SDimitry Andric return false; 505*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_ext_v2si: 506*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_ext_v2di: 507*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vextractf128_pd256: 508*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vextractf128_ps256: 509*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vextractf128_si256: 510*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_extract128i256: 511*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_extractf64x4_mask: 512*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_extracti64x4_mask: 513*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_extractf32x8_mask: 514*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_extracti32x8_mask: 515*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_extractf64x2_256_mask: 516*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_extracti64x2_256_mask: 517*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_extractf32x4_256_mask: 518*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_extracti32x4_256_mask: 519*0fca6ea1SDimitry Andric i = 1; 520*0fca6ea1SDimitry Andric l = 0; 521*0fca6ea1SDimitry Andric u = 1; 522*0fca6ea1SDimitry Andric break; 523*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_set_v2di: 524*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vinsertf128_pd256: 525*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vinsertf128_ps256: 526*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vinsertf128_si256: 527*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_insert128i256: 528*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_insertf32x8: 529*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_inserti32x8: 530*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_insertf64x4: 531*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_inserti64x4: 532*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_insertf64x2_256: 533*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_inserti64x2_256: 534*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_insertf32x4_256: 535*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_inserti32x4_256: 536*0fca6ea1SDimitry Andric i = 2; 537*0fca6ea1SDimitry Andric l = 0; 538*0fca6ea1SDimitry Andric u = 1; 539*0fca6ea1SDimitry Andric break; 540*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpermilpd: 541*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_ext_v4hi: 542*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_ext_v4si: 543*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_ext_v4sf: 544*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_ext_v4di: 545*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_extractf32x4_mask: 546*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_extracti32x4_mask: 547*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_extractf64x2_512_mask: 548*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_extracti64x2_512_mask: 549*0fca6ea1SDimitry Andric i = 1; 550*0fca6ea1SDimitry Andric l = 0; 551*0fca6ea1SDimitry Andric u = 3; 552*0fca6ea1SDimitry Andric break; 553*0fca6ea1SDimitry Andric case X86::BI_mm_prefetch: 554*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_ext_v8hi: 555*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_ext_v8si: 556*0fca6ea1SDimitry Andric i = 1; 557*0fca6ea1SDimitry Andric l = 0; 558*0fca6ea1SDimitry Andric u = 7; 559*0fca6ea1SDimitry Andric break; 560*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_sha1rnds4: 561*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_blendpd: 562*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_shufpd: 563*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_set_v4hi: 564*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_set_v4si: 565*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_set_v4di: 566*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_shuf_f32x4_256: 567*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_shuf_f64x2_256: 568*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_shuf_i32x4_256: 569*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_shuf_i64x2_256: 570*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_insertf64x2_512: 571*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_inserti64x2_512: 572*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_insertf32x4: 573*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_inserti32x4: 574*0fca6ea1SDimitry Andric i = 2; 575*0fca6ea1SDimitry Andric l = 0; 576*0fca6ea1SDimitry Andric u = 3; 577*0fca6ea1SDimitry Andric break; 578*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpermil2pd: 579*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpermil2pd256: 580*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpermil2ps: 581*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpermil2ps256: 582*0fca6ea1SDimitry Andric i = 3; 583*0fca6ea1SDimitry Andric l = 0; 584*0fca6ea1SDimitry Andric u = 3; 585*0fca6ea1SDimitry Andric break; 586*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpb128_mask: 587*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpw128_mask: 588*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpd128_mask: 589*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpq128_mask: 590*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpb256_mask: 591*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpw256_mask: 592*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpd256_mask: 593*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpq256_mask: 594*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpb512_mask: 595*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpw512_mask: 596*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpd512_mask: 597*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpq512_mask: 598*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_ucmpb128_mask: 599*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_ucmpw128_mask: 600*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_ucmpd128_mask: 601*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_ucmpq128_mask: 602*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_ucmpb256_mask: 603*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_ucmpw256_mask: 604*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_ucmpd256_mask: 605*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_ucmpq256_mask: 606*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_ucmpb512_mask: 607*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_ucmpw512_mask: 608*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_ucmpd512_mask: 609*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_ucmpq512_mask: 610*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpcomub: 611*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpcomuw: 612*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpcomud: 613*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpcomuq: 614*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpcomb: 615*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpcomw: 616*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpcomd: 617*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpcomq: 618*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_set_v8hi: 619*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_set_v8si: 620*0fca6ea1SDimitry Andric i = 2; 621*0fca6ea1SDimitry Andric l = 0; 622*0fca6ea1SDimitry Andric u = 7; 623*0fca6ea1SDimitry Andric break; 624*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpermilpd256: 625*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_roundps: 626*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_roundpd: 627*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_roundps256: 628*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_roundpd256: 629*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantpd128_mask: 630*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantpd256_mask: 631*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantps128_mask: 632*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantps256_mask: 633*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantpd512_mask: 634*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantps512_mask: 635*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantph128_mask: 636*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantph256_mask: 637*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantph512_mask: 638*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_ext_v16qi: 639*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_ext_v16hi: 640*0fca6ea1SDimitry Andric i = 1; 641*0fca6ea1SDimitry Andric l = 0; 642*0fca6ea1SDimitry Andric u = 15; 643*0fca6ea1SDimitry Andric break; 644*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pblendd128: 645*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_blendps: 646*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_blendpd256: 647*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_shufpd256: 648*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_roundss: 649*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_roundsd: 650*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rangepd128_mask: 651*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rangepd256_mask: 652*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rangepd512_mask: 653*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rangeps128_mask: 654*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rangeps256_mask: 655*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rangeps512_mask: 656*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantsd_round_mask: 657*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantss_round_mask: 658*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_getmantsh_round_mask: 659*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_set_v16qi: 660*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_set_v16hi: 661*0fca6ea1SDimitry Andric i = 2; 662*0fca6ea1SDimitry Andric l = 0; 663*0fca6ea1SDimitry Andric u = 15; 664*0fca6ea1SDimitry Andric break; 665*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_ext_v32qi: 666*0fca6ea1SDimitry Andric i = 1; 667*0fca6ea1SDimitry Andric l = 0; 668*0fca6ea1SDimitry Andric u = 31; 669*0fca6ea1SDimitry Andric break; 670*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpps: 671*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpss: 672*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmppd: 673*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpsd: 674*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpps256: 675*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmppd256: 676*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpps128_mask: 677*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmppd128_mask: 678*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpps256_mask: 679*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmppd256_mask: 680*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpps512_mask: 681*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmppd512_mask: 682*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpsd_mask: 683*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpss_mask: 684*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vec_set_v32qi: 685*0fca6ea1SDimitry Andric i = 2; 686*0fca6ea1SDimitry Andric l = 0; 687*0fca6ea1SDimitry Andric u = 31; 688*0fca6ea1SDimitry Andric break; 689*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_permdf256: 690*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_permdi256: 691*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_permdf512: 692*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_permdi512: 693*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpermilps: 694*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpermilps256: 695*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpermilpd512: 696*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpermilps512: 697*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pshufd: 698*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pshufd256: 699*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pshufd512: 700*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pshufhw: 701*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pshufhw256: 702*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pshufhw512: 703*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pshuflw: 704*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pshuflw256: 705*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pshuflw512: 706*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtps2ph: 707*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtps2ph_mask: 708*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtps2ph256: 709*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtps2ph256_mask: 710*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcvtps2ph512_mask: 711*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscaleps_128_mask: 712*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscalepd_128_mask: 713*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscaleps_256_mask: 714*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscalepd_256_mask: 715*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscaleps_mask: 716*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscalepd_mask: 717*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscaleph_mask: 718*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reducepd128_mask: 719*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reducepd256_mask: 720*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reducepd512_mask: 721*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reduceps128_mask: 722*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reduceps256_mask: 723*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reduceps512_mask: 724*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reduceph128_mask: 725*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reduceph256_mask: 726*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reduceph512_mask: 727*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_prold512: 728*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_prolq512: 729*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_prold128: 730*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_prold256: 731*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_prolq128: 732*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_prolq256: 733*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_prord512: 734*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_prorq512: 735*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_prord128: 736*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_prord256: 737*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_prorq128: 738*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_prorq256: 739*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fpclasspd128_mask: 740*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fpclasspd256_mask: 741*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fpclassps128_mask: 742*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fpclassps256_mask: 743*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fpclassps512_mask: 744*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fpclasspd512_mask: 745*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fpclassph128_mask: 746*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fpclassph256_mask: 747*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fpclassph512_mask: 748*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fpclasssd_mask: 749*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fpclassss_mask: 750*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fpclasssh_mask: 751*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pslldqi128_byteshift: 752*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pslldqi256_byteshift: 753*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pslldqi512_byteshift: 754*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_psrldqi128_byteshift: 755*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_psrldqi256_byteshift: 756*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_psrldqi512_byteshift: 757*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_kshiftliqi: 758*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_kshiftlihi: 759*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_kshiftlisi: 760*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_kshiftlidi: 761*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_kshiftriqi: 762*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_kshiftrihi: 763*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_kshiftrisi: 764*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_kshiftridi: 765*0fca6ea1SDimitry Andric i = 1; 766*0fca6ea1SDimitry Andric l = 0; 767*0fca6ea1SDimitry Andric u = 255; 768*0fca6ea1SDimitry Andric break; 769*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vperm2f128_pd256: 770*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vperm2f128_ps256: 771*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vperm2f128_si256: 772*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_permti256: 773*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pblendw128: 774*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pblendw256: 775*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_blendps256: 776*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pblendd256: 777*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_palignr128: 778*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_palignr256: 779*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_palignr512: 780*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_alignq512: 781*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_alignd512: 782*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_alignd128: 783*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_alignd256: 784*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_alignq128: 785*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_alignq256: 786*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcomisd: 787*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vcomiss: 788*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_shuf_f32x4: 789*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_shuf_f64x2: 790*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_shuf_i32x4: 791*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_shuf_i64x2: 792*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_shufpd512: 793*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_shufps: 794*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_shufps256: 795*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_shufps512: 796*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_dbpsadbw128: 797*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_dbpsadbw256: 798*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_dbpsadbw512: 799*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshldd128: 800*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshldd256: 801*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshldd512: 802*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshldq128: 803*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshldq256: 804*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshldq512: 805*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshldw128: 806*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshldw256: 807*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshldw512: 808*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshrdd128: 809*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshrdd256: 810*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshrdd512: 811*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshrdq128: 812*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshrdq256: 813*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshrdq512: 814*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshrdw128: 815*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshrdw256: 816*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vpshrdw512: 817*0fca6ea1SDimitry Andric i = 2; 818*0fca6ea1SDimitry Andric l = 0; 819*0fca6ea1SDimitry Andric u = 255; 820*0fca6ea1SDimitry Andric break; 821*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmpd512_mask: 822*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmpd512_maskz: 823*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmps512_mask: 824*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmps512_maskz: 825*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmsd_mask: 826*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmsd_maskz: 827*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmss_mask: 828*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmss_maskz: 829*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmpd128_mask: 830*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmpd128_maskz: 831*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmpd256_mask: 832*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmpd256_maskz: 833*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmps128_mask: 834*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmps128_maskz: 835*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmps256_mask: 836*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_fixupimmps256_maskz: 837*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pternlogd512_mask: 838*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pternlogd512_maskz: 839*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pternlogq512_mask: 840*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pternlogq512_maskz: 841*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pternlogd128_mask: 842*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pternlogd128_maskz: 843*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pternlogd256_mask: 844*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pternlogd256_maskz: 845*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pternlogq128_mask: 846*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pternlogq128_maskz: 847*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pternlogq256_mask: 848*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_pternlogq256_maskz: 849*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_vsm3rnds2: 850*0fca6ea1SDimitry Andric i = 3; 851*0fca6ea1SDimitry Andric l = 0; 852*0fca6ea1SDimitry Andric u = 255; 853*0fca6ea1SDimitry Andric break; 854*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reducesd_mask: 855*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reducess_mask: 856*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscalesd_round_mask: 857*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscaless_round_mask: 858*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_rndscalesh_round_mask: 859*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_reducesh_mask: 860*0fca6ea1SDimitry Andric i = 4; 861*0fca6ea1SDimitry Andric l = 0; 862*0fca6ea1SDimitry Andric u = 255; 863*0fca6ea1SDimitry Andric break; 864*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpccxadd32: 865*0fca6ea1SDimitry Andric case X86::BI__builtin_ia32_cmpccxadd64: 866*0fca6ea1SDimitry Andric i = 3; 867*0fca6ea1SDimitry Andric l = 0; 868*0fca6ea1SDimitry Andric u = 15; 869*0fca6ea1SDimitry Andric break; 870*0fca6ea1SDimitry Andric } 871*0fca6ea1SDimitry Andric 872*0fca6ea1SDimitry Andric // Note that we don't force a hard error on the range check here, allowing 873*0fca6ea1SDimitry Andric // template-generated or macro-generated dead code to potentially have out-of- 874*0fca6ea1SDimitry Andric // range values. These need to code generate, but don't need to necessarily 875*0fca6ea1SDimitry Andric // make any sense. We use a warning that defaults to an error. 876*0fca6ea1SDimitry Andric return SemaRef.BuiltinConstantArgRange(TheCall, i, l, u, 877*0fca6ea1SDimitry Andric /*RangeIsError*/ false); 878*0fca6ea1SDimitry Andric } 879*0fca6ea1SDimitry Andric 880*0fca6ea1SDimitry Andric void SemaX86::handleAnyInterruptAttr(Decl *D, const ParsedAttr &AL) { 881*0fca6ea1SDimitry Andric // Semantic checks for a function with the 'interrupt' attribute. 882*0fca6ea1SDimitry Andric // a) Must be a function. 883*0fca6ea1SDimitry Andric // b) Must have the 'void' return type. 884*0fca6ea1SDimitry Andric // c) Must take 1 or 2 arguments. 885*0fca6ea1SDimitry Andric // d) The 1st argument must be a pointer. 886*0fca6ea1SDimitry Andric // e) The 2nd argument (if any) must be an unsigned integer. 887*0fca6ea1SDimitry Andric ASTContext &Context = getASTContext(); 888*0fca6ea1SDimitry Andric 889*0fca6ea1SDimitry Andric if (!isFuncOrMethodForAttrSubject(D) || !hasFunctionProto(D) || 890*0fca6ea1SDimitry Andric isInstanceMethod(D) || 891*0fca6ea1SDimitry Andric CXXMethodDecl::isStaticOverloadedOperator( 892*0fca6ea1SDimitry Andric cast<NamedDecl>(D)->getDeclName().getCXXOverloadedOperator())) { 893*0fca6ea1SDimitry Andric Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type) 894*0fca6ea1SDimitry Andric << AL << AL.isRegularKeywordAttribute() 895*0fca6ea1SDimitry Andric << ExpectedFunctionWithProtoType; 896*0fca6ea1SDimitry Andric return; 897*0fca6ea1SDimitry Andric } 898*0fca6ea1SDimitry Andric // Interrupt handler must have void return type. 899*0fca6ea1SDimitry Andric if (!getFunctionOrMethodResultType(D)->isVoidType()) { 900*0fca6ea1SDimitry Andric Diag(getFunctionOrMethodResultSourceRange(D).getBegin(), 901*0fca6ea1SDimitry Andric diag::err_anyx86_interrupt_attribute) 902*0fca6ea1SDimitry Andric << (SemaRef.Context.getTargetInfo().getTriple().getArch() == 903*0fca6ea1SDimitry Andric llvm::Triple::x86 904*0fca6ea1SDimitry Andric ? 0 905*0fca6ea1SDimitry Andric : 1) 906*0fca6ea1SDimitry Andric << 0; 907*0fca6ea1SDimitry Andric return; 908*0fca6ea1SDimitry Andric } 909*0fca6ea1SDimitry Andric // Interrupt handler must have 1 or 2 parameters. 910*0fca6ea1SDimitry Andric unsigned NumParams = getFunctionOrMethodNumParams(D); 911*0fca6ea1SDimitry Andric if (NumParams < 1 || NumParams > 2) { 912*0fca6ea1SDimitry Andric Diag(D->getBeginLoc(), diag::err_anyx86_interrupt_attribute) 913*0fca6ea1SDimitry Andric << (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86 914*0fca6ea1SDimitry Andric ? 0 915*0fca6ea1SDimitry Andric : 1) 916*0fca6ea1SDimitry Andric << 1; 917*0fca6ea1SDimitry Andric return; 918*0fca6ea1SDimitry Andric } 919*0fca6ea1SDimitry Andric // The first argument must be a pointer. 920*0fca6ea1SDimitry Andric if (!getFunctionOrMethodParamType(D, 0)->isPointerType()) { 921*0fca6ea1SDimitry Andric Diag(getFunctionOrMethodParamRange(D, 0).getBegin(), 922*0fca6ea1SDimitry Andric diag::err_anyx86_interrupt_attribute) 923*0fca6ea1SDimitry Andric << (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86 924*0fca6ea1SDimitry Andric ? 0 925*0fca6ea1SDimitry Andric : 1) 926*0fca6ea1SDimitry Andric << 2; 927*0fca6ea1SDimitry Andric return; 928*0fca6ea1SDimitry Andric } 929*0fca6ea1SDimitry Andric // The second argument, if present, must be an unsigned integer. 930*0fca6ea1SDimitry Andric unsigned TypeSize = 931*0fca6ea1SDimitry Andric Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86_64 932*0fca6ea1SDimitry Andric ? 64 933*0fca6ea1SDimitry Andric : 32; 934*0fca6ea1SDimitry Andric if (NumParams == 2 && 935*0fca6ea1SDimitry Andric (!getFunctionOrMethodParamType(D, 1)->isUnsignedIntegerType() || 936*0fca6ea1SDimitry Andric Context.getTypeSize(getFunctionOrMethodParamType(D, 1)) != TypeSize)) { 937*0fca6ea1SDimitry Andric Diag(getFunctionOrMethodParamRange(D, 1).getBegin(), 938*0fca6ea1SDimitry Andric diag::err_anyx86_interrupt_attribute) 939*0fca6ea1SDimitry Andric << (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86 940*0fca6ea1SDimitry Andric ? 0 941*0fca6ea1SDimitry Andric : 1) 942*0fca6ea1SDimitry Andric << 3 << Context.getIntTypeForBitwidth(TypeSize, /*Signed=*/false); 943*0fca6ea1SDimitry Andric return; 944*0fca6ea1SDimitry Andric } 945*0fca6ea1SDimitry Andric D->addAttr(::new (Context) AnyX86InterruptAttr(Context, AL)); 946*0fca6ea1SDimitry Andric D->addAttr(UsedAttr::CreateImplicit(Context)); 947*0fca6ea1SDimitry Andric } 948*0fca6ea1SDimitry Andric 949*0fca6ea1SDimitry Andric void SemaX86::handleForceAlignArgPointerAttr(Decl *D, const ParsedAttr &AL) { 950*0fca6ea1SDimitry Andric // If we try to apply it to a function pointer, don't warn, but don't 951*0fca6ea1SDimitry Andric // do anything, either. It doesn't matter anyway, because there's nothing 952*0fca6ea1SDimitry Andric // special about calling a force_align_arg_pointer function. 953*0fca6ea1SDimitry Andric const auto *VD = dyn_cast<ValueDecl>(D); 954*0fca6ea1SDimitry Andric if (VD && VD->getType()->isFunctionPointerType()) 955*0fca6ea1SDimitry Andric return; 956*0fca6ea1SDimitry Andric // Also don't warn on function pointer typedefs. 957*0fca6ea1SDimitry Andric const auto *TD = dyn_cast<TypedefNameDecl>(D); 958*0fca6ea1SDimitry Andric if (TD && (TD->getUnderlyingType()->isFunctionPointerType() || 959*0fca6ea1SDimitry Andric TD->getUnderlyingType()->isFunctionType())) 960*0fca6ea1SDimitry Andric return; 961*0fca6ea1SDimitry Andric // Attribute can only be applied to function types. 962*0fca6ea1SDimitry Andric if (!isa<FunctionDecl>(D)) { 963*0fca6ea1SDimitry Andric Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type) 964*0fca6ea1SDimitry Andric << AL << AL.isRegularKeywordAttribute() << ExpectedFunction; 965*0fca6ea1SDimitry Andric return; 966*0fca6ea1SDimitry Andric } 967*0fca6ea1SDimitry Andric 968*0fca6ea1SDimitry Andric D->addAttr(::new (getASTContext()) 969*0fca6ea1SDimitry Andric X86ForceAlignArgPointerAttr(getASTContext(), AL)); 970*0fca6ea1SDimitry Andric } 971*0fca6ea1SDimitry Andric 972*0fca6ea1SDimitry Andric } // namespace clang 973