60 case PPC::BI__builtin_divde:
61 case PPC::BI__builtin_divdeu:
62 case PPC::BI__builtin_bpermd:
63 case PPC::BI__builtin_pdepd:
64 case PPC::BI__builtin_pextd:
65 case PPC::BI__builtin_ppc_cdtbcd:
66 case PPC::BI__builtin_ppc_cbcdtd:
67 case PPC::BI__builtin_ppc_addg6s:
68 case PPC::BI__builtin_ppc_ldarx:
69 case PPC::BI__builtin_ppc_stdcx:
70 case PPC::BI__builtin_ppc_tdw:
71 case PPC::BI__builtin_ppc_trapd:
72 case PPC::BI__builtin_ppc_cmpeqb:
73 case PPC::BI__builtin_ppc_setb:
74 case PPC::BI__builtin_ppc_mulhd:
75 case PPC::BI__builtin_ppc_mulhdu:
76 case PPC::BI__builtin_ppc_maddhd:
77 case PPC::BI__builtin_ppc_maddhdu:
78 case PPC::BI__builtin_ppc_maddld:
79 case PPC::BI__builtin_ppc_load8r:
80 case PPC::BI__builtin_ppc_store8r:
81 case PPC::BI__builtin_ppc_insert_exp:
82 case PPC::BI__builtin_ppc_extract_sig:
83 case PPC::BI__builtin_ppc_addex:
84 case PPC::BI__builtin_darn:
85 case PPC::BI__builtin_darn_raw:
86 case PPC::BI__builtin_ppc_compare_and_swaplp:
87 case PPC::BI__builtin_ppc_fetch_and_addlp:
88 case PPC::BI__builtin_ppc_fetch_and_andlp:
89 case PPC::BI__builtin_ppc_fetch_and_orlp:
90 case PPC::BI__builtin_ppc_fetch_and_swaplp:
91 case PPC::BI__builtin_amo_lwat:
92 case PPC::BI__builtin_amo_ldat:
93 case PPC::BI__builtin_amo_lwat_s:
94 case PPC::BI__builtin_amo_ldat_s:
95 case PPC::BI__builtin_amo_lwat_cond:
96 case PPC::BI__builtin_amo_ldat_cond:
97 case PPC::BI__builtin_amo_lwat_cond_s:
98 case PPC::BI__builtin_amo_ldat_cond_s:
99 case PPC::BI__builtin_amo_stwat:
100 case PPC::BI__builtin_amo_stdat:
101 case PPC::BI__builtin_amo_stwat_s:
102 case PPC::BI__builtin_amo_stdat_s:
103 case PPC::BI__builtin_amo_lwat_csne:
104 case PPC::BI__builtin_amo_ldat_csne:
105 case PPC::BI__builtin_amo_lwat_csne_s:
106 case PPC::BI__builtin_amo_ldat_csne_s:
119 return Diag(TheCall->
getBeginLoc(), diag::err_64_bit_builtin_32_bit_tgt)
129 auto IsTypeVecUChar = [&](
QualType ArgTy,
unsigned ArgIndex) ->
bool {
130 QualType VecType = Context.getVectorType(Context.UnsignedCharTy, 16,
132 if (Context.hasSameType(ArgTy, VecType))
136 diag::err_ppc_invalid_arg_type)
137 << ArgIndex << VecType << ArgTy;
142 auto IsIntType = [&](
QualType ArgTy,
unsigned ArgIndex) ->
bool {
147 diag::err_ppc_invalid_arg_type)
148 << ArgIndex <<
"integer" << ArgTy;
155 case PPC::BI__builtin_ppc_bcdsetsign: {
161 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
163 case PPC::BI__builtin_ppc_national2packed:
164 case PPC::BI__builtin_ppc_packed2zoned:
165 case PPC::BI__builtin_ppc_zoned2packed:
166 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
167 case PPC::BI__builtin_ppc_bcdshift:
168 case PPC::BI__builtin_ppc_bcdshiftround:
169 case PPC::BI__builtin_ppc_bcdtruncate: {
180 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 1);
182 case PPC::BI__builtin_altivec_crypto_vshasigmaw:
183 case PPC::BI__builtin_altivec_crypto_vshasigmad:
184 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1) ||
185 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 15);
186 case PPC::BI__builtin_altivec_dss:
187 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3);
188 case PPC::BI__builtin_tbegin:
189 case PPC::BI__builtin_tend:
190 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1);
191 case PPC::BI__builtin_tsr:
192 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 7);
193 case PPC::BI__builtin_tabortwc:
194 case PPC::BI__builtin_tabortdc:
195 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31);
196 case PPC::BI__builtin_tabortwci:
197 case PPC::BI__builtin_tabortdci:
198 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31) ||
199 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31);
203 case PPC::BI__builtin_unpack_longdouble:
204 if (
SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1))
207 case PPC::BI__builtin_pack_longdouble:
209 return Diag(TheCall->
getBeginLoc(), diag::err_ppc_builtin_requires_abi)
212 case PPC::BI__builtin_altivec_dst:
213 case PPC::BI__builtin_altivec_dstt:
214 case PPC::BI__builtin_altivec_dstst:
215 case PPC::BI__builtin_altivec_dststt:
216 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3);
217 case PPC::BI__builtin_vsx_xxpermdi:
218 case PPC::BI__builtin_vsx_xxsldwi:
220 case PPC::BI__builtin_unpack_vector_int128:
221 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
222 case PPC::BI__builtin_altivec_vgnb:
223 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 2, 7);
224 case PPC::BI__builtin_vsx_xxeval:
225 return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 255);
226 case PPC::BI__builtin_altivec_vsldbi:
227 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 7);
228 case PPC::BI__builtin_altivec_vsrdbi:
229 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 7);
230 case PPC::BI__builtin_vsx_xxpermx:
231 return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 7);
232 case PPC::BI__builtin_ppc_tw:
233 case PPC::BI__builtin_ppc_tdw:
234 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 1, 31);
235 case PPC::BI__builtin_ppc_cmprb:
236 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1);
239 case PPC::BI__builtin_ppc_rlwnm:
240 return SemaRef.ValueIsRunOfOnes(TheCall, 2);
241 case PPC::BI__builtin_ppc_rlwimi:
242 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) ||
243 SemaRef.ValueIsRunOfOnes(TheCall, 3);
244 case PPC::BI__builtin_ppc_rldimi:
245 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 63) ||
246 SemaRef.ValueIsRunOfOnes(TheCall, 3);
247 case PPC::BI__builtin_ppc_addex: {
248 if (
SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3))
258 case PPC::BI__builtin_ppc_mtfsb0:
259 case PPC::BI__builtin_ppc_mtfsb1:
260 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31);
261 case PPC::BI__builtin_ppc_mtfsf:
262 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 255);
263 case PPC::BI__builtin_ppc_mtfsfi:
264 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 7) ||
265 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 15);
266 case PPC::BI__builtin_ppc_alignx:
267 return SemaRef.BuiltinConstantArgPower2(TheCall, 0);
268 case PPC::BI__builtin_ppc_rdlam:
269 return SemaRef.ValueIsRunOfOnes(TheCall, 2);
270 case PPC::BI__builtin_vsx_ldrmb:
271 case PPC::BI__builtin_vsx_strmb:
272 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 1, 16);
273 case PPC::BI__builtin_altivec_vcntmbb:
274 case PPC::BI__builtin_altivec_vcntmbh:
275 case PPC::BI__builtin_altivec_vcntmbw:
276 case PPC::BI__builtin_altivec_vcntmbd:
277 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
278 case PPC::BI__builtin_vsx_xxgenpcvbm:
279 case PPC::BI__builtin_vsx_xxgenpcvhm:
280 case PPC::BI__builtin_vsx_xxgenpcvwm:
281 case PPC::BI__builtin_vsx_xxgenpcvdm:
282 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 3);
283 case PPC::BI__builtin_ppc_test_data_class: {
287 if (ArgType !=
QualType(Context.FloatTy) &&
288 ArgType !=
QualType(Context.DoubleTy) &&
289 ArgType !=
QualType(Context.Float128Ty))
291 diag::err_ppc_invalid_test_data_class_type);
292 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 127);
294 case PPC::BI__builtin_ppc_maxfe:
295 case PPC::BI__builtin_ppc_minfe:
296 case PPC::BI__builtin_ppc_maxfl:
297 case PPC::BI__builtin_ppc_minfl:
298 case PPC::BI__builtin_ppc_maxfs:
299 case PPC::BI__builtin_ppc_minfs: {
300 if (Context.getTargetInfo().getTriple().isOSAIX() &&
301 (BuiltinID == PPC::BI__builtin_ppc_maxfe ||
302 BuiltinID == PPC::BI__builtin_ppc_minfe))
304 <<
"builtin" <<
true << 128 <<
QualType(Context.LongDoubleTy)
305 <<
false << Context.getTargetInfo().getTriple().str();
308 if (BuiltinID == PPC::BI__builtin_ppc_maxfl ||
309 BuiltinID == PPC::BI__builtin_ppc_minfl)
310 ArgType =
QualType(Context.DoubleTy);
311 else if (BuiltinID == PPC::BI__builtin_ppc_maxfs ||
312 BuiltinID == PPC::BI__builtin_ppc_minfs)
313 ArgType =
QualType(Context.FloatTy);
314 for (
unsigned I = 0, E = TheCall->
getNumArgs(); I < E; ++I)
317 diag::err_typecheck_convert_incompatible)
321#define CUSTOM_BUILTIN(Name, Intr, Types, Acc, Feature) \
322 case PPC::BI__builtin_##Name: \
323 return BuiltinPPCMMACall(TheCall, BuiltinID, Types);
324#include "clang/Basic/BuiltinsPPC.def"
325 case PPC::BI__builtin_amo_lwat:
326 case PPC::BI__builtin_amo_ldat:
327 case PPC::BI__builtin_amo_lwat_s:
328 case PPC::BI__builtin_amo_ldat_s: {
332 unsigned Val =
Result.getZExtValue();
334 bool IsUnsigned = (BuiltinID == PPC::BI__builtin_amo_lwat ||
335 BuiltinID == PPC::BI__builtin_amo_ldat);
337 bool IsValid = IsUnsigned
338 ? llvm::is_contained({0u, 1u, 2u, 3u, 4u, 6u, 8u}, Val)
339 : llvm::is_contained({0u, 5u, 7u, 8u}, Val);
346 <<
toString(
Result, 10) << (IsUnsigned ?
"0-4, 6" :
"0, 5, 7") <<
"8"
349 case PPC::BI__builtin_amo_lwat_cond:
350 case PPC::BI__builtin_amo_ldat_cond:
351 case PPC::BI__builtin_amo_lwat_cond_s:
352 case PPC::BI__builtin_amo_ldat_cond_s: {
356 unsigned Val =
Result.getZExtValue();
357 if (llvm::is_contained({24u, 25u, 28u}, Val))
364 case PPC::BI__builtin_amo_stwat:
365 case PPC::BI__builtin_amo_stdat:
366 case PPC::BI__builtin_amo_stwat_s:
367 case PPC::BI__builtin_amo_stdat_s: {
371 unsigned Val =
Result.getZExtValue();
373 bool IsUnsigned = (BuiltinID == PPC::BI__builtin_amo_stwat ||
374 BuiltinID == PPC::BI__builtin_amo_stdat);
376 bool IsValid = IsUnsigned
377 ? llvm::is_contained({0u, 1u, 2u, 3u, 4u, 6u, 24u}, Val)
378 : llvm::is_contained({0u, 5u, 7u, 24u}, Val);
389 llvm_unreachable(
"must return from switch");