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