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:
104 return Diag(TheCall->
getBeginLoc(), diag::err_64_bit_builtin_32_bit_tgt)
110 case PPC::BI__builtin_ppc_bcdsetsign:
111 case PPC::BI__builtin_ppc_national2packed:
112 case PPC::BI__builtin_ppc_packed2zoned:
113 case PPC::BI__builtin_ppc_zoned2packed:
114 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
115 case PPC::BI__builtin_altivec_crypto_vshasigmaw:
116 case PPC::BI__builtin_altivec_crypto_vshasigmad:
117 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1) ||
118 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 15);
119 case PPC::BI__builtin_altivec_dss:
120 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3);
121 case PPC::BI__builtin_tbegin:
122 case PPC::BI__builtin_tend:
123 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1);
124 case PPC::BI__builtin_tsr:
125 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 7);
126 case PPC::BI__builtin_tabortwc:
127 case PPC::BI__builtin_tabortdc:
128 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31);
129 case PPC::BI__builtin_tabortwci:
130 case PPC::BI__builtin_tabortdci:
131 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31) ||
132 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31);
136 case PPC::BI__builtin_unpack_longdouble:
137 if (
SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1))
140 case PPC::BI__builtin_pack_longdouble:
142 return Diag(TheCall->
getBeginLoc(), diag::err_ppc_builtin_requires_abi)
145 case PPC::BI__builtin_altivec_dst:
146 case PPC::BI__builtin_altivec_dstt:
147 case PPC::BI__builtin_altivec_dstst:
148 case PPC::BI__builtin_altivec_dststt:
149 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3);
150 case PPC::BI__builtin_vsx_xxpermdi:
151 case PPC::BI__builtin_vsx_xxsldwi:
153 case PPC::BI__builtin_unpack_vector_int128:
154 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
155 case PPC::BI__builtin_altivec_vgnb:
156 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 2, 7);
157 case PPC::BI__builtin_vsx_xxeval:
158 return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 255);
159 case PPC::BI__builtin_altivec_vsldbi:
160 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 7);
161 case PPC::BI__builtin_altivec_vsrdbi:
162 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 7);
163 case PPC::BI__builtin_vsx_xxpermx:
164 return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 7);
165 case PPC::BI__builtin_ppc_tw:
166 case PPC::BI__builtin_ppc_tdw:
167 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 1, 31);
168 case PPC::BI__builtin_ppc_cmprb:
169 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 1);
172 case PPC::BI__builtin_ppc_rlwnm:
173 return SemaRef.ValueIsRunOfOnes(TheCall, 2);
174 case PPC::BI__builtin_ppc_rlwimi:
175 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 31) ||
176 SemaRef.ValueIsRunOfOnes(TheCall, 3);
177 case PPC::BI__builtin_ppc_rldimi:
178 return SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 63) ||
179 SemaRef.ValueIsRunOfOnes(TheCall, 3);
180 case PPC::BI__builtin_ppc_addex: {
181 if (
SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3))
191 case PPC::BI__builtin_ppc_mtfsb0:
192 case PPC::BI__builtin_ppc_mtfsb1:
193 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 31);
194 case PPC::BI__builtin_ppc_mtfsf:
195 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 255);
196 case PPC::BI__builtin_ppc_mtfsfi:
197 return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 7) ||
198 SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 15);
199 case PPC::BI__builtin_ppc_alignx:
200 return SemaRef.BuiltinConstantArgPower2(TheCall, 0);
201 case PPC::BI__builtin_ppc_rdlam:
202 return SemaRef.ValueIsRunOfOnes(TheCall, 2);
203 case PPC::BI__builtin_vsx_ldrmb:
204 case PPC::BI__builtin_vsx_strmb:
205 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 1, 16);
206 case PPC::BI__builtin_altivec_vcntmbb:
207 case PPC::BI__builtin_altivec_vcntmbh:
208 case PPC::BI__builtin_altivec_vcntmbw:
209 case PPC::BI__builtin_altivec_vcntmbd:
210 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1);
211 case PPC::BI__builtin_vsx_xxgenpcvbm:
212 case PPC::BI__builtin_vsx_xxgenpcvhm:
213 case PPC::BI__builtin_vsx_xxgenpcvwm:
214 case PPC::BI__builtin_vsx_xxgenpcvdm:
215 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 3);
216 case PPC::BI__builtin_ppc_test_data_class: {
220 if (ArgType !=
QualType(Context.FloatTy) &&
221 ArgType !=
QualType(Context.DoubleTy) &&
222 ArgType !=
QualType(Context.Float128Ty))
224 diag::err_ppc_invalid_test_data_class_type);
225 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 127);
227 case PPC::BI__builtin_ppc_maxfe:
228 case PPC::BI__builtin_ppc_minfe:
229 case PPC::BI__builtin_ppc_maxfl:
230 case PPC::BI__builtin_ppc_minfl:
231 case PPC::BI__builtin_ppc_maxfs:
232 case PPC::BI__builtin_ppc_minfs: {
233 if (Context.getTargetInfo().getTriple().isOSAIX() &&
234 (BuiltinID == PPC::BI__builtin_ppc_maxfe ||
235 BuiltinID == PPC::BI__builtin_ppc_minfe))
237 <<
"builtin" <<
true << 128 <<
QualType(Context.LongDoubleTy)
238 <<
false << Context.getTargetInfo().getTriple().str();
241 if (BuiltinID == PPC::BI__builtin_ppc_maxfl ||
242 BuiltinID == PPC::BI__builtin_ppc_minfl)
243 ArgType =
QualType(Context.DoubleTy);
244 else if (BuiltinID == PPC::BI__builtin_ppc_maxfs ||
245 BuiltinID == PPC::BI__builtin_ppc_minfs)
246 ArgType =
QualType(Context.FloatTy);
247 for (
unsigned I = 0, E = TheCall->
getNumArgs(); I < E; ++I)
250 diag::err_typecheck_convert_incompatible)
254#define CUSTOM_BUILTIN(Name, Intr, Types, Acc, Feature) \
255 case PPC::BI__builtin_##Name: \
256 return BuiltinPPCMMACall(TheCall, BuiltinID, Types);
257#include "clang/Basic/BuiltinsPPC.def"
258 case PPC::BI__builtin_amo_lwat:
259 case PPC::BI__builtin_amo_ldat: {
263 unsigned Val =
Result.getZExtValue();
264 static constexpr unsigned ValidFC[] = {0, 1, 2, 3, 4, 6, 8};
265 if (llvm::is_contained(ValidFC, Val))
272 llvm_unreachable(
"must return from switch");