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:
151 case PPC::BI__builtin_ppc_national2packed:
152 case PPC::BI__builtin_ppc_packed2zoned:
153 case PPC::BI__builtin_ppc_zoned2packed:
154 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
155 case PPC::BI__builtin_ppc_bcdshift:
156 case PPC::BI__builtin_ppc_bcdshiftround:
157 case PPC::BI__builtin_ppc_bcdtruncate: {
168 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 1);
170 case PPC::BI__builtin_altivec_crypto_vshasigmaw:
171 case PPC::BI__builtin_altivec_crypto_vshasigmad:
172 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1) ||
173 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 15);
174 case PPC::BI__builtin_altivec_dss:
175 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3);
176 case PPC::BI__builtin_tbegin:
177 case PPC::BI__builtin_tend:
178 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1);
179 case PPC::BI__builtin_tsr:
180 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 7);
181 case PPC::BI__builtin_tabortwc:
182 case PPC::BI__builtin_tabortdc:
183 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31);
184 case PPC::BI__builtin_tabortwci:
185 case PPC::BI__builtin_tabortdci:
186 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31) ||
187 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31);
191 case PPC::BI__builtin_unpack_longdouble:
192 if (
SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1))
195 case PPC::BI__builtin_pack_longdouble:
197 return Diag(TheCall->
getBeginLoc(), diag::err_ppc_builtin_requires_abi)
200 case PPC::BI__builtin_altivec_dst:
201 case PPC::BI__builtin_altivec_dstt:
202 case PPC::BI__builtin_altivec_dstst:
203 case PPC::BI__builtin_altivec_dststt:
204 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3);
205 case PPC::BI__builtin_vsx_xxpermdi:
206 case PPC::BI__builtin_vsx_xxsldwi:
208 case PPC::BI__builtin_unpack_vector_int128:
209 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
210 case PPC::BI__builtin_altivec_vgnb:
211 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 2, 7);
212 case PPC::BI__builtin_vsx_xxeval:
213 return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 255);
214 case PPC::BI__builtin_altivec_vsldbi:
215 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 7);
216 case PPC::BI__builtin_altivec_vsrdbi:
217 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 7);
218 case PPC::BI__builtin_vsx_xxpermx:
219 return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 7);
220 case PPC::BI__builtin_ppc_tw:
221 case PPC::BI__builtin_ppc_tdw:
222 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 1, 31);
223 case PPC::BI__builtin_ppc_cmprb:
224 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1);
227 case PPC::BI__builtin_ppc_rlwnm:
228 return SemaRef.ValueIsRunOfOnes(TheCall, 2);
229 case PPC::BI__builtin_ppc_rlwimi:
230 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) ||
231 SemaRef.ValueIsRunOfOnes(TheCall, 3);
232 case PPC::BI__builtin_ppc_rldimi:
233 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 63) ||
234 SemaRef.ValueIsRunOfOnes(TheCall, 3);
235 case PPC::BI__builtin_ppc_addex: {
236 if (
SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3))
246 case PPC::BI__builtin_ppc_mtfsb0:
247 case PPC::BI__builtin_ppc_mtfsb1:
248 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31);
249 case PPC::BI__builtin_ppc_mtfsf:
250 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 255);
251 case PPC::BI__builtin_ppc_mtfsfi:
252 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 7) ||
253 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 15);
254 case PPC::BI__builtin_ppc_alignx:
255 return SemaRef.BuiltinConstantArgPower2(TheCall, 0);
256 case PPC::BI__builtin_ppc_rdlam:
257 return SemaRef.ValueIsRunOfOnes(TheCall, 2);
258 case PPC::BI__builtin_vsx_ldrmb:
259 case PPC::BI__builtin_vsx_strmb:
260 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 1, 16);
261 case PPC::BI__builtin_altivec_vcntmbb:
262 case PPC::BI__builtin_altivec_vcntmbh:
263 case PPC::BI__builtin_altivec_vcntmbw:
264 case PPC::BI__builtin_altivec_vcntmbd:
265 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
266 case PPC::BI__builtin_vsx_xxgenpcvbm:
267 case PPC::BI__builtin_vsx_xxgenpcvhm:
268 case PPC::BI__builtin_vsx_xxgenpcvwm:
269 case PPC::BI__builtin_vsx_xxgenpcvdm:
270 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 3);
271 case PPC::BI__builtin_ppc_test_data_class: {
275 if (ArgType !=
QualType(Context.FloatTy) &&
276 ArgType !=
QualType(Context.DoubleTy) &&
277 ArgType !=
QualType(Context.Float128Ty))
279 diag::err_ppc_invalid_test_data_class_type);
280 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 127);
282 case PPC::BI__builtin_ppc_maxfe:
283 case PPC::BI__builtin_ppc_minfe:
284 case PPC::BI__builtin_ppc_maxfl:
285 case PPC::BI__builtin_ppc_minfl:
286 case PPC::BI__builtin_ppc_maxfs:
287 case PPC::BI__builtin_ppc_minfs: {
288 if (Context.getTargetInfo().getTriple().isOSAIX() &&
289 (BuiltinID == PPC::BI__builtin_ppc_maxfe ||
290 BuiltinID == PPC::BI__builtin_ppc_minfe))
292 <<
"builtin" <<
true << 128 <<
QualType(Context.LongDoubleTy)
293 <<
false << Context.getTargetInfo().getTriple().str();
296 if (BuiltinID == PPC::BI__builtin_ppc_maxfl ||
297 BuiltinID == PPC::BI__builtin_ppc_minfl)
298 ArgType =
QualType(Context.DoubleTy);
299 else if (BuiltinID == PPC::BI__builtin_ppc_maxfs ||
300 BuiltinID == PPC::BI__builtin_ppc_minfs)
301 ArgType =
QualType(Context.FloatTy);
302 for (
unsigned I = 0, E = TheCall->
getNumArgs(); I < E; ++I)
305 diag::err_typecheck_convert_incompatible)
309#define CUSTOM_BUILTIN(Name, Intr, Types, Acc, Feature) \
310 case PPC::BI__builtin_##Name: \
311 return BuiltinPPCMMACall(TheCall, BuiltinID, Types);
312#include "clang/Basic/BuiltinsPPC.def"
313 case PPC::BI__builtin_amo_lwat:
314 case PPC::BI__builtin_amo_ldat:
315 case PPC::BI__builtin_amo_lwat_s:
316 case PPC::BI__builtin_amo_ldat_s: {
320 unsigned Val =
Result.getZExtValue();
322 bool IsUnsigned = (BuiltinID == PPC::BI__builtin_amo_lwat ||
323 BuiltinID == PPC::BI__builtin_amo_ldat);
325 bool IsValid = IsUnsigned
326 ? llvm::is_contained({0u, 1u, 2u, 3u, 4u, 6u, 8u}, Val)
327 : llvm::is_contained({0u, 5u, 7u, 8u}, Val);
334 <<
toString(
Result, 10) << (IsUnsigned ?
"0-4, 6" :
"0, 5, 7") <<
"8"
337 case PPC::BI__builtin_amo_lwat_cond:
338 case PPC::BI__builtin_amo_ldat_cond:
339 case PPC::BI__builtin_amo_lwat_cond_s:
340 case PPC::BI__builtin_amo_ldat_cond_s: {
344 unsigned Val =
Result.getZExtValue();
345 if (llvm::is_contained({24u, 25u, 28u}, Val))
352 case PPC::BI__builtin_amo_stwat:
353 case PPC::BI__builtin_amo_stdat:
354 case PPC::BI__builtin_amo_stwat_s:
355 case PPC::BI__builtin_amo_stdat_s: {
359 unsigned Val =
Result.getZExtValue();
361 bool IsUnsigned = (BuiltinID == PPC::BI__builtin_amo_stwat ||
362 BuiltinID == PPC::BI__builtin_amo_stdat);
364 bool IsValid = IsUnsigned
365 ? llvm::is_contained({0u, 1u, 2u, 3u, 4u, 6u, 24u}, Val)
366 : llvm::is_contained({0u, 5u, 7u, 24u}, Val);
377 llvm_unreachable(
"must return from switch");