xref: /llvm-project/clang/lib/Sema/SemaX86.cpp (revision ee2722fc882ed5dbc7609686bd998b023c6645b2)
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