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