1781b1353SVlad Serebrennikov //===------ SemaX86.cpp ---------- X86 target-specific routines -----------===// 2781b1353SVlad Serebrennikov // 3781b1353SVlad Serebrennikov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4781b1353SVlad Serebrennikov // See https://llvm.org/LICENSE.txt for license information. 5781b1353SVlad Serebrennikov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6781b1353SVlad Serebrennikov // 7781b1353SVlad Serebrennikov //===----------------------------------------------------------------------===// 8781b1353SVlad Serebrennikov // 9781b1353SVlad Serebrennikov // This file implements semantic analysis functions specific to X86. 10781b1353SVlad Serebrennikov // 11781b1353SVlad Serebrennikov //===----------------------------------------------------------------------===// 12781b1353SVlad Serebrennikov 13781b1353SVlad Serebrennikov #include "clang/Sema/SemaX86.h" 14781b1353SVlad Serebrennikov #include "clang/Basic/DiagnosticSema.h" 15781b1353SVlad Serebrennikov #include "clang/Basic/TargetBuiltins.h" 1627d37ee4SVlad Serebrennikov #include "clang/Basic/TargetInfo.h" 176b755b0cSVlad Serebrennikov #include "clang/Sema/Attr.h" 186b755b0cSVlad Serebrennikov #include "clang/Sema/ParsedAttr.h" 19781b1353SVlad Serebrennikov #include "clang/Sema/Sema.h" 20781b1353SVlad Serebrennikov #include "llvm/ADT/APSInt.h" 21781b1353SVlad Serebrennikov #include "llvm/TargetParser/Triple.h" 22781b1353SVlad Serebrennikov #include <bitset> 23781b1353SVlad Serebrennikov 24781b1353SVlad Serebrennikov namespace clang { 25781b1353SVlad Serebrennikov 26781b1353SVlad Serebrennikov SemaX86::SemaX86(Sema &S) : SemaBase(S) {} 27781b1353SVlad Serebrennikov 28781b1353SVlad Serebrennikov // Check if the rounding mode is legal. 29781b1353SVlad Serebrennikov bool SemaX86::CheckBuiltinRoundingOrSAE(unsigned BuiltinID, CallExpr *TheCall) { 30781b1353SVlad Serebrennikov // Indicates if this instruction has rounding control or just SAE. 31781b1353SVlad Serebrennikov bool HasRC = false; 32781b1353SVlad Serebrennikov 33781b1353SVlad Serebrennikov unsigned ArgNum = 0; 34781b1353SVlad Serebrennikov switch (BuiltinID) { 35781b1353SVlad Serebrennikov default: 36781b1353SVlad Serebrennikov return false; 37781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttsd2si32: 38781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttsd2si64: 39781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttsd2usi32: 40781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttsd2usi64: 41781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttss2si32: 42781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttss2si64: 43781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttss2usi32: 44781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttss2usi64: 45781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttsh2si32: 46781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttsh2si64: 47781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttsh2usi32: 48781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttsh2usi64: 49a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttsd2sis32: 50a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttsd2usis32: 51a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttss2sis32: 52a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttss2usis32: 53a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttsd2sis64: 54a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttsd2usis64: 55a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttss2sis64: 56a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttss2usis64: 57781b1353SVlad Serebrennikov ArgNum = 1; 58781b1353SVlad Serebrennikov break; 59781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_maxpd512: 60781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_maxps512: 61781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_minpd512: 62781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_minps512: 63781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_maxph512: 64781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_minph512: 650dba5381SPhoebe Wang case X86::BI__builtin_ia32_vmaxpd256_round: 660dba5381SPhoebe Wang case X86::BI__builtin_ia32_vmaxps256_round: 670dba5381SPhoebe Wang case X86::BI__builtin_ia32_vminpd256_round: 680dba5381SPhoebe Wang case X86::BI__builtin_ia32_vminps256_round: 690dba5381SPhoebe Wang case X86::BI__builtin_ia32_vmaxph256_round: 700dba5381SPhoebe Wang case X86::BI__builtin_ia32_vminph256_round: 71781b1353SVlad Serebrennikov ArgNum = 2; 72781b1353SVlad Serebrennikov break; 73781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtph2pd512_mask: 74781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtph2psx512_mask: 75781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtps2pd512_mask: 76781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvttpd2dq512_mask: 77781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvttpd2qq512_mask: 78781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvttpd2udq512_mask: 79781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvttpd2uqq512_mask: 80781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvttps2dq512_mask: 81781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvttps2qq512_mask: 82781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvttps2udq512_mask: 83781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvttps2uqq512_mask: 84781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttph2w512_mask: 85781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttph2uw512_mask: 86781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttph2dq512_mask: 87781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttph2udq512_mask: 88781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttph2qq512_mask: 89781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvttph2uqq512_mask: 90781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getexppd512_mask: 91781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getexpps512_mask: 92781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getexpph512_mask: 93781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcomisd: 94781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcomiss: 95781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcomish: 96781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtph2ps512_mask: 970dba5381SPhoebe Wang case X86::BI__builtin_ia32_vgetexppd256_round_mask: 980dba5381SPhoebe Wang case X86::BI__builtin_ia32_vgetexpps256_round_mask: 990dba5381SPhoebe Wang case X86::BI__builtin_ia32_vgetexpph256_round_mask: 10080721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvttph2ibs256_mask: 10180721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvttph2iubs256_mask: 10280721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvttps2ibs256_mask: 10380721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvttps2iubs256_mask: 10480721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvttph2ibs512_mask: 10580721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvttph2iubs512_mask: 10680721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvttps2ibs512_mask: 10780721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvttps2iubs512_mask: 108781b1353SVlad Serebrennikov ArgNum = 3; 109781b1353SVlad Serebrennikov break; 110781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmppd512_mask: 111781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpps512_mask: 1120dba5381SPhoebe Wang case X86::BI__builtin_ia32_cmpph512_mask: 1130dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcmppd256_round_mask: 1140dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcmpps256_round_mask: 1150dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcmpph256_round_mask: 116781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpsd_mask: 117781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpss_mask: 118781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpsh_mask: 119781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtsh2sd_round_mask: 120781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtsh2ss_round_mask: 121781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtss2sd_round_mask: 122781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getexpsd128_round_mask: 123781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getexpss128_round_mask: 124781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getexpsh128_round_mask: 125781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantpd512_mask: 126781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantps512_mask: 127781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantph512_mask: 1280dba5381SPhoebe Wang case X86::BI__builtin_ia32_vgetmantpd256_round_mask: 1290dba5381SPhoebe Wang case X86::BI__builtin_ia32_vgetmantps256_round_mask: 1300dba5381SPhoebe Wang case X86::BI__builtin_ia32_vgetmantph256_round_mask: 131781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_maxsd_round_mask: 132781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_maxss_round_mask: 133781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_maxsh_round_mask: 134781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_minsd_round_mask: 135781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_minss_round_mask: 136781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_minsh_round_mask: 137781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reducepd512_mask: 138781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reduceps512_mask: 139781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reduceph512_mask: 140781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscalepd_mask: 141781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscaleps_mask: 142781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscaleph_mask: 1430dba5381SPhoebe Wang case X86::BI__builtin_ia32_vreducepd256_round_mask: 1440dba5381SPhoebe Wang case X86::BI__builtin_ia32_vreduceps256_round_mask: 1450dba5381SPhoebe Wang case X86::BI__builtin_ia32_vreduceph256_round_mask: 1460dba5381SPhoebe Wang case X86::BI__builtin_ia32_vrndscalepd256_round_mask: 1470dba5381SPhoebe Wang case X86::BI__builtin_ia32_vrndscaleps256_round_mask: 1480dba5381SPhoebe Wang case X86::BI__builtin_ia32_vrndscaleph256_round_mask: 149781b1353SVlad Serebrennikov ArgNum = 4; 150781b1353SVlad Serebrennikov break; 151781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmpd512_mask: 152781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmpd512_maskz: 153781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmps512_mask: 154781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmps512_maskz: 1550dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfixupimmpd256_round_mask: 1560dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfixupimmpd256_round_maskz: 1570dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfixupimmps256_round_mask: 1580dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfixupimmps256_round_maskz: 159781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmsd_mask: 160781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmsd_maskz: 161781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmss_mask: 162781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmss_maskz: 163781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantsd_round_mask: 164781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantss_round_mask: 165781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantsh_round_mask: 166781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rangepd512_mask: 167781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rangeps512_mask: 1680dba5381SPhoebe Wang case X86::BI__builtin_ia32_vrangepd256_round_mask: 1690dba5381SPhoebe Wang case X86::BI__builtin_ia32_vrangeps256_round_mask: 170781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rangesd128_round_mask: 171781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rangess128_round_mask: 172781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reducesd_mask: 173781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reducess_mask: 174781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reducesh_mask: 175781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscalesd_round_mask: 176781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscaless_round_mask: 177781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscalesh_round_mask: 1783d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxpd256_round_mask: 1793d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxps256_round_mask: 1803d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxph256_round_mask: 1813d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxpd512_round_mask: 1823d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxps512_round_mask: 1833d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxph512_round_mask: 1843d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxsd_round_mask: 1853d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxsh_round_mask: 1863d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxss_round_mask: 187781b1353SVlad Serebrennikov ArgNum = 5; 188781b1353SVlad Serebrennikov break; 189781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtsd2si64: 190781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtsd2si32: 191781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtsd2usi32: 192781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtsd2usi64: 193781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtss2si32: 194781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtss2si64: 195781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtss2usi32: 196781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtss2usi64: 197781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtsh2si32: 198781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtsh2si64: 199781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtsh2usi32: 200781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtsh2usi64: 201781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_sqrtpd512: 202781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_sqrtps512: 203781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_sqrtph512: 2040dba5381SPhoebe Wang case X86::BI__builtin_ia32_vsqrtpd256_round: 2050dba5381SPhoebe Wang case X86::BI__builtin_ia32_vsqrtps256_round: 2060dba5381SPhoebe Wang case X86::BI__builtin_ia32_vsqrtph256_round: 207781b1353SVlad Serebrennikov ArgNum = 1; 208781b1353SVlad Serebrennikov HasRC = true; 209781b1353SVlad Serebrennikov break; 210781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_addph512: 211781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_divph512: 212781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_mulph512: 213781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_subph512: 214781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_addpd512: 215781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_addps512: 216781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_divpd512: 217781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_divps512: 218781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_mulpd512: 219781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_mulps512: 220781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_subpd512: 221781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_subps512: 222259ca9eeSPhoebe Wang case X86::BI__builtin_ia32_vaddpd256_round: 223259ca9eeSPhoebe Wang case X86::BI__builtin_ia32_vaddph256_round: 224259ca9eeSPhoebe Wang case X86::BI__builtin_ia32_vaddps256_round: 2250dba5381SPhoebe Wang case X86::BI__builtin_ia32_vdivpd256_round: 2260dba5381SPhoebe Wang case X86::BI__builtin_ia32_vdivph256_round: 2270dba5381SPhoebe Wang case X86::BI__builtin_ia32_vdivps256_round: 2280dba5381SPhoebe Wang case X86::BI__builtin_ia32_vmulpd256_round: 2290dba5381SPhoebe Wang case X86::BI__builtin_ia32_vmulph256_round: 2300dba5381SPhoebe Wang case X86::BI__builtin_ia32_vmulps256_round: 2310dba5381SPhoebe Wang case X86::BI__builtin_ia32_vsubpd256_round: 2320dba5381SPhoebe Wang case X86::BI__builtin_ia32_vsubph256_round: 2330dba5381SPhoebe Wang case X86::BI__builtin_ia32_vsubps256_round: 234781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtsi2sd64: 235781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtsi2ss32: 236781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtsi2ss64: 237781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtusi2sd64: 238781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtusi2ss32: 239781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtusi2ss64: 240781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtusi2sh: 241781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtusi642sh: 242781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtsi2sh: 243781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtsi642sh: 244781b1353SVlad Serebrennikov ArgNum = 2; 245781b1353SVlad Serebrennikov HasRC = true; 246781b1353SVlad Serebrennikov break; 247781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtdq2ps512_mask: 248781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtudq2ps512_mask: 249781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtpd2ph512_mask: 250781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtps2phx512_mask: 251781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtpd2ps512_mask: 252781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtpd2dq512_mask: 253781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtpd2qq512_mask: 254781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtpd2udq512_mask: 255781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtpd2uqq512_mask: 256781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtps2dq512_mask: 257781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtps2qq512_mask: 258781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtps2udq512_mask: 259781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtps2uqq512_mask: 260781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtqq2pd512_mask: 261781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtqq2ps512_mask: 262781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtuqq2pd512_mask: 263781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtuqq2ps512_mask: 264781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtdq2ph512_mask: 265781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtudq2ph512_mask: 266781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtw2ph512_mask: 267781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtuw2ph512_mask: 268781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtph2w512_mask: 269781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtph2uw512_mask: 270781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtph2dq512_mask: 271781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtph2udq512_mask: 272781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtph2qq512_mask: 273781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtph2uqq512_mask: 274781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtqq2ph512_mask: 275781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtuqq2ph512_mask: 2760dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtph2pd256_round_mask: 2770dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtph2psx256_round_mask: 2780dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtps2pd256_round_mask: 2790dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvttpd2dq256_round_mask: 2800dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvttpd2qq256_round_mask: 2810dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvttpd2udq256_round_mask: 2820dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvttpd2uqq256_round_mask: 2830dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvttps2dq256_round_mask: 2840dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvttps2qq256_round_mask: 2850dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvttps2udq256_round_mask: 2860dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvttps2uqq256_round_mask: 2870dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvttph2w256_round_mask: 2880dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvttph2uw256_round_mask: 2890dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvttph2dq256_round_mask: 2900dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvttph2udq256_round_mask: 2910dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvttph2qq256_round_mask: 2920dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvttph2uqq256_round_mask: 2930dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtdq2ps256_round_mask: 2940dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtudq2ps256_round_mask: 2950dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtpd2ph256_round_mask: 2960dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtps2phx256_round_mask: 2970dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtpd2ps256_round_mask: 2980dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtpd2dq256_round_mask: 2990dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtpd2qq256_round_mask: 3000dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtpd2udq256_round_mask: 3010dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtpd2uqq256_round_mask: 3020dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtps2dq256_round_mask: 3030dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtps2qq256_round_mask: 3040dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtps2udq256_round_mask: 3050dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtps2uqq256_round_mask: 3060dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtqq2pd256_round_mask: 3070dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtqq2ps256_round_mask: 3080dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtuqq2pd256_round_mask: 3090dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtuqq2ps256_round_mask: 3100dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtdq2ph256_round_mask: 3110dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtudq2ph256_round_mask: 3120dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtw2ph256_round_mask: 3130dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtuw2ph256_round_mask: 3140dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtph2w256_round_mask: 3150dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtph2uw256_round_mask: 3160dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtph2dq256_round_mask: 3170dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtph2udq256_round_mask: 3180dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtph2qq256_round_mask: 3190dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtph2uqq256_round_mask: 3200dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtqq2ph256_round_mask: 3210dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcvtuqq2ph256_round_mask: 32280721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvtph2ibs256_mask: 32380721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvtph2iubs256_mask: 32480721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvtps2ibs256_mask: 32580721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvtps2iubs256_mask: 32680721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvtph2ibs512_mask: 32780721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvtph2iubs512_mask: 32880721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvtps2ibs512_mask: 32980721e0dSFreddy Ye case X86::BI__builtin_ia32_vcvtps2iubs512_mask: 330781b1353SVlad Serebrennikov ArgNum = 3; 331781b1353SVlad Serebrennikov HasRC = true; 332781b1353SVlad Serebrennikov break; 333781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_addsh_round_mask: 334781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_addss_round_mask: 335781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_addsd_round_mask: 336781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_divsh_round_mask: 337781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_divss_round_mask: 338781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_divsd_round_mask: 339781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_mulsh_round_mask: 340781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_mulss_round_mask: 341781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_mulsd_round_mask: 342781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_subsh_round_mask: 343781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_subss_round_mask: 344781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_subsd_round_mask: 345781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scalefph512_mask: 346781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scalefpd512_mask: 347781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scalefps512_mask: 3480dba5381SPhoebe Wang case X86::BI__builtin_ia32_vscalefph256_round_mask: 3490dba5381SPhoebe Wang case X86::BI__builtin_ia32_vscalefpd256_round_mask: 3500dba5381SPhoebe Wang case X86::BI__builtin_ia32_vscalefps256_round_mask: 351781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scalefsd_round_mask: 352781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scalefss_round_mask: 353781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scalefsh_round_mask: 354781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cvtsd2ss_round_mask: 355781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtss2sh_round_mask: 356781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtsd2sh_round_mask: 357781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_sqrtsd_round_mask: 358781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_sqrtss_round_mask: 359781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_sqrtsh_round_mask: 360781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddsd3_mask: 361781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddsd3_maskz: 362781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddsd3_mask3: 363781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddss3_mask: 364781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddss3_maskz: 365781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddss3_mask3: 366781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddsh3_mask: 367781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddsh3_maskz: 368781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddsh3_mask3: 369781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddpd512_mask: 370781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddpd512_maskz: 371781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddpd512_mask3: 372781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmsubpd512_mask3: 373781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddps512_mask: 374781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddps512_maskz: 375781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddps512_mask3: 376781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmsubps512_mask3: 377781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddph512_mask: 378781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddph512_maskz: 379781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddph512_mask3: 380781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmsubph512_mask3: 381781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddsubpd512_mask: 382781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddsubpd512_maskz: 383781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddsubpd512_mask3: 384781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmsubaddpd512_mask3: 385781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddsubps512_mask: 386781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddsubps512_maskz: 387781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddsubps512_mask3: 388781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmsubaddps512_mask3: 389781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddsubph512_mask: 390781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddsubph512_maskz: 391781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddsubph512_mask3: 392781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmsubaddph512_mask3: 3930dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddpd256_round_mask: 3940dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddpd256_round_maskz: 3950dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddpd256_round_mask3: 3960dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmsubpd256_round_mask3: 3970dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddps256_round_mask: 3980dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddps256_round_maskz: 3990dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddps256_round_mask3: 4000dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmsubps256_round_mask3: 4010dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddph256_round_mask: 4020dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddph256_round_maskz: 4030dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddph256_round_mask3: 4040dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmsubph256_round_mask3: 4050dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddsubpd256_round_mask: 4060dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddsubpd256_round_maskz: 4070dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddsubpd256_round_mask3: 4080dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmsubaddpd256_round_mask3: 4090dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddsubps256_round_mask: 4100dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddsubps256_round_maskz: 4110dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddsubps256_round_mask3: 4120dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmsubaddps256_round_mask3: 4130dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddsubph256_round_mask: 4140dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddsubph256_round_maskz: 4150dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddsubph256_round_mask3: 4160dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmsubaddph256_round_mask3: 4170dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddcph256_round_mask: 4180dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddcph256_round_maskz: 4190dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmaddcph256_round_mask3: 4200dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfcmaddcph256_round_mask: 4210dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfcmaddcph256_round_maskz: 4220dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfcmaddcph256_round_mask3: 4230dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfmulcph256_round_mask: 4240dba5381SPhoebe Wang case X86::BI__builtin_ia32_vfcmulcph256_round_mask: 425781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddcsh_mask: 426781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddcsh_round_mask: 427781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddcsh_round_mask3: 428781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddcph512_mask: 429781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddcph512_maskz: 430781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmaddcph512_mask3: 431781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfcmaddcsh_mask: 432781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfcmaddcsh_round_mask: 433781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfcmaddcsh_round_mask3: 434781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfcmaddcph512_mask: 435781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfcmaddcph512_maskz: 436781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfcmaddcph512_mask3: 437781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmulcsh_mask: 438781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfmulcph512_mask: 439781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfcmulcsh_mask: 440781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vfcmulcph512_mask: 4417c4cadfcSFreddy Ye case X86::BI__builtin_ia32_vcvt2ps2phx256_mask: 4427c4cadfcSFreddy Ye case X86::BI__builtin_ia32_vcvt2ps2phx512_mask: 443781b1353SVlad Serebrennikov ArgNum = 4; 444781b1353SVlad Serebrennikov HasRC = true; 445781b1353SVlad Serebrennikov break; 446a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttpd2dqs256_round_mask: 447a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttpd2dqs512_round_mask: 448a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttpd2udqs256_round_mask: 449a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttpd2udqs512_round_mask: 450a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttpd2qqs256_round_mask: 451a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttpd2qqs512_round_mask: 452a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttpd2uqqs256_round_mask: 453a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttpd2uqqs512_round_mask: 454a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttps2dqs256_round_mask: 455a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttps2dqs512_round_mask: 456a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttps2udqs256_round_mask: 457a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttps2udqs512_round_mask: 458a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttps2qqs256_round_mask: 459a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttps2qqs512_round_mask: 460a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttps2uqqs256_round_mask: 461a409ebc1SMalay Sanghi case X86::BI__builtin_ia32_vcvttps2uqqs512_round_mask: 462a409ebc1SMalay Sanghi ArgNum = 3; 463a409ebc1SMalay Sanghi break; 464781b1353SVlad Serebrennikov } 465781b1353SVlad Serebrennikov 466781b1353SVlad Serebrennikov llvm::APSInt Result; 467781b1353SVlad Serebrennikov 468781b1353SVlad Serebrennikov // We can't check the value of a dependent argument. 469781b1353SVlad Serebrennikov Expr *Arg = TheCall->getArg(ArgNum); 470781b1353SVlad Serebrennikov if (Arg->isTypeDependent() || Arg->isValueDependent()) 471781b1353SVlad Serebrennikov return false; 472781b1353SVlad Serebrennikov 473781b1353SVlad Serebrennikov // Check constant-ness first. 474781b1353SVlad Serebrennikov if (SemaRef.BuiltinConstantArg(TheCall, ArgNum, Result)) 475781b1353SVlad Serebrennikov return true; 476781b1353SVlad Serebrennikov 477781b1353SVlad Serebrennikov // Make sure rounding mode is either ROUND_CUR_DIRECTION or ROUND_NO_EXC bit 478781b1353SVlad Serebrennikov // is set. If the intrinsic has rounding control(bits 1:0), make sure its only 479781b1353SVlad Serebrennikov // combined with ROUND_NO_EXC. If the intrinsic does not have rounding 480781b1353SVlad Serebrennikov // control, allow ROUND_NO_EXC and ROUND_CUR_DIRECTION together. 481781b1353SVlad Serebrennikov if (Result == 4 /*ROUND_CUR_DIRECTION*/ || Result == 8 /*ROUND_NO_EXC*/ || 482781b1353SVlad Serebrennikov (!HasRC && Result == 12 /*ROUND_CUR_DIRECTION|ROUND_NO_EXC*/) || 483781b1353SVlad Serebrennikov (HasRC && Result.getZExtValue() >= 8 && Result.getZExtValue() <= 11)) 484781b1353SVlad Serebrennikov return false; 485781b1353SVlad Serebrennikov 486781b1353SVlad Serebrennikov return Diag(TheCall->getBeginLoc(), diag::err_x86_builtin_invalid_rounding) 487781b1353SVlad Serebrennikov << Arg->getSourceRange(); 488781b1353SVlad Serebrennikov } 489781b1353SVlad Serebrennikov 490781b1353SVlad Serebrennikov // Check if the gather/scatter scale is legal. 491781b1353SVlad Serebrennikov bool SemaX86::CheckBuiltinGatherScatterScale(unsigned BuiltinID, 492781b1353SVlad Serebrennikov CallExpr *TheCall) { 493781b1353SVlad Serebrennikov unsigned ArgNum = 0; 494781b1353SVlad Serebrennikov switch (BuiltinID) { 495781b1353SVlad Serebrennikov default: 496781b1353SVlad Serebrennikov return false; 497781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherd_pd: 498781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherd_pd256: 499781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherq_pd: 500781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherq_pd256: 501781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherd_ps: 502781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherd_ps256: 503781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherq_ps: 504781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherq_ps256: 505781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherd_q: 506781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherd_q256: 507781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherq_q: 508781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherq_q256: 509781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherd_d: 510781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherd_d256: 511781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherq_d: 512781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherq_d256: 513781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3div2df: 514781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3div2di: 515781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3div4df: 516781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3div4di: 517781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3div4sf: 518781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3div4si: 519781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3div8sf: 520781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3div8si: 521781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3siv2df: 522781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3siv2di: 523781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3siv4df: 524781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3siv4di: 525781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3siv4sf: 526781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3siv4si: 527781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3siv8sf: 528781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gather3siv8si: 529781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gathersiv8df: 530781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gathersiv16sf: 531781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherdiv8df: 532781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherdiv16sf: 533781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gathersiv8di: 534781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gathersiv16si: 535781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherdiv8di: 536781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_gatherdiv16si: 537781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scatterdiv2df: 538781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scatterdiv2di: 539781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scatterdiv4df: 540781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scatterdiv4di: 541781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scatterdiv4sf: 542781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scatterdiv4si: 543781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scatterdiv8sf: 544781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scatterdiv8si: 545781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scattersiv2df: 546781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scattersiv2di: 547781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scattersiv4df: 548781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scattersiv4di: 549781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scattersiv4sf: 550781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scattersiv4si: 551781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scattersiv8sf: 552781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scattersiv8si: 553781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scattersiv8df: 554781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scattersiv16sf: 555781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scatterdiv8df: 556781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scatterdiv16sf: 557781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scattersiv8di: 558781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scattersiv16si: 559781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scatterdiv8di: 560781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_scatterdiv16si: 561781b1353SVlad Serebrennikov ArgNum = 4; 562781b1353SVlad Serebrennikov break; 563781b1353SVlad Serebrennikov } 564781b1353SVlad Serebrennikov 565781b1353SVlad Serebrennikov llvm::APSInt Result; 566781b1353SVlad Serebrennikov 567781b1353SVlad Serebrennikov // We can't check the value of a dependent argument. 568781b1353SVlad Serebrennikov Expr *Arg = TheCall->getArg(ArgNum); 569781b1353SVlad Serebrennikov if (Arg->isTypeDependent() || Arg->isValueDependent()) 570781b1353SVlad Serebrennikov return false; 571781b1353SVlad Serebrennikov 572781b1353SVlad Serebrennikov // Check constant-ness first. 573781b1353SVlad Serebrennikov if (SemaRef.BuiltinConstantArg(TheCall, ArgNum, Result)) 574781b1353SVlad Serebrennikov return true; 575781b1353SVlad Serebrennikov 576781b1353SVlad Serebrennikov if (Result == 1 || Result == 2 || Result == 4 || Result == 8) 577781b1353SVlad Serebrennikov return false; 578781b1353SVlad Serebrennikov 579781b1353SVlad Serebrennikov return Diag(TheCall->getBeginLoc(), diag::err_x86_builtin_invalid_scale) 580781b1353SVlad Serebrennikov << Arg->getSourceRange(); 581781b1353SVlad Serebrennikov } 582781b1353SVlad Serebrennikov 583781b1353SVlad Serebrennikov enum { TileRegLow = 0, TileRegHigh = 7 }; 584781b1353SVlad Serebrennikov 585781b1353SVlad Serebrennikov bool SemaX86::CheckBuiltinTileArgumentsRange(CallExpr *TheCall, 586781b1353SVlad Serebrennikov ArrayRef<int> ArgNums) { 587781b1353SVlad Serebrennikov for (int ArgNum : ArgNums) { 588781b1353SVlad Serebrennikov if (SemaRef.BuiltinConstantArgRange(TheCall, ArgNum, TileRegLow, 589781b1353SVlad Serebrennikov TileRegHigh)) 590781b1353SVlad Serebrennikov return true; 591781b1353SVlad Serebrennikov } 592781b1353SVlad Serebrennikov return false; 593781b1353SVlad Serebrennikov } 594781b1353SVlad Serebrennikov 595781b1353SVlad Serebrennikov bool SemaX86::CheckBuiltinTileDuplicate(CallExpr *TheCall, 596781b1353SVlad Serebrennikov ArrayRef<int> ArgNums) { 597781b1353SVlad Serebrennikov // Because the max number of tile register is TileRegHigh + 1, so here we use 598781b1353SVlad Serebrennikov // each bit to represent the usage of them in bitset. 599781b1353SVlad Serebrennikov std::bitset<TileRegHigh + 1> ArgValues; 600781b1353SVlad Serebrennikov for (int ArgNum : ArgNums) { 601781b1353SVlad Serebrennikov Expr *Arg = TheCall->getArg(ArgNum); 602781b1353SVlad Serebrennikov if (Arg->isTypeDependent() || Arg->isValueDependent()) 603781b1353SVlad Serebrennikov continue; 604781b1353SVlad Serebrennikov 605781b1353SVlad Serebrennikov llvm::APSInt Result; 606781b1353SVlad Serebrennikov if (SemaRef.BuiltinConstantArg(TheCall, ArgNum, Result)) 607781b1353SVlad Serebrennikov return true; 608781b1353SVlad Serebrennikov int ArgExtValue = Result.getExtValue(); 609781b1353SVlad Serebrennikov assert((ArgExtValue >= TileRegLow && ArgExtValue <= TileRegHigh) && 610781b1353SVlad Serebrennikov "Incorrect tile register num."); 611781b1353SVlad Serebrennikov if (ArgValues.test(ArgExtValue)) 612781b1353SVlad Serebrennikov return Diag(TheCall->getBeginLoc(), 613781b1353SVlad Serebrennikov diag::err_x86_builtin_tile_arg_duplicate) 614781b1353SVlad Serebrennikov << TheCall->getArg(ArgNum)->getSourceRange(); 615781b1353SVlad Serebrennikov ArgValues.set(ArgExtValue); 616781b1353SVlad Serebrennikov } 617781b1353SVlad Serebrennikov return false; 618781b1353SVlad Serebrennikov } 619781b1353SVlad Serebrennikov 620781b1353SVlad Serebrennikov bool SemaX86::CheckBuiltinTileRangeAndDuplicate(CallExpr *TheCall, 621781b1353SVlad Serebrennikov ArrayRef<int> ArgNums) { 622781b1353SVlad Serebrennikov return CheckBuiltinTileArgumentsRange(TheCall, ArgNums) || 623781b1353SVlad Serebrennikov CheckBuiltinTileDuplicate(TheCall, ArgNums); 624781b1353SVlad Serebrennikov } 625781b1353SVlad Serebrennikov 626781b1353SVlad Serebrennikov bool SemaX86::CheckBuiltinTileArguments(unsigned BuiltinID, CallExpr *TheCall) { 627781b1353SVlad Serebrennikov switch (BuiltinID) { 628781b1353SVlad Serebrennikov default: 629781b1353SVlad Serebrennikov return false; 630781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_tileloadd64: 631781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_tileloaddt164: 632f77101eaSMalay Sanghi case X86::BI__builtin_ia32_tileloaddrs64: 633f77101eaSMalay Sanghi case X86::BI__builtin_ia32_tileloaddrst164: 634781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_tilestored64: 635781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_tilezero: 636c72a751dSPhoebe Wang case X86::BI__builtin_ia32_t2rpntlvwz0: 637c72a751dSPhoebe Wang case X86::BI__builtin_ia32_t2rpntlvwz0t1: 638c72a751dSPhoebe Wang case X86::BI__builtin_ia32_t2rpntlvwz1: 639c72a751dSPhoebe Wang case X86::BI__builtin_ia32_t2rpntlvwz1t1: 640f77101eaSMalay Sanghi case X86::BI__builtin_ia32_t2rpntlvwz0rst1: 641f77101eaSMalay Sanghi case X86::BI__builtin_ia32_t2rpntlvwz1rs: 642f77101eaSMalay Sanghi case X86::BI__builtin_ia32_t2rpntlvwz1rst1: 643f77101eaSMalay Sanghi case X86::BI__builtin_ia32_t2rpntlvwz0rs: 64448803bc8SPhoebe Wang case X86::BI__builtin_ia32_tcvtrowps2bf16h: 64548803bc8SPhoebe Wang case X86::BI__builtin_ia32_tcvtrowps2bf16l: 6468f440137SPhoebe Wang case X86::BI__builtin_ia32_tcvtrowps2phh: 6478f440137SPhoebe Wang case X86::BI__builtin_ia32_tcvtrowps2phl: 6488f440137SPhoebe Wang case X86::BI__builtin_ia32_tcvtrowd2ps: 6498f440137SPhoebe Wang case X86::BI__builtin_ia32_tilemovrow: 650781b1353SVlad Serebrennikov return CheckBuiltinTileArgumentsRange(TheCall, 0); 651781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_tdpbssd: 652781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_tdpbsud: 653781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_tdpbusd: 654781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_tdpbuud: 655781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_tdpbf16ps: 656781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_tdpfp16ps: 657781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_tcmmimfp16ps: 658781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_tcmmrlfp16ps: 65981271624SFeng Zou case X86::BI__builtin_ia32_tdpbf8ps: 66081271624SFeng Zou case X86::BI__builtin_ia32_tdpbhf8ps: 66181271624SFeng Zou case X86::BI__builtin_ia32_tdphbf8ps: 66281271624SFeng Zou case X86::BI__builtin_ia32_tdphf8ps: 663813f7c38SPhoebe Wang case X86::BI__builtin_ia32_ttdpbf16ps: 664813f7c38SPhoebe Wang case X86::BI__builtin_ia32_ttdpfp16ps: 665813f7c38SPhoebe Wang case X86::BI__builtin_ia32_ttcmmimfp16ps: 666813f7c38SPhoebe Wang case X86::BI__builtin_ia32_ttcmmrlfp16ps: 667813f7c38SPhoebe Wang case X86::BI__builtin_ia32_tconjtcmmimfp16ps: 668eddb79d5SFeng Zou case X86::BI__builtin_ia32_tmmultf32ps: 669eddb79d5SFeng Zou case X86::BI__builtin_ia32_ttmmultf32ps: 670781b1353SVlad Serebrennikov return CheckBuiltinTileRangeAndDuplicate(TheCall, {0, 1, 2}); 671c72a751dSPhoebe Wang case X86::BI__builtin_ia32_ttransposed: 672813f7c38SPhoebe Wang case X86::BI__builtin_ia32_tconjtfp16: 673c72a751dSPhoebe Wang return CheckBuiltinTileArgumentsRange(TheCall, {0, 1}); 674781b1353SVlad Serebrennikov } 675781b1353SVlad Serebrennikov } 676781b1353SVlad Serebrennikov static bool isX86_32Builtin(unsigned BuiltinID) { 677781b1353SVlad Serebrennikov // These builtins only work on x86-32 targets. 678781b1353SVlad Serebrennikov switch (BuiltinID) { 679781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_readeflags_u32: 680781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_writeeflags_u32: 681781b1353SVlad Serebrennikov return true; 682781b1353SVlad Serebrennikov } 683781b1353SVlad Serebrennikov 684781b1353SVlad Serebrennikov return false; 685781b1353SVlad Serebrennikov } 686781b1353SVlad Serebrennikov 687781b1353SVlad Serebrennikov bool SemaX86::CheckBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, 688781b1353SVlad Serebrennikov CallExpr *TheCall) { 689781b1353SVlad Serebrennikov // Check for 32-bit only builtins on a 64-bit target. 690781b1353SVlad Serebrennikov const llvm::Triple &TT = TI.getTriple(); 691781b1353SVlad Serebrennikov if (TT.getArch() != llvm::Triple::x86 && isX86_32Builtin(BuiltinID)) 692781b1353SVlad Serebrennikov return Diag(TheCall->getCallee()->getBeginLoc(), 693781b1353SVlad Serebrennikov diag::err_32_bit_builtin_64_bit_tgt); 694781b1353SVlad Serebrennikov 695781b1353SVlad Serebrennikov // If the intrinsic has rounding or SAE make sure its valid. 696781b1353SVlad Serebrennikov if (CheckBuiltinRoundingOrSAE(BuiltinID, TheCall)) 697781b1353SVlad Serebrennikov return true; 698781b1353SVlad Serebrennikov 699781b1353SVlad Serebrennikov // If the intrinsic has a gather/scatter scale immediate make sure its valid. 700781b1353SVlad Serebrennikov if (CheckBuiltinGatherScatterScale(BuiltinID, TheCall)) 701781b1353SVlad Serebrennikov return true; 702781b1353SVlad Serebrennikov 703781b1353SVlad Serebrennikov // If the intrinsic has a tile arguments, make sure they are valid. 704781b1353SVlad Serebrennikov if (CheckBuiltinTileArguments(BuiltinID, TheCall)) 705781b1353SVlad Serebrennikov return true; 706781b1353SVlad Serebrennikov 707781b1353SVlad Serebrennikov // For intrinsics which take an immediate value as part of the instruction, 708781b1353SVlad Serebrennikov // range check them here. 709781b1353SVlad Serebrennikov int i = 0, l = 0, u = 0; 710781b1353SVlad Serebrennikov switch (BuiltinID) { 711781b1353SVlad Serebrennikov default: 712781b1353SVlad Serebrennikov return false; 713781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_ext_v2di: 714781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vextractf128_pd256: 715781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vextractf128_ps256: 716781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vextractf128_si256: 717781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_extract128i256: 718781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_extractf64x4_mask: 719781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_extracti64x4_mask: 720781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_extractf32x8_mask: 721781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_extracti32x8_mask: 722781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_extractf64x2_256_mask: 723781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_extracti64x2_256_mask: 724781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_extractf32x4_256_mask: 725781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_extracti32x4_256_mask: 726781b1353SVlad Serebrennikov i = 1; 727781b1353SVlad Serebrennikov l = 0; 728781b1353SVlad Serebrennikov u = 1; 729781b1353SVlad Serebrennikov break; 730781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_set_v2di: 731781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vinsertf128_pd256: 732781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vinsertf128_ps256: 733781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vinsertf128_si256: 734781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_insert128i256: 735781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_insertf32x8: 736781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_inserti32x8: 737781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_insertf64x4: 738781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_inserti64x4: 739781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_insertf64x2_256: 740781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_inserti64x2_256: 741781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_insertf32x4_256: 742781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_inserti32x4_256: 743781b1353SVlad Serebrennikov i = 2; 744781b1353SVlad Serebrennikov l = 0; 745781b1353SVlad Serebrennikov u = 1; 746781b1353SVlad Serebrennikov break; 747781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpermilpd: 748781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_ext_v4hi: 749781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_ext_v4si: 750781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_ext_v4sf: 751781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_ext_v4di: 752781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_extractf32x4_mask: 753781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_extracti32x4_mask: 754781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_extractf64x2_512_mask: 755781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_extracti64x2_512_mask: 756781b1353SVlad Serebrennikov i = 1; 757781b1353SVlad Serebrennikov l = 0; 758781b1353SVlad Serebrennikov u = 3; 759781b1353SVlad Serebrennikov break; 760781b1353SVlad Serebrennikov case X86::BI_mm_prefetch: 761781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_ext_v8hi: 762781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_ext_v8si: 763781b1353SVlad Serebrennikov i = 1; 764781b1353SVlad Serebrennikov l = 0; 765781b1353SVlad Serebrennikov u = 7; 766781b1353SVlad Serebrennikov break; 767781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_sha1rnds4: 768781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_blendpd: 769781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_shufpd: 770781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_set_v4hi: 771781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_set_v4si: 772781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_set_v4di: 773781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_shuf_f32x4_256: 774781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_shuf_f64x2_256: 775781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_shuf_i32x4_256: 776781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_shuf_i64x2_256: 777781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_insertf64x2_512: 778781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_inserti64x2_512: 779781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_insertf32x4: 780781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_inserti32x4: 781781b1353SVlad Serebrennikov i = 2; 782781b1353SVlad Serebrennikov l = 0; 783781b1353SVlad Serebrennikov u = 3; 784781b1353SVlad Serebrennikov break; 785781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpermil2pd: 786781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpermil2pd256: 787781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpermil2ps: 788781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpermil2ps256: 789781b1353SVlad Serebrennikov i = 3; 790781b1353SVlad Serebrennikov l = 0; 791781b1353SVlad Serebrennikov u = 3; 792781b1353SVlad Serebrennikov break; 793781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpb128_mask: 794781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpw128_mask: 795781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpd128_mask: 796781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpq128_mask: 797781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpb256_mask: 798781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpw256_mask: 799781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpd256_mask: 800781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpq256_mask: 801781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpb512_mask: 802781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpw512_mask: 803781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpd512_mask: 804781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpq512_mask: 805781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_ucmpb128_mask: 806781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_ucmpw128_mask: 807781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_ucmpd128_mask: 808781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_ucmpq128_mask: 809781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_ucmpb256_mask: 810781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_ucmpw256_mask: 811781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_ucmpd256_mask: 812781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_ucmpq256_mask: 813781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_ucmpb512_mask: 814781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_ucmpw512_mask: 815781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_ucmpd512_mask: 816781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_ucmpq512_mask: 817781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpcomub: 818781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpcomuw: 819781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpcomud: 820781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpcomuq: 821781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpcomb: 822781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpcomw: 823781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpcomd: 824781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpcomq: 825781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_set_v8hi: 826781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_set_v8si: 827781b1353SVlad Serebrennikov i = 2; 828781b1353SVlad Serebrennikov l = 0; 829781b1353SVlad Serebrennikov u = 7; 830781b1353SVlad Serebrennikov break; 831781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpermilpd256: 832781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_roundps: 833781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_roundpd: 834781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_roundps256: 835781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_roundpd256: 836781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantpd128_mask: 837781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantpd256_mask: 838781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantps128_mask: 839781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantps256_mask: 840781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantpd512_mask: 841781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantps512_mask: 842781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantph128_mask: 843781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantph256_mask: 844781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantph512_mask: 8450dba5381SPhoebe Wang case X86::BI__builtin_ia32_vgetmantpd256_round_mask: 8460dba5381SPhoebe Wang case X86::BI__builtin_ia32_vgetmantps256_round_mask: 8470dba5381SPhoebe Wang case X86::BI__builtin_ia32_vgetmantph256_round_mask: 848781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_ext_v16qi: 849781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_ext_v16hi: 850781b1353SVlad Serebrennikov i = 1; 851781b1353SVlad Serebrennikov l = 0; 852781b1353SVlad Serebrennikov u = 15; 853781b1353SVlad Serebrennikov break; 854781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pblendd128: 855781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_blendps: 856781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_blendpd256: 857781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_shufpd256: 858781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_roundss: 859781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_roundsd: 860781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rangepd128_mask: 861781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rangepd256_mask: 862781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rangepd512_mask: 863781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rangeps128_mask: 864781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rangeps256_mask: 865781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rangeps512_mask: 8660dba5381SPhoebe Wang case X86::BI__builtin_ia32_vrangepd256_round_mask: 8670dba5381SPhoebe Wang case X86::BI__builtin_ia32_vrangeps256_round_mask: 868781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantsd_round_mask: 869781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantss_round_mask: 870781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_getmantsh_round_mask: 871781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_set_v16qi: 872781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_set_v16hi: 873781b1353SVlad Serebrennikov i = 2; 874781b1353SVlad Serebrennikov l = 0; 875781b1353SVlad Serebrennikov u = 15; 876781b1353SVlad Serebrennikov break; 877781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_ext_v32qi: 878781b1353SVlad Serebrennikov i = 1; 879781b1353SVlad Serebrennikov l = 0; 880781b1353SVlad Serebrennikov u = 31; 881781b1353SVlad Serebrennikov break; 882781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpps: 883781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpss: 884781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmppd: 885781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpsd: 886781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpps256: 887781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmppd256: 888781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpps128_mask: 889781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmppd128_mask: 890781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpps256_mask: 891781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmppd256_mask: 892781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpps512_mask: 893781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmppd512_mask: 8940dba5381SPhoebe Wang case X86::BI__builtin_ia32_cmpph512_mask: 8950dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcmppd256_round_mask: 8960dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcmpps256_round_mask: 8970dba5381SPhoebe Wang case X86::BI__builtin_ia32_vcmpph256_round_mask: 898781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpsd_mask: 899781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpss_mask: 900781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vec_set_v32qi: 901781b1353SVlad Serebrennikov i = 2; 902781b1353SVlad Serebrennikov l = 0; 903781b1353SVlad Serebrennikov u = 31; 904781b1353SVlad Serebrennikov break; 905781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_permdf256: 906781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_permdi256: 907781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_permdf512: 908781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_permdi512: 909781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpermilps: 910781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpermilps256: 911781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpermilpd512: 912781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpermilps512: 913781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pshufd: 914781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pshufd256: 915781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pshufd512: 916781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pshufhw: 917781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pshufhw256: 918781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pshufhw512: 919781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pshuflw: 920781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pshuflw256: 921781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pshuflw512: 922781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtps2ph: 923781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtps2ph_mask: 924781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtps2ph256: 925781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtps2ph256_mask: 926781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcvtps2ph512_mask: 927781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscaleps_128_mask: 928781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscalepd_128_mask: 929781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscaleps_256_mask: 930781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscalepd_256_mask: 931781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscaleps_mask: 932781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscalepd_mask: 933781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscaleph_mask: 934*ee2722fcSPhoebe Wang case X86::BI__builtin_ia32_vrndscalebf16_128_mask: 935*ee2722fcSPhoebe Wang case X86::BI__builtin_ia32_vrndscalebf16_256_mask: 936*ee2722fcSPhoebe Wang case X86::BI__builtin_ia32_vrndscalebf16_mask: 937781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reducepd128_mask: 938781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reducepd256_mask: 939781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reducepd512_mask: 940781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reduceps128_mask: 941781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reduceps256_mask: 942781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reduceps512_mask: 943781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reduceph128_mask: 944781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reduceph256_mask: 945781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reduceph512_mask: 946*ee2722fcSPhoebe Wang case X86::BI__builtin_ia32_vreducebf16128_mask: 947*ee2722fcSPhoebe Wang case X86::BI__builtin_ia32_vreducebf16256_mask: 948*ee2722fcSPhoebe Wang case X86::BI__builtin_ia32_vreducebf16512_mask: 9490dba5381SPhoebe Wang case X86::BI__builtin_ia32_vreducepd256_round_mask: 9500dba5381SPhoebe Wang case X86::BI__builtin_ia32_vreduceps256_round_mask: 9510dba5381SPhoebe Wang case X86::BI__builtin_ia32_vreduceph256_round_mask: 9520dba5381SPhoebe Wang case X86::BI__builtin_ia32_vrndscalepd256_round_mask: 9530dba5381SPhoebe Wang case X86::BI__builtin_ia32_vrndscaleps256_round_mask: 9540dba5381SPhoebe Wang case X86::BI__builtin_ia32_vrndscaleph256_round_mask: 955781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_prold512: 956781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_prolq512: 957781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_prold128: 958781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_prold256: 959781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_prolq128: 960781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_prolq256: 961781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_prord512: 962781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_prorq512: 963781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_prord128: 964781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_prord256: 965781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_prorq128: 966781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_prorq256: 967781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fpclasspd128_mask: 968781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fpclasspd256_mask: 969781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fpclassps128_mask: 970781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fpclassps256_mask: 971781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fpclassps512_mask: 972781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fpclasspd512_mask: 973781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fpclassph128_mask: 974781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fpclassph256_mask: 975781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fpclassph512_mask: 976*ee2722fcSPhoebe Wang case X86::BI__builtin_ia32_vfpclassbf16128_mask: 977*ee2722fcSPhoebe Wang case X86::BI__builtin_ia32_vfpclassbf16256_mask: 978*ee2722fcSPhoebe Wang case X86::BI__builtin_ia32_vfpclassbf16512_mask: 979781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fpclasssd_mask: 980781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fpclassss_mask: 981781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fpclasssh_mask: 982781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pslldqi128_byteshift: 983781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pslldqi256_byteshift: 984781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pslldqi512_byteshift: 985781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_psrldqi128_byteshift: 986781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_psrldqi256_byteshift: 987781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_psrldqi512_byteshift: 988781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_kshiftliqi: 989781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_kshiftlihi: 990781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_kshiftlisi: 991781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_kshiftlidi: 992781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_kshiftriqi: 993781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_kshiftrihi: 994781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_kshiftrisi: 995781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_kshiftridi: 996781b1353SVlad Serebrennikov i = 1; 997781b1353SVlad Serebrennikov l = 0; 998781b1353SVlad Serebrennikov u = 255; 999781b1353SVlad Serebrennikov break; 1000781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vperm2f128_pd256: 1001781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vperm2f128_ps256: 1002781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vperm2f128_si256: 1003781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_permti256: 1004781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pblendw128: 1005781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pblendw256: 1006781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_blendps256: 1007781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pblendd256: 1008781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_palignr128: 1009781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_palignr256: 1010781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_palignr512: 1011781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_alignq512: 1012781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_alignd512: 1013781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_alignd128: 1014781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_alignd256: 1015781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_alignq128: 1016781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_alignq256: 1017781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcomisd: 1018781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vcomiss: 1019781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_shuf_f32x4: 1020781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_shuf_f64x2: 1021781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_shuf_i32x4: 1022781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_shuf_i64x2: 1023781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_shufpd512: 1024781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_shufps: 1025781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_shufps256: 1026781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_shufps512: 1027781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_dbpsadbw128: 1028781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_dbpsadbw256: 1029781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_dbpsadbw512: 1030781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshldd128: 1031781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshldd256: 1032781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshldd512: 1033781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshldq128: 1034781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshldq256: 1035781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshldq512: 1036781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshldw128: 1037781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshldw256: 1038781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshldw512: 1039781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshrdd128: 1040781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshrdd256: 1041781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshrdd512: 1042781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshrdq128: 1043781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshrdq256: 1044781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshrdq512: 1045781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshrdw128: 1046781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshrdw256: 1047781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vpshrdw512: 104813c6abfaSPhoebe Wang case X86::BI__builtin_ia32_vminmaxbf16128: 104913c6abfaSPhoebe Wang case X86::BI__builtin_ia32_vminmaxbf16256: 105013c6abfaSPhoebe Wang case X86::BI__builtin_ia32_vminmaxbf16512: 10513d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxpd128_mask: 10523d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxpd256_round_mask: 10533d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxph128_mask: 10543d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxph256_round_mask: 10553d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxps128_mask: 10563d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxps256_round_mask: 10573d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxpd512_round_mask: 10583d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxps512_round_mask: 10593d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxph512_round_mask: 10603d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxsd_round_mask: 10613d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxsh_round_mask: 10623d5cc7e1SFreddy Ye case X86::BI__builtin_ia32_vminmaxss_round_mask: 1063781b1353SVlad Serebrennikov i = 2; 1064781b1353SVlad Serebrennikov l = 0; 1065781b1353SVlad Serebrennikov u = 255; 1066781b1353SVlad Serebrennikov break; 1067781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmpd512_mask: 1068781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmpd512_maskz: 1069781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmps512_mask: 1070781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmps512_maskz: 1071781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmsd_mask: 1072781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmsd_maskz: 1073781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmss_mask: 1074781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmss_maskz: 1075781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmpd128_mask: 1076781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmpd128_maskz: 1077781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmpd256_mask: 1078781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmpd256_maskz: 1079781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmps128_mask: 1080781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmps128_maskz: 1081781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmps256_mask: 1082781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_fixupimmps256_maskz: 1083781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pternlogd512_mask: 1084781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pternlogd512_maskz: 1085781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pternlogq512_mask: 1086781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pternlogq512_maskz: 1087781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pternlogd128_mask: 1088781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pternlogd128_maskz: 1089781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pternlogd256_mask: 1090781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pternlogd256_maskz: 1091781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pternlogq128_mask: 1092781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pternlogq128_maskz: 1093781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pternlogq256_mask: 1094781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_pternlogq256_maskz: 1095781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_vsm3rnds2: 1096781b1353SVlad Serebrennikov i = 3; 1097781b1353SVlad Serebrennikov l = 0; 1098781b1353SVlad Serebrennikov u = 255; 1099781b1353SVlad Serebrennikov break; 1100781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reducesd_mask: 1101781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reducess_mask: 1102781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscalesd_round_mask: 1103781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscaless_round_mask: 1104781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_rndscalesh_round_mask: 1105781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_reducesh_mask: 1106781b1353SVlad Serebrennikov i = 4; 1107781b1353SVlad Serebrennikov l = 0; 1108781b1353SVlad Serebrennikov u = 255; 1109781b1353SVlad Serebrennikov break; 1110781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpccxadd32: 1111781b1353SVlad Serebrennikov case X86::BI__builtin_ia32_cmpccxadd64: 1112781b1353SVlad Serebrennikov i = 3; 1113781b1353SVlad Serebrennikov l = 0; 1114781b1353SVlad Serebrennikov u = 15; 1115781b1353SVlad Serebrennikov break; 1116781b1353SVlad Serebrennikov } 1117781b1353SVlad Serebrennikov 1118781b1353SVlad Serebrennikov // Note that we don't force a hard error on the range check here, allowing 1119781b1353SVlad Serebrennikov // template-generated or macro-generated dead code to potentially have out-of- 1120781b1353SVlad Serebrennikov // range values. These need to code generate, but don't need to necessarily 1121781b1353SVlad Serebrennikov // make any sense. We use a warning that defaults to an error. 1122781b1353SVlad Serebrennikov return SemaRef.BuiltinConstantArgRange(TheCall, i, l, u, 1123781b1353SVlad Serebrennikov /*RangeIsError*/ false); 1124781b1353SVlad Serebrennikov } 1125781b1353SVlad Serebrennikov 11266b755b0cSVlad Serebrennikov void SemaX86::handleAnyInterruptAttr(Decl *D, const ParsedAttr &AL) { 11276b755b0cSVlad Serebrennikov // Semantic checks for a function with the 'interrupt' attribute. 11286b755b0cSVlad Serebrennikov // a) Must be a function. 11296b755b0cSVlad Serebrennikov // b) Must have the 'void' return type. 11306b755b0cSVlad Serebrennikov // c) Must take 1 or 2 arguments. 11316b755b0cSVlad Serebrennikov // d) The 1st argument must be a pointer. 11326b755b0cSVlad Serebrennikov // e) The 2nd argument (if any) must be an unsigned integer. 11336b755b0cSVlad Serebrennikov ASTContext &Context = getASTContext(); 11346b755b0cSVlad Serebrennikov 11356b755b0cSVlad Serebrennikov if (!isFuncOrMethodForAttrSubject(D) || !hasFunctionProto(D) || 11366b755b0cSVlad Serebrennikov isInstanceMethod(D) || 11376b755b0cSVlad Serebrennikov CXXMethodDecl::isStaticOverloadedOperator( 11386b755b0cSVlad Serebrennikov cast<NamedDecl>(D)->getDeclName().getCXXOverloadedOperator())) { 11396b755b0cSVlad Serebrennikov Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type) 11406b755b0cSVlad Serebrennikov << AL << AL.isRegularKeywordAttribute() 11416b755b0cSVlad Serebrennikov << ExpectedFunctionWithProtoType; 11426b755b0cSVlad Serebrennikov return; 11436b755b0cSVlad Serebrennikov } 11446b755b0cSVlad Serebrennikov // Interrupt handler must have void return type. 11456b755b0cSVlad Serebrennikov if (!getFunctionOrMethodResultType(D)->isVoidType()) { 11466b755b0cSVlad Serebrennikov Diag(getFunctionOrMethodResultSourceRange(D).getBegin(), 11476b755b0cSVlad Serebrennikov diag::err_anyx86_interrupt_attribute) 11486b755b0cSVlad Serebrennikov << (SemaRef.Context.getTargetInfo().getTriple().getArch() == 11496b755b0cSVlad Serebrennikov llvm::Triple::x86 11506b755b0cSVlad Serebrennikov ? 0 11516b755b0cSVlad Serebrennikov : 1) 11526b755b0cSVlad Serebrennikov << 0; 11536b755b0cSVlad Serebrennikov return; 11546b755b0cSVlad Serebrennikov } 11556b755b0cSVlad Serebrennikov // Interrupt handler must have 1 or 2 parameters. 11566b755b0cSVlad Serebrennikov unsigned NumParams = getFunctionOrMethodNumParams(D); 11576b755b0cSVlad Serebrennikov if (NumParams < 1 || NumParams > 2) { 11586b755b0cSVlad Serebrennikov Diag(D->getBeginLoc(), diag::err_anyx86_interrupt_attribute) 11596b755b0cSVlad Serebrennikov << (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86 11606b755b0cSVlad Serebrennikov ? 0 11616b755b0cSVlad Serebrennikov : 1) 11626b755b0cSVlad Serebrennikov << 1; 11636b755b0cSVlad Serebrennikov return; 11646b755b0cSVlad Serebrennikov } 11656b755b0cSVlad Serebrennikov // The first argument must be a pointer. 11666b755b0cSVlad Serebrennikov if (!getFunctionOrMethodParamType(D, 0)->isPointerType()) { 11676b755b0cSVlad Serebrennikov Diag(getFunctionOrMethodParamRange(D, 0).getBegin(), 11686b755b0cSVlad Serebrennikov diag::err_anyx86_interrupt_attribute) 11696b755b0cSVlad Serebrennikov << (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86 11706b755b0cSVlad Serebrennikov ? 0 11716b755b0cSVlad Serebrennikov : 1) 11726b755b0cSVlad Serebrennikov << 2; 11736b755b0cSVlad Serebrennikov return; 11746b755b0cSVlad Serebrennikov } 11756b755b0cSVlad Serebrennikov // The second argument, if present, must be an unsigned integer. 11766b755b0cSVlad Serebrennikov unsigned TypeSize = 11776b755b0cSVlad Serebrennikov Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86_64 11786b755b0cSVlad Serebrennikov ? 64 11796b755b0cSVlad Serebrennikov : 32; 11806b755b0cSVlad Serebrennikov if (NumParams == 2 && 11816b755b0cSVlad Serebrennikov (!getFunctionOrMethodParamType(D, 1)->isUnsignedIntegerType() || 11826b755b0cSVlad Serebrennikov Context.getTypeSize(getFunctionOrMethodParamType(D, 1)) != TypeSize)) { 11836b755b0cSVlad Serebrennikov Diag(getFunctionOrMethodParamRange(D, 1).getBegin(), 11846b755b0cSVlad Serebrennikov diag::err_anyx86_interrupt_attribute) 11856b755b0cSVlad Serebrennikov << (Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86 11866b755b0cSVlad Serebrennikov ? 0 11876b755b0cSVlad Serebrennikov : 1) 11886b755b0cSVlad Serebrennikov << 3 << Context.getIntTypeForBitwidth(TypeSize, /*Signed=*/false); 11896b755b0cSVlad Serebrennikov return; 11906b755b0cSVlad Serebrennikov } 11916b755b0cSVlad Serebrennikov D->addAttr(::new (Context) AnyX86InterruptAttr(Context, AL)); 11926b755b0cSVlad Serebrennikov D->addAttr(UsedAttr::CreateImplicit(Context)); 11936b755b0cSVlad Serebrennikov } 11946b755b0cSVlad Serebrennikov 11956b755b0cSVlad Serebrennikov void SemaX86::handleForceAlignArgPointerAttr(Decl *D, const ParsedAttr &AL) { 11966b755b0cSVlad Serebrennikov // If we try to apply it to a function pointer, don't warn, but don't 11976b755b0cSVlad Serebrennikov // do anything, either. It doesn't matter anyway, because there's nothing 11986b755b0cSVlad Serebrennikov // special about calling a force_align_arg_pointer function. 11996b755b0cSVlad Serebrennikov const auto *VD = dyn_cast<ValueDecl>(D); 12006b755b0cSVlad Serebrennikov if (VD && VD->getType()->isFunctionPointerType()) 12016b755b0cSVlad Serebrennikov return; 12026b755b0cSVlad Serebrennikov // Also don't warn on function pointer typedefs. 12036b755b0cSVlad Serebrennikov const auto *TD = dyn_cast<TypedefNameDecl>(D); 12046b755b0cSVlad Serebrennikov if (TD && (TD->getUnderlyingType()->isFunctionPointerType() || 12056b755b0cSVlad Serebrennikov TD->getUnderlyingType()->isFunctionType())) 12066b755b0cSVlad Serebrennikov return; 12076b755b0cSVlad Serebrennikov // Attribute can only be applied to function types. 12086b755b0cSVlad Serebrennikov if (!isa<FunctionDecl>(D)) { 12096b755b0cSVlad Serebrennikov Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type) 12106b755b0cSVlad Serebrennikov << AL << AL.isRegularKeywordAttribute() << ExpectedFunction; 12116b755b0cSVlad Serebrennikov return; 12126b755b0cSVlad Serebrennikov } 12136b755b0cSVlad Serebrennikov 12146b755b0cSVlad Serebrennikov D->addAttr(::new (getASTContext()) 12156b755b0cSVlad Serebrennikov X86ForceAlignArgPointerAttr(getASTContext(), AL)); 12166b755b0cSVlad Serebrennikov } 12176b755b0cSVlad Serebrennikov 1218781b1353SVlad Serebrennikov } // namespace clang 1219