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_ppc_tw:
253 case PPC::BI__builtin_ppc_tdw:
254 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 1, 31);
255 case PPC::BI__builtin_ppc_cmprb:
256 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1);
259 case PPC::BI__builtin_ppc_rlwnm:
260 return SemaRef.ValueIsRunOfOnes(TheCall, 2);
261 case PPC::BI__builtin_ppc_rlwimi:
262 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) ||
263 SemaRef.ValueIsRunOfOnes(TheCall, 3);
264 case PPC::BI__builtin_ppc_rldimi:
265 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 63) ||
266 SemaRef.ValueIsRunOfOnes(TheCall, 3);
267 case PPC::BI__builtin_ppc_addex: {
268 if (
SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3))
278 case PPC::BI__builtin_ppc_mtfsb0:
279 case PPC::BI__builtin_ppc_mtfsb1:
280 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31);
281 case PPC::BI__builtin_ppc_mtfsf:
282 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 255);
283 case PPC::BI__builtin_ppc_mtfsfi:
284 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 7) ||
285 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 15);
286 case PPC::BI__builtin_ppc_alignx:
287 return SemaRef.BuiltinConstantArgPower2(TheCall, 0);
288 case PPC::BI__builtin_ppc_rdlam:
289 return SemaRef.ValueIsRunOfOnes(TheCall, 2);
290 case PPC::BI__builtin_vsx_ldrmb:
291 case PPC::BI__builtin_vsx_strmb:
292 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 1, 16);
293 case PPC::BI__builtin_altivec_vcntmbb:
294 case PPC::BI__builtin_altivec_vcntmbh:
295 case PPC::BI__builtin_altivec_vcntmbw:
296 case PPC::BI__builtin_altivec_vcntmbd:
297 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
298 case PPC::BI__builtin_vsx_xxgenpcvbm:
299 case PPC::BI__builtin_vsx_xxgenpcvhm:
300 case PPC::BI__builtin_vsx_xxgenpcvwm:
301 case PPC::BI__builtin_vsx_xxgenpcvdm:
302 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 3);
303 case PPC::BI__builtin_ppc_test_data_class: {
307 if (ArgType !=
QualType(Context.FloatTy) &&
308 ArgType !=
QualType(Context.DoubleTy) &&
309 ArgType !=
QualType(Context.Float128Ty))
311 diag::err_ppc_invalid_test_data_class_type);
312 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 127);
314 case PPC::BI__builtin_ppc_maxfe:
315 case PPC::BI__builtin_ppc_minfe:
316 case PPC::BI__builtin_ppc_maxfl:
317 case PPC::BI__builtin_ppc_minfl:
318 case PPC::BI__builtin_ppc_maxfs:
319 case PPC::BI__builtin_ppc_minfs: {
320 if (Context.getTargetInfo().getTriple().isOSAIX() &&
321 (BuiltinID == PPC::BI__builtin_ppc_maxfe ||
322 BuiltinID == PPC::BI__builtin_ppc_minfe))
324 <<
"builtin" <<
true << 128 <<
QualType(Context.LongDoubleTy)
325 <<
false << Context.getTargetInfo().getTriple().str();
328 if (BuiltinID == PPC::BI__builtin_ppc_maxfl ||
329 BuiltinID == PPC::BI__builtin_ppc_minfl)
330 ArgType =
QualType(Context.DoubleTy);
331 else if (BuiltinID == PPC::BI__builtin_ppc_maxfs ||
332 BuiltinID == PPC::BI__builtin_ppc_minfs)
333 ArgType =
QualType(Context.FloatTy);
334 for (
unsigned I = 0, E = TheCall->
getNumArgs(); I < E; ++I)
337 diag::err_typecheck_convert_incompatible)
341#define CUSTOM_BUILTIN(Name, Intr, Types, Acc, Feature) \
342 case PPC::BI__builtin_##Name: \
343 return BuiltinPPCMMACall(TheCall, BuiltinID, Types);
344#include "clang/Basic/BuiltinsPPC.def"
345 case PPC::BI__builtin_amo_lwat:
346 case PPC::BI__builtin_amo_ldat:
347 case PPC::BI__builtin_amo_lwat_s:
348 case PPC::BI__builtin_amo_ldat_s: {
352 unsigned Val =
Result.getZExtValue();
354 bool IsUnsigned = (BuiltinID == PPC::BI__builtin_amo_lwat ||
355 BuiltinID == PPC::BI__builtin_amo_ldat);
357 bool IsValid = IsUnsigned
358 ? llvm::is_contained({0u, 1u, 2u, 3u, 4u, 6u, 8u}, Val)
359 : llvm::is_contained({0u, 5u, 7u, 8u}, Val);
366 <<
toString(
Result, 10) << (IsUnsigned ?
"0-4, 6" :
"0, 5, 7") <<
"8"
369 case PPC::BI__builtin_amo_lwat_cond:
370 case PPC::BI__builtin_amo_ldat_cond:
371 case PPC::BI__builtin_amo_lwat_cond_s:
372 case PPC::BI__builtin_amo_ldat_cond_s: {
376 unsigned Val =
Result.getZExtValue();
377 if (llvm::is_contained({24u, 25u, 28u}, Val))
384 case PPC::BI__builtin_amo_stwat:
385 case PPC::BI__builtin_amo_stdat:
386 case PPC::BI__builtin_amo_stwat_s:
387 case PPC::BI__builtin_amo_stdat_s: {
391 unsigned Val =
Result.getZExtValue();
393 bool IsUnsigned = (BuiltinID == PPC::BI__builtin_amo_stwat ||
394 BuiltinID == PPC::BI__builtin_amo_stdat);
396 bool IsValid = IsUnsigned
397 ? llvm::is_contained({0u, 1u, 2u, 3u, 4u, 6u, 24u}, Val)
398 : llvm::is_contained({0u, 5u, 7u, 24u}, Val);
409 llvm_unreachable(
"must return from switch");