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