61 case PPC::BI__builtin_divde:
62 case PPC::BI__builtin_divdeu:
63 case PPC::BI__builtin_bpermd:
64 case PPC::BI__builtin_pdepd:
65 case PPC::BI__builtin_pextd:
66 case PPC::BI__builtin_ppc_cdtbcd:
67 case PPC::BI__builtin_ppc_cbcdtd:
68 case PPC::BI__builtin_ppc_addg6s:
69 case PPC::BI__builtin_ppc_ldarx:
70 case PPC::BI__builtin_ppc_stdcx:
71 case PPC::BI__builtin_ppc_tdw:
72 case PPC::BI__builtin_ppc_trapd:
73 case PPC::BI__builtin_ppc_cmpeqb:
74 case PPC::BI__builtin_ppc_setb:
75 case PPC::BI__builtin_ppc_mulhd:
76 case PPC::BI__builtin_ppc_mulhdu:
77 case PPC::BI__builtin_ppc_maddhd:
78 case PPC::BI__builtin_ppc_maddhdu:
79 case PPC::BI__builtin_ppc_maddld:
80 case PPC::BI__builtin_ppc_load8r:
81 case PPC::BI__builtin_ppc_store8r:
82 case PPC::BI__builtin_ppc_insert_exp:
83 case PPC::BI__builtin_ppc_extract_sig:
84 case PPC::BI__builtin_ppc_addex:
85 case PPC::BI__builtin_darn:
86 case PPC::BI__builtin_darn_raw:
87 case PPC::BI__builtin_ppc_compare_and_swaplp:
88 case PPC::BI__builtin_ppc_fetch_and_addlp:
89 case PPC::BI__builtin_ppc_fetch_and_andlp:
90 case PPC::BI__builtin_ppc_fetch_and_orlp:
91 case PPC::BI__builtin_ppc_fetch_and_swaplp:
92 case PPC::BI__builtin_amo_lwat:
93 case PPC::BI__builtin_amo_ldat:
94 case PPC::BI__builtin_amo_lwat_s:
95 case PPC::BI__builtin_amo_ldat_s:
96 case PPC::BI__builtin_amo_lwat_cond:
97 case PPC::BI__builtin_amo_ldat_cond:
98 case PPC::BI__builtin_amo_lwat_cond_s:
99 case PPC::BI__builtin_amo_ldat_cond_s:
100 case PPC::BI__builtin_amo_stwat:
101 case PPC::BI__builtin_amo_stdat:
102 case PPC::BI__builtin_amo_stwat_s:
103 case PPC::BI__builtin_amo_stdat_s:
104 case PPC::BI__builtin_amo_lwat_csne:
105 case PPC::BI__builtin_amo_ldat_csne:
106 case PPC::BI__builtin_amo_lwat_csne_s:
107 case PPC::BI__builtin_amo_ldat_csne_s:
120 return Diag(TheCall->
getBeginLoc(), diag::err_64_bit_builtin_32_bit_tgt)
124 StringRef FeatureList(Context.BuiltinInfo.getRequiredFeatures(BuiltinID));
125 if (!FeatureList.empty()) {
126 const auto *FD =
SemaRef.getCurFunctionDecl(
true);
127 llvm::StringMap<bool> CallerFeatureMap;
128 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
136 Context.BuiltinInfo.getName(BuiltinID))))
149 auto IsTypeVecUChar = [&](
QualType ArgTy,
unsigned ArgIndex) ->
bool {
150 QualType VecType = Context.getVectorType(Context.UnsignedCharTy, 16,
152 if (Context.hasSameType(ArgTy, VecType))
156 diag::err_ppc_invalid_arg_type)
157 << ArgIndex << VecType << ArgTy;
162 auto IsIntType = [&](
QualType ArgTy,
unsigned ArgIndex) ->
bool {
167 diag::err_ppc_invalid_arg_type)
168 << ArgIndex <<
"integer" << ArgTy;
175 case PPC::BI__builtin_ppc_bcdsetsign: {
181 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
183 case PPC::BI__builtin_ppc_national2packed:
184 case PPC::BI__builtin_ppc_packed2zoned:
185 case PPC::BI__builtin_ppc_zoned2packed:
186 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
187 case PPC::BI__builtin_ppc_bcdshift:
188 case PPC::BI__builtin_ppc_bcdshiftround:
189 case PPC::BI__builtin_ppc_bcdtruncate: {
200 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 1);
202 case PPC::BI__builtin_altivec_crypto_vshasigmaw:
203 case PPC::BI__builtin_altivec_crypto_vshasigmad:
204 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1) ||
205 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 15);
206 case PPC::BI__builtin_altivec_dss:
207 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3);
208 case PPC::BI__builtin_tbegin:
209 case PPC::BI__builtin_tend:
210 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1);
211 case PPC::BI__builtin_tsr:
212 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 7);
213 case PPC::BI__builtin_tabortwc:
214 case PPC::BI__builtin_tabortdc:
215 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31);
216 case PPC::BI__builtin_tabortwci:
217 case PPC::BI__builtin_tabortdci:
218 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31) ||
219 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31);
223 case PPC::BI__builtin_unpack_longdouble:
224 if (
SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1))
227 case PPC::BI__builtin_pack_longdouble:
229 return Diag(TheCall->
getBeginLoc(), diag::err_ppc_builtin_requires_abi)
232 case PPC::BI__builtin_altivec_dst:
233 case PPC::BI__builtin_altivec_dstt:
234 case PPC::BI__builtin_altivec_dstst:
235 case PPC::BI__builtin_altivec_dststt:
236 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3);
237 case PPC::BI__builtin_vsx_xxpermdi:
238 case PPC::BI__builtin_vsx_xxsldwi:
240 case PPC::BI__builtin_unpack_vector_int128:
241 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
242 case PPC::BI__builtin_altivec_vgnb:
243 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 2, 7);
244 case PPC::BI__builtin_vsx_xxeval:
245 return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 255);
246 case PPC::BI__builtin_altivec_vsldbi:
247 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 7);
248 case PPC::BI__builtin_altivec_vsrdbi:
249 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 7);
250 case PPC::BI__builtin_vsx_xxpermx:
251 return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 7);
252 case PPC::BI__builtin_altivec_vupkint4tobf16:
253 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 3);
254 case PPC::BI__builtin_altivec_vupkint8tobf16:
255 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
256 case PPC::BI__builtin_altivec_vupkint4tofp32:
257 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 7);
258 case PPC::BI__builtin_altivec_vupkint8tofp32:
259 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 3);
260 case PPC::BI__builtin_ppc_tw:
261 case PPC::BI__builtin_ppc_tdw:
262 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 1, 31);
263 case PPC::BI__builtin_ppc_cmprb:
264 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1);
267 case PPC::BI__builtin_ppc_rlwnm:
268 return SemaRef.ValueIsRunOfOnes(TheCall, 2);
269 case PPC::BI__builtin_ppc_rlwimi:
270 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) ||
271 SemaRef.ValueIsRunOfOnes(TheCall, 3);
272 case PPC::BI__builtin_ppc_rldimi:
273 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 63) ||
274 SemaRef.ValueIsRunOfOnes(TheCall, 3);
275 case PPC::BI__builtin_ppc_addex: {
276 if (
SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3))
286 case PPC::BI__builtin_ppc_mtfsb0:
287 case PPC::BI__builtin_ppc_mtfsb1:
288 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31);
289 case PPC::BI__builtin_ppc_mtfsf:
290 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 255);
291 case PPC::BI__builtin_ppc_mtfsfi:
292 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 7) ||
293 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 15);
294 case PPC::BI__builtin_ppc_alignx:
295 return SemaRef.BuiltinConstantArgPower2(TheCall, 0);
296 case PPC::BI__builtin_ppc_rdlam:
297 return SemaRef.ValueIsRunOfOnes(TheCall, 2);
298 case PPC::BI__builtin_vsx_ldrmb:
299 case PPC::BI__builtin_vsx_strmb:
300 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 1, 16);
301 case PPC::BI__builtin_altivec_vcntmbb:
302 case PPC::BI__builtin_altivec_vcntmbh:
303 case PPC::BI__builtin_altivec_vcntmbw:
304 case PPC::BI__builtin_altivec_vcntmbd:
305 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
306 case PPC::BI__builtin_vsx_xxgenpcvbm:
307 case PPC::BI__builtin_vsx_xxgenpcvhm:
308 case PPC::BI__builtin_vsx_xxgenpcvwm:
309 case PPC::BI__builtin_vsx_xxgenpcvdm:
310 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 3);
311 case PPC::BI__builtin_ppc_test_data_class: {
315 if (ArgType !=
QualType(Context.FloatTy) &&
316 ArgType !=
QualType(Context.DoubleTy) &&
317 ArgType !=
QualType(Context.Float128Ty))
319 diag::err_ppc_invalid_test_data_class_type);
320 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 127);
322 case PPC::BI__builtin_ppc_maxfe:
323 case PPC::BI__builtin_ppc_minfe:
324 case PPC::BI__builtin_ppc_maxfl:
325 case PPC::BI__builtin_ppc_minfl:
326 case PPC::BI__builtin_ppc_maxfs:
327 case PPC::BI__builtin_ppc_minfs: {
328 if (Context.getTargetInfo().getTriple().isOSAIX() &&
329 (BuiltinID == PPC::BI__builtin_ppc_maxfe ||
330 BuiltinID == PPC::BI__builtin_ppc_minfe))
332 <<
"builtin" <<
true << 128 <<
QualType(Context.LongDoubleTy)
333 <<
false << Context.getTargetInfo().getTriple().str();
336 if (BuiltinID == PPC::BI__builtin_ppc_maxfl ||
337 BuiltinID == PPC::BI__builtin_ppc_minfl)
338 ArgType =
QualType(Context.DoubleTy);
339 else if (BuiltinID == PPC::BI__builtin_ppc_maxfs ||
340 BuiltinID == PPC::BI__builtin_ppc_minfs)
341 ArgType =
QualType(Context.FloatTy);
342 for (
unsigned I = 0, E = TheCall->
getNumArgs(); I < E; ++I)
345 diag::err_typecheck_convert_incompatible)
349#define CUSTOM_BUILTIN(Name, Intr, Types, Acc, Feature) \
350 case PPC::BI__builtin_##Name: \
351 return BuiltinPPCMMACall(TheCall, BuiltinID, Types);
352#include "clang/Basic/BuiltinsPPC.def"
353 case PPC::BI__builtin_amo_lwat:
354 case PPC::BI__builtin_amo_ldat:
355 case PPC::BI__builtin_amo_lwat_s:
356 case PPC::BI__builtin_amo_ldat_s: {
360 unsigned Val =
Result.getZExtValue();
362 bool IsUnsigned = (BuiltinID == PPC::BI__builtin_amo_lwat ||
363 BuiltinID == PPC::BI__builtin_amo_ldat);
365 bool IsValid = IsUnsigned
366 ? llvm::is_contained({0u, 1u, 2u, 3u, 4u, 6u, 8u}, Val)
367 : llvm::is_contained({0u, 5u, 7u, 8u}, Val);
374 <<
toString(
Result, 10) << (IsUnsigned ?
"0-4, 6" :
"0, 5, 7") <<
"8"
377 case PPC::BI__builtin_amo_lwat_cond:
378 case PPC::BI__builtin_amo_ldat_cond:
379 case PPC::BI__builtin_amo_lwat_cond_s:
380 case PPC::BI__builtin_amo_ldat_cond_s: {
384 unsigned Val =
Result.getZExtValue();
385 if (llvm::is_contained({24u, 25u, 28u}, Val))
392 case PPC::BI__builtin_amo_stwat:
393 case PPC::BI__builtin_amo_stdat:
394 case PPC::BI__builtin_amo_stwat_s:
395 case PPC::BI__builtin_amo_stdat_s: {
399 unsigned Val =
Result.getZExtValue();
401 bool IsUnsigned = (BuiltinID == PPC::BI__builtin_amo_stwat ||
402 BuiltinID == PPC::BI__builtin_amo_stdat);
404 bool IsValid = IsUnsigned
405 ? llvm::is_contained({0u, 1u, 2u, 3u, 4u, 6u, 24u}, Val)
406 : llvm::is_contained({0u, 5u, 7u, 24u}, Val);
417 llvm_unreachable(
"must return from switch");