17#include "llvm/TargetParser/PPCTargetParser.h"
23#define BUILTIN(ID, TYPE, ATTRS) \
24 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
25#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
26 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
27#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
28 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::HEADER, ALL_LANGUAGES},
29#include "clang/Basic/BuiltinsPPC.def"
37 for (
const auto &Feature : Features) {
38 if (Feature ==
"+altivec") {
40 }
else if (Feature ==
"+vsx") {
42 }
else if (Feature ==
"+crbits") {
44 }
else if (Feature ==
"+bpermd") {
46 }
else if (Feature ==
"+extdiv") {
48 }
else if (Feature ==
"+power8-vector") {
50 }
else if (Feature ==
"+crypto") {
52 }
else if (Feature ==
"+direct-move") {
54 }
else if (Feature ==
"+htm") {
56 }
else if (Feature ==
"+float128") {
58 }
else if (Feature ==
"+power9-vector") {
60 }
else if (Feature ==
"+power10-vector") {
62 }
else if (Feature ==
"+pcrelative-memops") {
63 HasPCRelativeMemops =
true;
64 }
else if (Feature ==
"+prefix-instrs") {
65 HasPrefixInstrs =
true;
66 }
else if (Feature ==
"+spe" || Feature ==
"+efpu2") {
71 }
else if (Feature ==
"+frsqrte") {
73 }
else if (Feature ==
"+frsqrtes") {
75 }
else if (Feature ==
"-hard-float") {
77 }
else if (Feature ==
"+paired-vector-memops") {
78 PairedVectorMemops =
true;
79 }
else if (Feature ==
"+mma") {
81 }
else if (Feature ==
"+rop-protect") {
83 }
else if (Feature ==
"+privileged") {
85 }
else if (Feature ==
"+aix-small-local-exec-tls") {
86 HasAIXSmallLocalExecTLS =
true;
87 }
else if (Feature ==
"+aix-small-local-dynamic-tls") {
88 HasAIXSmallLocalDynamicTLS =
true;
89 }
else if (Feature ==
"+isa-v206-instructions") {
91 }
else if (Feature ==
"+isa-v207-instructions") {
93 }
else if (Feature ==
"+isa-v30-instructions") {
95 }
else if (Feature ==
"+isa-v31-instructions") {
97 }
else if (Feature ==
"+quadword-atomics") {
98 HasQuadwordAtomics =
true;
99 }
else if (Feature ==
"+aix-shared-lib-tls-model-opt") {
100 HasAIXShLibTLSModelOpt =
true;
101 }
else if (Feature ==
"+longcall") {
112 Builder.defineMacro(
"__cdtbcd",
"__builtin_ppc_cdtbcd");
113 Builder.defineMacro(
"__cbcdtd",
"__builtin_ppc_cbcdtd");
114 Builder.defineMacro(
"__addg6s",
"__builtin_ppc_addg6s");
115 Builder.defineMacro(
"__popcntb",
"__builtin_ppc_popcntb");
116 Builder.defineMacro(
"__poppar4",
"__builtin_ppc_poppar4");
117 Builder.defineMacro(
"__poppar8",
"__builtin_ppc_poppar8");
118 Builder.defineMacro(
"__eieio",
"__builtin_ppc_eieio");
119 Builder.defineMacro(
"__iospace_eieio",
"__builtin_ppc_iospace_eieio");
120 Builder.defineMacro(
"__isync",
"__builtin_ppc_isync");
121 Builder.defineMacro(
"__lwsync",
"__builtin_ppc_lwsync");
122 Builder.defineMacro(
"__iospace_lwsync",
"__builtin_ppc_iospace_lwsync");
123 Builder.defineMacro(
"__sync",
"__builtin_ppc_sync");
124 Builder.defineMacro(
"__iospace_sync",
"__builtin_ppc_iospace_sync");
125 Builder.defineMacro(
"__dcbfl",
"__builtin_ppc_dcbfl");
126 Builder.defineMacro(
"__dcbflp",
"__builtin_ppc_dcbflp");
127 Builder.defineMacro(
"__dcbst",
"__builtin_ppc_dcbst");
128 Builder.defineMacro(
"__dcbt",
"__builtin_ppc_dcbt");
129 Builder.defineMacro(
"__dcbtst",
"__builtin_ppc_dcbtst");
130 Builder.defineMacro(
"__dcbz",
"__builtin_ppc_dcbz");
131 Builder.defineMacro(
"__icbt",
"__builtin_ppc_icbt");
132 Builder.defineMacro(
"__compare_and_swap",
"__builtin_ppc_compare_and_swap");
133 Builder.defineMacro(
"__compare_and_swaplp",
134 "__builtin_ppc_compare_and_swaplp");
135 Builder.defineMacro(
"__fetch_and_add",
"__builtin_ppc_fetch_and_add");
136 Builder.defineMacro(
"__fetch_and_addlp",
"__builtin_ppc_fetch_and_addlp");
137 Builder.defineMacro(
"__fetch_and_and",
"__builtin_ppc_fetch_and_and");
138 Builder.defineMacro(
"__fetch_and_andlp",
"__builtin_ppc_fetch_and_andlp");
139 Builder.defineMacro(
"__fetch_and_or",
"__builtin_ppc_fetch_and_or");
140 Builder.defineMacro(
"__fetch_and_orlp",
"__builtin_ppc_fetch_and_orlp");
141 Builder.defineMacro(
"__fetch_and_swap",
"__builtin_ppc_fetch_and_swap");
142 Builder.defineMacro(
"__fetch_and_swaplp",
"__builtin_ppc_fetch_and_swaplp");
143 Builder.defineMacro(
"__ldarx",
"__builtin_ppc_ldarx");
144 Builder.defineMacro(
"__lwarx",
"__builtin_ppc_lwarx");
145 Builder.defineMacro(
"__lharx",
"__builtin_ppc_lharx");
146 Builder.defineMacro(
"__lbarx",
"__builtin_ppc_lbarx");
147 Builder.defineMacro(
"__stfiw",
"__builtin_ppc_stfiw");
148 Builder.defineMacro(
"__stdcx",
"__builtin_ppc_stdcx");
149 Builder.defineMacro(
"__stwcx",
"__builtin_ppc_stwcx");
150 Builder.defineMacro(
"__sthcx",
"__builtin_ppc_sthcx");
151 Builder.defineMacro(
"__stbcx",
"__builtin_ppc_stbcx");
152 Builder.defineMacro(
"__tdw",
"__builtin_ppc_tdw");
153 Builder.defineMacro(
"__tw",
"__builtin_ppc_tw");
154 Builder.defineMacro(
"__trap",
"__builtin_ppc_trap");
155 Builder.defineMacro(
"__trapd",
"__builtin_ppc_trapd");
156 Builder.defineMacro(
"__fcfid",
"__builtin_ppc_fcfid");
157 Builder.defineMacro(
"__fcfud",
"__builtin_ppc_fcfud");
158 Builder.defineMacro(
"__fctid",
"__builtin_ppc_fctid");
159 Builder.defineMacro(
"__fctidz",
"__builtin_ppc_fctidz");
160 Builder.defineMacro(
"__fctiw",
"__builtin_ppc_fctiw");
161 Builder.defineMacro(
"__fctiwz",
"__builtin_ppc_fctiwz");
162 Builder.defineMacro(
"__fctudz",
"__builtin_ppc_fctudz");
163 Builder.defineMacro(
"__fctuwz",
"__builtin_ppc_fctuwz");
164 Builder.defineMacro(
"__cmpeqb",
"__builtin_ppc_cmpeqb");
165 Builder.defineMacro(
"__cmprb",
"__builtin_ppc_cmprb");
166 Builder.defineMacro(
"__setb",
"__builtin_ppc_setb");
167 Builder.defineMacro(
"__cmpb",
"__builtin_ppc_cmpb");
168 Builder.defineMacro(
"__mulhd",
"__builtin_ppc_mulhd");
169 Builder.defineMacro(
"__mulhdu",
"__builtin_ppc_mulhdu");
170 Builder.defineMacro(
"__mulhw",
"__builtin_ppc_mulhw");
171 Builder.defineMacro(
"__mulhwu",
"__builtin_ppc_mulhwu");
172 Builder.defineMacro(
"__maddhd",
"__builtin_ppc_maddhd");
173 Builder.defineMacro(
"__maddhdu",
"__builtin_ppc_maddhdu");
174 Builder.defineMacro(
"__maddld",
"__builtin_ppc_maddld");
175 Builder.defineMacro(
"__rlwnm",
"__builtin_ppc_rlwnm");
176 Builder.defineMacro(
"__rlwimi",
"__builtin_ppc_rlwimi");
177 Builder.defineMacro(
"__rldimi",
"__builtin_ppc_rldimi");
178 Builder.defineMacro(
"__load2r",
"__builtin_ppc_load2r");
179 Builder.defineMacro(
"__load4r",
"__builtin_ppc_load4r");
180 Builder.defineMacro(
"__load8r",
"__builtin_ppc_load8r");
181 Builder.defineMacro(
"__store2r",
"__builtin_ppc_store2r");
182 Builder.defineMacro(
"__store4r",
"__builtin_ppc_store4r");
183 Builder.defineMacro(
"__store8r",
"__builtin_ppc_store8r");
184 Builder.defineMacro(
"__extract_exp",
"__builtin_ppc_extract_exp");
185 Builder.defineMacro(
"__extract_sig",
"__builtin_ppc_extract_sig");
186 Builder.defineMacro(
"__mtfsb0",
"__builtin_ppc_mtfsb0");
187 Builder.defineMacro(
"__mtfsb1",
"__builtin_ppc_mtfsb1");
188 Builder.defineMacro(
"__mtfsf",
"__builtin_ppc_mtfsf");
189 Builder.defineMacro(
"__mtfsfi",
"__builtin_ppc_mtfsfi");
190 Builder.defineMacro(
"__insert_exp",
"__builtin_ppc_insert_exp");
191 Builder.defineMacro(
"__fmsub",
"__builtin_ppc_fmsub");
192 Builder.defineMacro(
"__fmsubs",
"__builtin_ppc_fmsubs");
193 Builder.defineMacro(
"__fnmadd",
"__builtin_ppc_fnmadd");
194 Builder.defineMacro(
"__fnmadds",
"__builtin_ppc_fnmadds");
195 Builder.defineMacro(
"__fnmsub",
"__builtin_ppc_fnmsub");
196 Builder.defineMacro(
"__fnmsubs",
"__builtin_ppc_fnmsubs");
197 Builder.defineMacro(
"__fre",
"__builtin_ppc_fre");
198 Builder.defineMacro(
"__fres",
"__builtin_ppc_fres");
199 Builder.defineMacro(
"__swdiv_nochk",
"__builtin_ppc_swdiv_nochk");
200 Builder.defineMacro(
"__swdivs_nochk",
"__builtin_ppc_swdivs_nochk");
201 Builder.defineMacro(
"__alloca",
"__builtin_alloca");
202 Builder.defineMacro(
"__vcipher",
"__builtin_altivec_crypto_vcipher");
203 Builder.defineMacro(
"__vcipherlast",
"__builtin_altivec_crypto_vcipherlast");
204 Builder.defineMacro(
"__vncipher",
"__builtin_altivec_crypto_vncipher");
205 Builder.defineMacro(
"__vncipherlast",
206 "__builtin_altivec_crypto_vncipherlast");
207 Builder.defineMacro(
"__vpermxor",
"__builtin_altivec_crypto_vpermxor");
208 Builder.defineMacro(
"__vpmsumb",
"__builtin_altivec_crypto_vpmsumb");
209 Builder.defineMacro(
"__vpmsumd",
"__builtin_altivec_crypto_vpmsumd");
210 Builder.defineMacro(
"__vpmsumh",
"__builtin_altivec_crypto_vpmsumh");
211 Builder.defineMacro(
"__vpmsumw",
"__builtin_altivec_crypto_vpmsumw");
212 Builder.defineMacro(
"__divde",
"__builtin_divde");
213 Builder.defineMacro(
"__divwe",
"__builtin_divwe");
214 Builder.defineMacro(
"__divdeu",
"__builtin_divdeu");
215 Builder.defineMacro(
"__divweu",
"__builtin_divweu");
216 Builder.defineMacro(
"__alignx",
"__builtin_ppc_alignx");
217 Builder.defineMacro(
"__bcopy",
"bcopy");
218 Builder.defineMacro(
"__bpermd",
"__builtin_bpermd");
219 Builder.defineMacro(
"__cntlz4",
"__builtin_clz");
220 Builder.defineMacro(
"__cntlz8",
"__builtin_clzll");
221 Builder.defineMacro(
"__cmplx",
"__builtin_complex");
222 Builder.defineMacro(
"__cmplxf",
"__builtin_complex");
223 Builder.defineMacro(
"__cnttz4",
"__builtin_ctz");
224 Builder.defineMacro(
"__cnttz8",
"__builtin_ctzll");
225 Builder.defineMacro(
"__darn",
"__builtin_darn");
226 Builder.defineMacro(
"__darn_32",
"__builtin_darn_32");
227 Builder.defineMacro(
"__darn_raw",
"__builtin_darn_raw");
228 Builder.defineMacro(
"__dcbf",
"__builtin_dcbf");
229 Builder.defineMacro(
"__fence",
"__builtin_ppc_fence");
230 Builder.defineMacro(
"__fmadd",
"__builtin_fma");
231 Builder.defineMacro(
"__fmadds",
"__builtin_fmaf");
232 Builder.defineMacro(
"__abs",
"__builtin_abs");
233 Builder.defineMacro(
"__labs",
"__builtin_labs");
234 Builder.defineMacro(
"__llabs",
"__builtin_llabs");
235 Builder.defineMacro(
"__popcnt4",
"__builtin_popcount");
236 Builder.defineMacro(
"__popcnt8",
"__builtin_popcountll");
237 Builder.defineMacro(
"__readflm",
"__builtin_readflm");
238 Builder.defineMacro(
"__rotatel4",
"__builtin_rotateleft32");
239 Builder.defineMacro(
"__rotatel8",
"__builtin_rotateleft64");
240 Builder.defineMacro(
"__rdlam",
"__builtin_ppc_rdlam");
241 Builder.defineMacro(
"__setflm",
"__builtin_setflm");
242 Builder.defineMacro(
"__setrnd",
"__builtin_setrnd");
243 Builder.defineMacro(
"__dcbtstt",
"__builtin_ppc_dcbtstt");
244 Builder.defineMacro(
"__dcbtt",
"__builtin_ppc_dcbtt");
245 Builder.defineMacro(
"__mftbu",
"__builtin_ppc_mftbu");
246 Builder.defineMacro(
"__mfmsr",
"__builtin_ppc_mfmsr");
247 Builder.defineMacro(
"__mtmsr",
"__builtin_ppc_mtmsr");
248 Builder.defineMacro(
"__mfspr",
"__builtin_ppc_mfspr");
249 Builder.defineMacro(
"__mtspr",
"__builtin_ppc_mtspr");
250 Builder.defineMacro(
"__fric",
"__builtin_ppc_fric");
251 Builder.defineMacro(
"__frim",
"__builtin_ppc_frim");
252 Builder.defineMacro(
"__frims",
"__builtin_ppc_frims");
253 Builder.defineMacro(
"__frin",
"__builtin_ppc_frin");
254 Builder.defineMacro(
"__frins",
"__builtin_ppc_frins");
255 Builder.defineMacro(
"__frip",
"__builtin_ppc_frip");
256 Builder.defineMacro(
"__frips",
"__builtin_ppc_frips");
257 Builder.defineMacro(
"__friz",
"__builtin_ppc_friz");
258 Builder.defineMacro(
"__frizs",
"__builtin_ppc_frizs");
259 Builder.defineMacro(
"__fsel",
"__builtin_ppc_fsel");
260 Builder.defineMacro(
"__fsels",
"__builtin_ppc_fsels");
261 Builder.defineMacro(
"__frsqrte",
"__builtin_ppc_frsqrte");
262 Builder.defineMacro(
"__frsqrtes",
"__builtin_ppc_frsqrtes");
263 Builder.defineMacro(
"__fsqrt",
"__builtin_ppc_fsqrt");
264 Builder.defineMacro(
"__fsqrts",
"__builtin_ppc_fsqrts");
265 Builder.defineMacro(
"__addex",
"__builtin_ppc_addex");
266 Builder.defineMacro(
"__cmplxl",
"__builtin_complex");
267 Builder.defineMacro(
"__compare_exp_uo",
"__builtin_ppc_compare_exp_uo");
268 Builder.defineMacro(
"__compare_exp_lt",
"__builtin_ppc_compare_exp_lt");
269 Builder.defineMacro(
"__compare_exp_gt",
"__builtin_ppc_compare_exp_gt");
270 Builder.defineMacro(
"__compare_exp_eq",
"__builtin_ppc_compare_exp_eq");
271 Builder.defineMacro(
"__test_data_class",
"__builtin_ppc_test_data_class");
272 Builder.defineMacro(
"__swdiv",
"__builtin_ppc_swdiv");
273 Builder.defineMacro(
"__swdivs",
"__builtin_ppc_swdivs");
274 Builder.defineMacro(
"__fnabs",
"__builtin_ppc_fnabs");
275 Builder.defineMacro(
"__fnabss",
"__builtin_ppc_fnabss");
276 Builder.defineMacro(
"__builtin_maxfe",
"__builtin_ppc_maxfe");
277 Builder.defineMacro(
"__builtin_maxfl",
"__builtin_ppc_maxfl");
278 Builder.defineMacro(
"__builtin_maxfs",
"__builtin_ppc_maxfs");
279 Builder.defineMacro(
"__builtin_minfe",
"__builtin_ppc_minfe");
280 Builder.defineMacro(
"__builtin_minfl",
"__builtin_ppc_minfl");
281 Builder.defineMacro(
"__builtin_minfs",
"__builtin_ppc_minfs");
282 Builder.defineMacro(
"__builtin_mffs",
"__builtin_ppc_mffs");
283 Builder.defineMacro(
"__builtin_mffsl",
"__builtin_ppc_mffsl");
284 Builder.defineMacro(
"__builtin_mtfsf",
"__builtin_ppc_mtfsf");
285 Builder.defineMacro(
"__builtin_set_fpscr_rn",
"__builtin_ppc_set_fpscr_rn");
299 Builder.defineMacro(
"__ppc__");
300 Builder.defineMacro(
"__PPC__");
301 Builder.defineMacro(
"_ARCH_PPC");
302 Builder.defineMacro(
"__powerpc__");
303 Builder.defineMacro(
"__POWERPC__");
305 Builder.defineMacro(
"_ARCH_PPC64");
306 Builder.defineMacro(
"__powerpc64__");
307 Builder.defineMacro(
"__PPC64__");
310 Builder.defineMacro(
"_ARCH_PPC64");
313 Builder.defineMacro(
"__THW_PPC__");
315 Builder.defineMacro(
"__PPC");
316 Builder.defineMacro(
"__powerpc");
320 if (
getTriple().getArch() == llvm::Triple::ppc64le ||
321 getTriple().getArch() == llvm::Triple::ppcle) {
322 Builder.defineMacro(
"_LITTLE_ENDIAN");
326 Builder.defineMacro(
"_BIG_ENDIAN");
331 Builder.defineMacro(
"_CALL_ELF",
"1");
333 Builder.defineMacro(
"_CALL_ELF",
"2");
339 Builder.defineMacro(
"_CALL_LINUX",
"1");
343 Builder.defineMacro(
"__NATURAL_ALIGNMENT__");
345 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
349 Builder.defineMacro(
"__LONG_DOUBLE_128__");
350 Builder.defineMacro(
"__LONGDOUBLE128");
351 if (Opts.PPCIEEELongDouble)
352 Builder.defineMacro(
"__LONG_DOUBLE_IEEE128__");
354 Builder.defineMacro(
"__LONG_DOUBLE_IBM128__");
357 if (
getTriple().isOSAIX() && Opts.LongDoubleSize == 64) {
359 Builder.defineMacro(
"__LONGDOUBLE64");
364 Builder.defineMacro(
"__STRUCT_PARM_ALIGN__",
"16");
366 if (ArchDefs & ArchDefineName)
367 Builder.defineMacro(Twine(
"_ARCH_", StringRef(CPU).upper()));
368 if (ArchDefs & ArchDefinePpcgr)
369 Builder.defineMacro(
"_ARCH_PPCGR");
370 if (ArchDefs & ArchDefinePpcsq)
371 Builder.defineMacro(
"_ARCH_PPCSQ");
372 if (ArchDefs & ArchDefine440)
373 Builder.defineMacro(
"_ARCH_440");
374 if (ArchDefs & ArchDefine603)
375 Builder.defineMacro(
"_ARCH_603");
376 if (ArchDefs & ArchDefine604)
377 Builder.defineMacro(
"_ARCH_604");
378 if (ArchDefs & ArchDefinePwr4)
379 Builder.defineMacro(
"_ARCH_PWR4");
380 if (ArchDefs & ArchDefinePwr5)
381 Builder.defineMacro(
"_ARCH_PWR5");
382 if (ArchDefs & ArchDefinePwr5x)
383 Builder.defineMacro(
"_ARCH_PWR5X");
384 if (ArchDefs & ArchDefinePwr6)
385 Builder.defineMacro(
"_ARCH_PWR6");
386 if (ArchDefs & ArchDefinePwr6x)
387 Builder.defineMacro(
"_ARCH_PWR6X");
388 if (ArchDefs & ArchDefinePwr7)
389 Builder.defineMacro(
"_ARCH_PWR7");
390 if (ArchDefs & ArchDefinePwr8)
391 Builder.defineMacro(
"_ARCH_PWR8");
392 if (ArchDefs & ArchDefinePwr9)
393 Builder.defineMacro(
"_ARCH_PWR9");
394 if (ArchDefs & ArchDefinePwr10)
395 Builder.defineMacro(
"_ARCH_PWR10");
396 if (ArchDefs & ArchDefinePwr11)
397 Builder.defineMacro(
"_ARCH_PWR11");
398 if (ArchDefs & ArchDefineA2)
399 Builder.defineMacro(
"_ARCH_A2");
400 if (ArchDefs & ArchDefineE500)
401 Builder.defineMacro(
"__NO_LWSYNC__");
402 if (ArchDefs & ArchDefineFuture)
403 Builder.defineMacro(
"_ARCH_PWR_FUTURE");
406 Builder.defineMacro(
"__VEC__",
"10206");
407 Builder.defineMacro(
"__ALTIVEC__");
410 Builder.defineMacro(
"__SPE__");
411 if (HasSPE || FloatABI == SoftFloat)
412 Builder.defineMacro(
"__NO_FPRS__");
413 if (FloatABI == SoftFloat) {
414 Builder.defineMacro(
"_SOFT_FLOAT");
415 Builder.defineMacro(
"_SOFT_DOUBLE");
418 Builder.defineMacro(
"__RSQRTE__");
420 Builder.defineMacro(
"__RSQRTEF__");
423 Builder.defineMacro(
"__VSX__");
425 Builder.defineMacro(
"__POWER8_VECTOR__");
427 Builder.defineMacro(
"__CRYPTO__");
429 Builder.defineMacro(
"__HTM__");
431 Builder.defineMacro(
"__FLOAT128__");
433 Builder.defineMacro(
"__POWER9_VECTOR__");
435 Builder.defineMacro(
"__MMA__");
437 Builder.defineMacro(
"__ROP_PROTECT__");
439 Builder.defineMacro(
"__POWER10_VECTOR__");
440 if (HasPCRelativeMemops)
441 Builder.defineMacro(
"__PCREL__");
443 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
444 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
445 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
447 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
450 Builder.defineMacro(
"__HAVE_BSWAP__",
"1");
480 const std::vector<std::string> &FeaturesVec) {
481 auto FindVSXSubfeature = [&](StringRef Feature, StringRef SubOption,
483 if (llvm::is_contained(FeaturesVec, Feature)) {
484 Diags.
Report(diag::err_opt_not_valid_with_opt) << SubOption << Option;
493 if (llvm::is_contained(FeaturesVec,
"-hard-float")) {
494 Found |= FindVSXSubfeature(
"+vsx",
"-mvsx",
"-msoft-float");
495 Found |= FindVSXSubfeature(
"+altivec",
"-maltivec",
"-msoft-float");
497 FindVSXSubfeature(
"+power8-vector",
"-mpower8-vector",
"-msoft-float");
498 Found |= FindVSXSubfeature(
"+direct-move",
"-mdirect-move",
"-msoft-float");
499 Found |= FindVSXSubfeature(
"+float128",
"-mfloat128",
"-msoft-float");
501 FindVSXSubfeature(
"+power9-vector",
"-mpower9-vector",
"-msoft-float");
502 Found |= FindVSXSubfeature(
"+paired-vector-memops",
503 "-mpaired-vector-memops",
"-msoft-float");
504 Found |= FindVSXSubfeature(
"+mma",
"-mmma",
"-msoft-float");
505 Found |= FindVSXSubfeature(
"+crypto",
"-mcrypto",
"-msoft-float");
506 Found |= FindVSXSubfeature(
"+power10-vector",
"-mpower10-vector",
513 if (llvm::is_contained(FeaturesVec,
"+vsx") &&
514 llvm::is_contained(FeaturesVec,
"-altivec")) {
515 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mvsx"
521 if (!llvm::is_contained(FeaturesVec,
"-vsx"))
524 Found = FindVSXSubfeature(
"+power8-vector",
"-mpower8-vector",
"-mno-vsx");
525 Found |= FindVSXSubfeature(
"+direct-move",
"-mdirect-move",
"-mno-vsx");
526 Found |= FindVSXSubfeature(
"+float128",
"-mfloat128",
"-mno-vsx");
527 Found |= FindVSXSubfeature(
"+power9-vector",
"-mpower9-vector",
"-mno-vsx");
528 Found |= FindVSXSubfeature(
"+paired-vector-memops",
"-mpaired-vector-memops",
530 Found |= FindVSXSubfeature(
"+mma",
"-mmma",
"-mno-vsx");
531 Found |= FindVSXSubfeature(
"+power10-vector",
"-mpower10-vector",
"-mno-vsx");
539 const std::vector<std::string> &FeaturesVec)
const {
540 Features[
"altivec"] = llvm::StringSwitch<bool>(CPU)
552 .Case(
"ppc64le",
true)
555 Features[
"power9-vector"] = (CPU ==
"pwr9");
556 Features[
"crypto"] = llvm::StringSwitch<bool>(CPU)
557 .Case(
"ppc64le",
true)
561 Features[
"power8-vector"] = llvm::StringSwitch<bool>(CPU)
562 .Case(
"ppc64le",
true)
566 Features[
"bpermd"] = llvm::StringSwitch<bool>(CPU)
567 .Case(
"ppc64le",
true)
572 Features[
"extdiv"] = llvm::StringSwitch<bool>(CPU)
573 .Case(
"ppc64le",
true)
578 Features[
"direct-move"] = llvm::StringSwitch<bool>(CPU)
579 .Case(
"ppc64le",
true)
583 Features[
"crbits"] = llvm::StringSwitch<bool>(CPU)
584 .Case(
"ppc64le",
true)
588 Features[
"vsx"] = llvm::StringSwitch<bool>(CPU)
589 .Case(
"ppc64le",
true)
594 Features[
"htm"] = llvm::StringSwitch<bool>(CPU)
595 .Case(
"ppc64le",
true)
601 Features[
"rop-protect"] =
false;
603 Features[
"privileged"] =
false;
607 Features[
"aix-small-local-exec-tls"] =
false;
608 Features[
"aix-small-local-dynamic-tls"] =
false;
611 Features[
"aix-shared-lib-tls-model-opt"] =
false;
613 Features[
"spe"] = llvm::StringSwitch<bool>(CPU)
618 Features[
"isa-v206-instructions"] = llvm::StringSwitch<bool>(CPU)
619 .Case(
"ppc64le",
true)
626 Features[
"isa-v207-instructions"] = llvm::StringSwitch<bool>(CPU)
627 .Case(
"ppc64le",
true)
632 Features[
"isa-v30-instructions"] =
633 llvm::StringSwitch<bool>(CPU).Case(
"pwr9",
true).Default(
false);
635 Features[
"quadword-atomics"] =
636 getTriple().isArch64Bit() && llvm::StringSwitch<bool>(CPU)
643 if (CPU ==
"pwr10" || CPU ==
"power10") {
650 if (CPU ==
"pwr11" || CPU ==
"power11") {
657 if (CPU ==
"future") {
665 if (!(ArchDefs & ArchDefinePwr7) && (ArchDefs & ArchDefinePpcgr) &&
666 llvm::is_contained(FeaturesVec,
"+float128")) {
668 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mfloat128" << CPU;
672 if (!(ArchDefs & ArchDefinePwr10)) {
673 if (llvm::is_contained(FeaturesVec,
"+mma")) {
675 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mmma" << CPU;
678 if (llvm::is_contained(FeaturesVec,
"+pcrel")) {
681 Diags.
Report(diag::err_opt_not_valid_without_opt)
683 <<
"-mcpu=pwr10 -mprefixed";
686 if (llvm::is_contained(FeaturesVec,
"+prefixed")) {
688 Diags.
Report(diag::err_opt_not_valid_without_opt) <<
"-mprefixed"
692 if (llvm::is_contained(FeaturesVec,
"+paired-vector-memops")) {
694 Diags.
Report(diag::err_opt_not_valid_without_opt)
695 <<
"-mpaired-vector-memops"
701 if (!(ArchDefs & ArchDefinePwr8) &&
702 llvm::is_contained(FeaturesVec,
"+rop-protect")) {
704 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mrop-protect" << CPU;
708 if (!(ArchDefs & ArchDefinePwr8) &&
709 llvm::is_contained(FeaturesVec,
"+privileged")) {
710 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mprivileged" << CPU;
718 llvm::StringMap<bool> &Features)
const {
719 Features[
"htm"] =
false;
720 Features[
"paired-vector-memops"] =
true;
721 Features[
"mma"] =
true;
722 Features[
"power10-vector"] =
true;
723 Features[
"pcrelative-memops"] =
true;
724 Features[
"prefix-instrs"] =
true;
725 Features[
"isa-v31-instructions"] =
true;
730 llvm::StringMap<bool> &Features)
const {}
734 llvm::StringMap<bool> &Features)
const {}
737 return llvm::StringSwitch<bool>(Feature)
738 .Case(
"powerpc",
true)
739 .Case(
"altivec", HasAltivec)
741 .Case(
"crbits", UseCRBits)
742 .Case(
"power8-vector", HasP8Vector)
743 .Case(
"crypto", HasP8Crypto)
744 .Case(
"direct-move", HasDirectMove)
746 .Case(
"bpermd", HasBPERMD)
747 .Case(
"extdiv", HasExtDiv)
749 .Case(
"power9-vector", HasP9Vector)
750 .Case(
"paired-vector-memops", PairedVectorMemops)
751 .Case(
"power10-vector", HasP10Vector)
752 .Case(
"pcrelative-memops", HasPCRelativeMemops)
753 .Case(
"prefix-instrs", HasPrefixInstrs)
756 .Case(
"rop-protect", HasROPProtect)
757 .Case(
"privileged", HasPrivileged)
758 .Case(
"aix-small-local-exec-tls", HasAIXSmallLocalExecTLS)
759 .Case(
"aix-small-local-dynamic-tls", HasAIXSmallLocalDynamicTLS)
760 .Case(
"isa-v206-instructions", IsISA2_06)
761 .Case(
"isa-v207-instructions", IsISA2_07)
762 .Case(
"isa-v30-instructions", IsISA3_0)
763 .Case(
"isa-v31-instructions", IsISA3_1)
764 .Case(
"quadword-atomics", HasQuadwordAtomics)
765 .Case(
"aix-shared-lib-tls-model-opt", HasAIXShLibTLSModelOpt)
766 .Case(
"longcall", UseLongCalls)
771 StringRef Name,
bool Enabled)
const {
774 Features[
"spe"] =
true;
777 bool FeatureHasVSX = llvm::StringSwitch<bool>(Name)
779 .Case(
"direct-move",
true)
780 .Case(
"power8-vector",
true)
781 .Case(
"power9-vector",
true)
782 .Case(
"paired-vector-memops",
true)
783 .Case(
"power10-vector",
true)
784 .Case(
"float128",
true)
788 Features[
"vsx"] = Features[
"altivec"] =
true;
789 if (Name ==
"power9-vector")
790 Features[
"power8-vector"] =
true;
791 else if (Name ==
"power10-vector")
792 Features[
"power8-vector"] = Features[
"power9-vector"] =
true;
794 Features[
"pcrelative-memops"] =
true;
795 else if (Name ==
"prefixed")
796 Features[
"prefix-instrs"] =
true;
798 Features[Name] =
true;
801 Features[
"efpu2"] =
false;
804 if ((Name ==
"altivec") || (Name ==
"vsx") || (Name ==
"hard-float")) {
806 Features[
"altivec"] = Features[
"crypto"] =
false;
807 Features[
"vsx"] = Features[
"direct-move"] = Features[
"power8-vector"] =
808 Features[
"float128"] = Features[
"power9-vector"] =
809 Features[
"paired-vector-memops"] = Features[
"mma"] =
810 Features[
"power10-vector"] =
false;
812 if (Name ==
"power8-vector")
813 Features[
"power9-vector"] = Features[
"paired-vector-memops"] =
814 Features[
"mma"] = Features[
"power10-vector"] =
false;
815 else if (Name ==
"power9-vector")
816 Features[
"paired-vector-memops"] = Features[
"mma"] =
817 Features[
"power10-vector"] =
false;
819 Features[
"pcrelative-memops"] =
false;
820 else if (Name ==
"prefixed")
821 Features[
"prefix-instrs"] =
false;
823 Features[Name] =
false;
829const char *
const PPCTargetInfo::GCCRegNames[] = {
830 "r0",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
"r8",
831 "r9",
"r10",
"r11",
"r12",
"r13",
"r14",
"r15",
"r16",
"r17",
832 "r18",
"r19",
"r20",
"r21",
"r22",
"r23",
"r24",
"r25",
"r26",
833 "r27",
"r28",
"r29",
"r30",
"r31",
"f0",
"f1",
"f2",
"f3",
834 "f4",
"f5",
"f6",
"f7",
"f8",
"f9",
"f10",
"f11",
"f12",
835 "f13",
"f14",
"f15",
"f16",
"f17",
"f18",
"f19",
"f20",
"f21",
836 "f22",
"f23",
"f24",
"f25",
"f26",
"f27",
"f28",
"f29",
"f30",
837 "f31",
"mq",
"lr",
"ctr",
"ap",
"cr0",
"cr1",
"cr2",
"cr3",
838 "cr4",
"cr5",
"cr6",
"cr7",
"xer",
"v0",
"v1",
"v2",
"v3",
839 "v4",
"v5",
"v6",
"v7",
"v8",
"v9",
"v10",
"v11",
"v12",
840 "v13",
"v14",
"v15",
"v16",
"v17",
"v18",
"v19",
"v20",
"v21",
841 "v22",
"v23",
"v24",
"v25",
"v26",
"v27",
"v28",
"v29",
"v30",
842 "v31",
"vrsave",
"vscr",
"spe_acc",
"spefscr",
"sfp"
852 {{
"0"},
"r0"}, {{
"1",
"sp"},
"r1"}, {{
"2"},
"r2"},
853 {{
"3"},
"r3"}, {{
"4"},
"r4"}, {{
"5"},
"r5"},
854 {{
"6"},
"r6"}, {{
"7"},
"r7"}, {{
"8"},
"r8"},
855 {{
"9"},
"r9"}, {{
"10"},
"r10"}, {{
"11"},
"r11"},
856 {{
"12"},
"r12"}, {{
"13"},
"r13"}, {{
"14"},
"r14"},
857 {{
"15"},
"r15"}, {{
"16"},
"r16"}, {{
"17"},
"r17"},
858 {{
"18"},
"r18"}, {{
"19"},
"r19"}, {{
"20"},
"r20"},
859 {{
"21"},
"r21"}, {{
"22"},
"r22"}, {{
"23"},
"r23"},
860 {{
"24"},
"r24"}, {{
"25"},
"r25"}, {{
"26"},
"r26"},
861 {{
"27"},
"r27"}, {{
"28"},
"r28"}, {{
"29"},
"r29"},
862 {{
"30"},
"r30"}, {{
"31"},
"r31"}, {{
"fr0"},
"f0"},
863 {{
"fr1"},
"f1"}, {{
"fr2"},
"f2"}, {{
"fr3"},
"f3"},
864 {{
"fr4"},
"f4"}, {{
"fr5"},
"f5"}, {{
"fr6"},
"f6"},
865 {{
"fr7"},
"f7"}, {{
"fr8"},
"f8"}, {{
"fr9"},
"f9"},
866 {{
"fr10"},
"f10"}, {{
"fr11"},
"f11"}, {{
"fr12"},
"f12"},
867 {{
"fr13"},
"f13"}, {{
"fr14"},
"f14"}, {{
"fr15"},
"f15"},
868 {{
"fr16"},
"f16"}, {{
"fr17"},
"f17"}, {{
"fr18"},
"f18"},
869 {{
"fr19"},
"f19"}, {{
"fr20"},
"f20"}, {{
"fr21"},
"f21"},
870 {{
"fr22"},
"f22"}, {{
"fr23"},
"f23"}, {{
"fr24"},
"f24"},
871 {{
"fr25"},
"f25"}, {{
"fr26"},
"f26"}, {{
"fr27"},
"f27"},
872 {{
"fr28"},
"f28"}, {{
"fr29"},
"f29"}, {{
"fr30"},
"f30"},
873 {{
"fr31"},
"f31"}, {{
"cc"},
"cr0"},
886 {{
"vs0"}, 32}, {{
"vs1"}, 33}, {{
"vs2"}, 34}, {{
"vs3"}, 35},
887 {{
"vs4"}, 36}, {{
"vs5"}, 37}, {{
"vs6"}, 38}, {{
"vs7"}, 39},
888 {{
"vs8"}, 40}, {{
"vs9"}, 41}, {{
"vs10"}, 42}, {{
"vs11"}, 43},
889 {{
"vs12"}, 44}, {{
"vs13"}, 45}, {{
"vs14"}, 46}, {{
"vs15"}, 47},
890 {{
"vs16"}, 48}, {{
"vs17"}, 49}, {{
"vs18"}, 50}, {{
"vs19"}, 51},
891 {{
"vs20"}, 52}, {{
"vs21"}, 53}, {{
"vs22"}, 54}, {{
"vs23"}, 55},
892 {{
"vs24"}, 56}, {{
"vs25"}, 57}, {{
"vs26"}, 58}, {{
"vs27"}, 59},
893 {{
"vs28"}, 60}, {{
"vs29"}, 61}, {{
"vs30"}, 62}, {{
"vs31"}, 63},
894 {{
"vs32"}, 77}, {{
"vs33"}, 78}, {{
"vs34"}, 79}, {{
"vs35"}, 80},
895 {{
"vs36"}, 81}, {{
"vs37"}, 82}, {{
"vs38"}, 83}, {{
"vs39"}, 84},
896 {{
"vs40"}, 85}, {{
"vs41"}, 86}, {{
"vs42"}, 87}, {{
"vs43"}, 88},
897 {{
"vs44"}, 89}, {{
"vs45"}, 90}, {{
"vs46"}, 91}, {{
"vs47"}, 92},
898 {{
"vs48"}, 93}, {{
"vs49"}, 94}, {{
"vs50"}, 95}, {{
"vs51"}, 96},
899 {{
"vs52"}, 97}, {{
"vs53"}, 98}, {{
"vs54"}, 99}, {{
"vs55"}, 100},
900 {{
"vs56"}, 101}, {{
"vs57"}, 102}, {{
"vs58"}, 103}, {{
"vs59"}, 104},
901 {{
"vs60"}, 105}, {{
"vs61"}, 106}, {{
"vs62"}, 107}, {{
"vs63"}, 108},
909 return llvm::PPC::isValidCPU(Name);
913 llvm::PPC::fillValidCPUList(Values);
922 ? &llvm::APFloat::IEEEquad()
923 : &llvm::APFloat::PPCDoubleDouble();
925 if (
getTriple().isOSAIX() && Opts.EnableAIXQuadwordAtomicsABI &&
937 if (Triple.isOSAIX()) {
938#define PPC_AIX_FEATURE(NAME, DESC, SUPPORT_METHOD, INDEX, MASK, COMP_OP, \
941 return llvm::StringSwitch<bool>(FeatureStr)
942#include "llvm/TargetParser/PPCTargetParser.def"
946 assert(Triple.isOSLinux() &&
947 "__builtin_cpu_supports() is only supported for AIX and Linux.");
949#define PPC_LNX_FEATURE(NAME, DESC, ENUMNAME, ENUMVAL, HWCAPN) .Case(NAME, true)
950 return llvm::StringSwitch<bool>(FeatureStr)
951#include "llvm/TargetParser/PPCTargetParser.def"
957 assert((Triple.isOSAIX() || Triple.isOSLinux()) &&
958 "__builtin_cpu_is() is only supported for AIX and Linux.");
960#define PPC_CPU(NAME, Linux_SUPPORT_METHOD, LinuxID, AIX_SUPPORT_METHOD, \
962 .Case(NAME, {Linux_SUPPORT_METHOD, AIX_SUPPORT_METHOD})
964 std::pair<unsigned, unsigned> SuppportMethod =
965 llvm::StringSwitch<std::pair<unsigned, unsigned>>(CPUName)
966#include
"llvm/TargetParser/PPCTargetParser.def"
967 .
Default({BUILTIN_PPC_UNSUPPORTED, BUILTIN_PPC_UNSUPPORTED});
968 return Triple.isOSLinux()
969 ? (SuppportMethod.first != BUILTIN_PPC_UNSUPPORTED)
970 : (SuppportMethod.second != BUILTIN_PPC_UNSUPPORTED);
Defines the Diagnostic-related interfaces.
const TargetInfo::AddlRegName GCCAddlRegNames[]
static constexpr Builtin::Info BuiltinInfo[]
static void defineXLCompatMacros(MacroBuilder &Builder)
static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags, const std::vector< std::string > &FeaturesVec)
static constexpr Builtin::Info BuiltinInfo[]
Defines the clang::MacroBuilder utility class.
Enumerates target-specific builtins in their own namespaces within namespace clang.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual void adjust(DiagnosticsEngine &Diags, LangOptions &Opts)
Set forced language options.
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
unsigned char MaxAtomicInlineWidth
void addFutureSpecificFeatures(llvm::StringMap< bool > &Features) const
ArrayRef< const char * > getGCCRegNames() const override
void addP11SpecificFeatures(llvm::StringMap< bool > &Features) const
bool validateCpuIs(StringRef Name) const override
bool isValidCPUName(StringRef Name) const override
Determine whether this TargetInfo supports the given CPU name.
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
handleTargetFeatures - Perform initialization based on the user configured set of features.
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
ArrayRef< Builtin::Info > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override
Set forced language options.
void addP10SpecificFeatures(llvm::StringMap< bool > &Features) const
void setFeatureEnabled(llvm::StringMap< bool > &Features, StringRef Name, bool Enabled) const override
Enable or disable a specific target feature; the feature name must be valid.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific #defines that are not tied to ...
ArrayRef< TargetInfo::AddlRegName > getGCCAddlRegNames() const override
bool validateCpuSupports(StringRef Feature) const override
bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeaturesVec) const override
Initialize the map with the default set of target features for the CPU this should include all legal ...
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
The JSON file list parser is used to communicate input to InstallAPI.
unsigned char PointerWidth
const llvm::fltSemantics * LongDoubleFormat
unsigned char LongDoubleAlign
unsigned char LongDoubleWidth