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:
114 return Diag(TheCall->
getBeginLoc(), diag::err_64_bit_builtin_32_bit_tgt)
124 auto IsTypeVecUChar = [&](
QualType ArgTy,
unsigned ArgIndex) ->
bool {
125 QualType VecType = Context.getVectorType(Context.UnsignedCharTy, 16,
127 if (Context.hasSameType(ArgTy, VecType))
131 diag::err_ppc_invalid_arg_type)
132 << ArgIndex << VecType << ArgTy;
137 auto IsIntType = [&](
QualType ArgTy,
unsigned ArgIndex) ->
bool {
142 diag::err_ppc_invalid_arg_type)
143 << ArgIndex <<
"integer" << ArgTy;
150 case PPC::BI__builtin_ppc_bcdsetsign: {
156 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
158 case PPC::BI__builtin_ppc_national2packed:
159 case PPC::BI__builtin_ppc_packed2zoned:
160 case PPC::BI__builtin_ppc_zoned2packed:
161 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
162 case PPC::BI__builtin_ppc_bcdshift:
163 case PPC::BI__builtin_ppc_bcdshiftround:
164 case PPC::BI__builtin_ppc_bcdtruncate: {
175 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 1);
177 case PPC::BI__builtin_altivec_crypto_vshasigmaw:
178 case PPC::BI__builtin_altivec_crypto_vshasigmad:
179 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1) ||
180 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 15);
181 case PPC::BI__builtin_altivec_dss:
182 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3);
183 case PPC::BI__builtin_tbegin:
184 case PPC::BI__builtin_tend:
185 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1);
186 case PPC::BI__builtin_tsr:
187 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 7);
188 case PPC::BI__builtin_tabortwc:
189 case PPC::BI__builtin_tabortdc:
190 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31);
191 case PPC::BI__builtin_tabortwci:
192 case PPC::BI__builtin_tabortdci:
193 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31) ||
194 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31);
198 case PPC::BI__builtin_unpack_longdouble:
199 if (
SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1))
202 case PPC::BI__builtin_pack_longdouble:
204 return Diag(TheCall->
getBeginLoc(), diag::err_ppc_builtin_requires_abi)
207 case PPC::BI__builtin_altivec_dst:
208 case PPC::BI__builtin_altivec_dstt:
209 case PPC::BI__builtin_altivec_dstst:
210 case PPC::BI__builtin_altivec_dststt:
211 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3);
212 case PPC::BI__builtin_vsx_xxpermdi:
213 case PPC::BI__builtin_vsx_xxsldwi:
215 case PPC::BI__builtin_unpack_vector_int128:
216 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
217 case PPC::BI__builtin_altivec_vgnb:
218 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 2, 7);
219 case PPC::BI__builtin_vsx_xxeval:
220 return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 255);
221 case PPC::BI__builtin_altivec_vsldbi:
222 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 7);
223 case PPC::BI__builtin_altivec_vsrdbi:
224 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 7);
225 case PPC::BI__builtin_vsx_xxpermx:
226 return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 7);
227 case PPC::BI__builtin_ppc_tw:
228 case PPC::BI__builtin_ppc_tdw:
229 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 1, 31);
230 case PPC::BI__builtin_ppc_cmprb:
231 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1);
234 case PPC::BI__builtin_ppc_rlwnm:
235 return SemaRef.ValueIsRunOfOnes(TheCall, 2);
236 case PPC::BI__builtin_ppc_rlwimi:
237 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) ||
238 SemaRef.ValueIsRunOfOnes(TheCall, 3);
239 case PPC::BI__builtin_ppc_rldimi:
240 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 63) ||
241 SemaRef.ValueIsRunOfOnes(TheCall, 3);
242 case PPC::BI__builtin_ppc_addex: {
243 if (
SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3))
253 case PPC::BI__builtin_ppc_mtfsb0:
254 case PPC::BI__builtin_ppc_mtfsb1:
255 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31);
256 case PPC::BI__builtin_ppc_mtfsf:
257 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 255);
258 case PPC::BI__builtin_ppc_mtfsfi:
259 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 7) ||
260 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 15);
261 case PPC::BI__builtin_ppc_alignx:
262 return SemaRef.BuiltinConstantArgPower2(TheCall, 0);
263 case PPC::BI__builtin_ppc_rdlam:
264 return SemaRef.ValueIsRunOfOnes(TheCall, 2);
265 case PPC::BI__builtin_vsx_ldrmb:
266 case PPC::BI__builtin_vsx_strmb:
267 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 1, 16);
268 case PPC::BI__builtin_altivec_vcntmbb:
269 case PPC::BI__builtin_altivec_vcntmbh:
270 case PPC::BI__builtin_altivec_vcntmbw:
271 case PPC::BI__builtin_altivec_vcntmbd:
272 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
273 case PPC::BI__builtin_vsx_xxgenpcvbm:
274 case PPC::BI__builtin_vsx_xxgenpcvhm:
275 case PPC::BI__builtin_vsx_xxgenpcvwm:
276 case PPC::BI__builtin_vsx_xxgenpcvdm:
277 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 3);
278 case PPC::BI__builtin_ppc_test_data_class: {
282 if (ArgType !=
QualType(Context.FloatTy) &&
283 ArgType !=
QualType(Context.DoubleTy) &&
284 ArgType !=
QualType(Context.Float128Ty))
286 diag::err_ppc_invalid_test_data_class_type);
287 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 127);
289 case PPC::BI__builtin_ppc_maxfe:
290 case PPC::BI__builtin_ppc_minfe:
291 case PPC::BI__builtin_ppc_maxfl:
292 case PPC::BI__builtin_ppc_minfl:
293 case PPC::BI__builtin_ppc_maxfs:
294 case PPC::BI__builtin_ppc_minfs: {
295 if (Context.getTargetInfo().getTriple().isOSAIX() &&
296 (BuiltinID == PPC::BI__builtin_ppc_maxfe ||
297 BuiltinID == PPC::BI__builtin_ppc_minfe))
299 <<
"builtin" <<
true << 128 <<
QualType(Context.LongDoubleTy)
300 <<
false << Context.getTargetInfo().getTriple().str();
303 if (BuiltinID == PPC::BI__builtin_ppc_maxfl ||
304 BuiltinID == PPC::BI__builtin_ppc_minfl)
305 ArgType =
QualType(Context.DoubleTy);
306 else if (BuiltinID == PPC::BI__builtin_ppc_maxfs ||
307 BuiltinID == PPC::BI__builtin_ppc_minfs)
308 ArgType =
QualType(Context.FloatTy);
309 for (
unsigned I = 0, E = TheCall->
getNumArgs(); I < E; ++I)
312 diag::err_typecheck_convert_incompatible)
316#define CUSTOM_BUILTIN(Name, Intr, Types, Acc, Feature) \
317 case PPC::BI__builtin_##Name: \
318 return BuiltinPPCMMACall(TheCall, BuiltinID, Types);
319#include "clang/Basic/BuiltinsPPC.def"
320 case PPC::BI__builtin_amo_lwat:
321 case PPC::BI__builtin_amo_ldat:
322 case PPC::BI__builtin_amo_lwat_s:
323 case PPC::BI__builtin_amo_ldat_s: {
327 unsigned Val =
Result.getZExtValue();
329 bool IsUnsigned = (BuiltinID == PPC::BI__builtin_amo_lwat ||
330 BuiltinID == PPC::BI__builtin_amo_ldat);
332 bool IsValid = IsUnsigned
333 ? llvm::is_contained({0u, 1u, 2u, 3u, 4u, 6u, 8u}, Val)
334 : llvm::is_contained({0u, 5u, 7u, 8u}, Val);
341 <<
toString(
Result, 10) << (IsUnsigned ?
"0-4, 6" :
"0, 5, 7") <<
"8"
344 case PPC::BI__builtin_amo_lwat_cond:
345 case PPC::BI__builtin_amo_ldat_cond:
346 case PPC::BI__builtin_amo_lwat_cond_s:
347 case PPC::BI__builtin_amo_ldat_cond_s: {
351 unsigned Val =
Result.getZExtValue();
352 if (llvm::is_contained({24u, 25u, 28u}, Val))
359 case PPC::BI__builtin_amo_stwat:
360 case PPC::BI__builtin_amo_stdat:
361 case PPC::BI__builtin_amo_stwat_s:
362 case PPC::BI__builtin_amo_stdat_s: {
366 unsigned Val =
Result.getZExtValue();
368 bool IsUnsigned = (BuiltinID == PPC::BI__builtin_amo_stwat ||
369 BuiltinID == PPC::BI__builtin_amo_stdat);
371 bool IsValid = IsUnsigned
372 ? llvm::is_contained({0u, 1u, 2u, 3u, 4u, 6u, 24u}, Val)
373 : llvm::is_contained({0u, 5u, 7u, 24u}, Val);
384 llvm_unreachable(
"must return from switch");