clang 20.0.0git
PPC.cpp
Go to the documentation of this file.
1//===--- PPC.cpp - Implement PPC target feature support -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements PPC TargetInfo objects.
10//
11//===----------------------------------------------------------------------===//
12
13#include "PPC.h"
17#include "llvm/TargetParser/PPCTargetParser.h"
18
19using namespace clang;
20using namespace clang::targets;
21
22static constexpr Builtin::Info BuiltinInfo[] = {
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"
30};
31
32/// handleTargetFeatures - Perform initialization based on the user
33/// configured set of features.
34bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
35 DiagnosticsEngine &Diags) {
36 FloatABI = HardFloat;
37 for (const auto &Feature : Features) {
38 if (Feature == "+altivec") {
39 HasAltivec = true;
40 } else if (Feature == "+vsx") {
41 HasVSX = true;
42 } else if (Feature == "+crbits") {
43 UseCRBits = true;
44 } else if (Feature == "+bpermd") {
45 HasBPERMD = true;
46 } else if (Feature == "+extdiv") {
47 HasExtDiv = true;
48 } else if (Feature == "+power8-vector") {
49 HasP8Vector = true;
50 } else if (Feature == "+crypto") {
51 HasP8Crypto = true;
52 } else if (Feature == "+direct-move") {
53 HasDirectMove = true;
54 } else if (Feature == "+htm") {
55 HasHTM = true;
56 } else if (Feature == "+float128") {
57 HasFloat128 = !getTriple().isOSAIX();
58 } else if (Feature == "+power9-vector") {
59 HasP9Vector = true;
60 } else if (Feature == "+power10-vector") {
61 HasP10Vector = true;
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") {
67 HasStrictFP = false;
68 HasSPE = true;
70 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
71 } else if (Feature == "-hard-float") {
72 FloatABI = SoftFloat;
73 } else if (Feature == "+paired-vector-memops") {
74 PairedVectorMemops = true;
75 } else if (Feature == "+mma") {
76 HasMMA = true;
77 } else if (Feature == "+rop-protect") {
78 HasROPProtect = true;
79 } else if (Feature == "+privileged") {
80 HasPrivileged = true;
81 } else if (Feature == "+aix-small-local-exec-tls") {
82 HasAIXSmallLocalExecTLS = true;
83 } else if (Feature == "+aix-small-local-dynamic-tls") {
84 HasAIXSmallLocalDynamicTLS = true;
85 } else if (Feature == "+isa-v206-instructions") {
86 IsISA2_06 = true;
87 } else if (Feature == "+isa-v207-instructions") {
88 IsISA2_07 = true;
89 } else if (Feature == "+isa-v30-instructions") {
90 IsISA3_0 = true;
91 } else if (Feature == "+isa-v31-instructions") {
92 IsISA3_1 = true;
93 } else if (Feature == "+quadword-atomics") {
94 HasQuadwordAtomics = true;
95 } else if (Feature == "+aix-shared-lib-tls-model-opt") {
96 HasAIXShLibTLSModelOpt = true;
97 } else if (Feature == "+longcall") {
98 UseLongCalls = true;
99 }
100 // TODO: Finish this list and add an assert that we've handled them
101 // all.
102 }
103
104 return true;
105}
106
107static void defineXLCompatMacros(MacroBuilder &Builder) {
108 Builder.defineMacro("__popcntb", "__builtin_ppc_popcntb");
109 Builder.defineMacro("__poppar4", "__builtin_ppc_poppar4");
110 Builder.defineMacro("__poppar8", "__builtin_ppc_poppar8");
111 Builder.defineMacro("__eieio", "__builtin_ppc_eieio");
112 Builder.defineMacro("__iospace_eieio", "__builtin_ppc_iospace_eieio");
113 Builder.defineMacro("__isync", "__builtin_ppc_isync");
114 Builder.defineMacro("__lwsync", "__builtin_ppc_lwsync");
115 Builder.defineMacro("__iospace_lwsync", "__builtin_ppc_iospace_lwsync");
116 Builder.defineMacro("__sync", "__builtin_ppc_sync");
117 Builder.defineMacro("__iospace_sync", "__builtin_ppc_iospace_sync");
118 Builder.defineMacro("__dcbfl", "__builtin_ppc_dcbfl");
119 Builder.defineMacro("__dcbflp", "__builtin_ppc_dcbflp");
120 Builder.defineMacro("__dcbst", "__builtin_ppc_dcbst");
121 Builder.defineMacro("__dcbt", "__builtin_ppc_dcbt");
122 Builder.defineMacro("__dcbtst", "__builtin_ppc_dcbtst");
123 Builder.defineMacro("__dcbz", "__builtin_ppc_dcbz");
124 Builder.defineMacro("__icbt", "__builtin_ppc_icbt");
125 Builder.defineMacro("__compare_and_swap", "__builtin_ppc_compare_and_swap");
126 Builder.defineMacro("__compare_and_swaplp",
127 "__builtin_ppc_compare_and_swaplp");
128 Builder.defineMacro("__fetch_and_add", "__builtin_ppc_fetch_and_add");
129 Builder.defineMacro("__fetch_and_addlp", "__builtin_ppc_fetch_and_addlp");
130 Builder.defineMacro("__fetch_and_and", "__builtin_ppc_fetch_and_and");
131 Builder.defineMacro("__fetch_and_andlp", "__builtin_ppc_fetch_and_andlp");
132 Builder.defineMacro("__fetch_and_or", "__builtin_ppc_fetch_and_or");
133 Builder.defineMacro("__fetch_and_orlp", "__builtin_ppc_fetch_and_orlp");
134 Builder.defineMacro("__fetch_and_swap", "__builtin_ppc_fetch_and_swap");
135 Builder.defineMacro("__fetch_and_swaplp", "__builtin_ppc_fetch_and_swaplp");
136 Builder.defineMacro("__ldarx", "__builtin_ppc_ldarx");
137 Builder.defineMacro("__lwarx", "__builtin_ppc_lwarx");
138 Builder.defineMacro("__lharx", "__builtin_ppc_lharx");
139 Builder.defineMacro("__lbarx", "__builtin_ppc_lbarx");
140 Builder.defineMacro("__stfiw", "__builtin_ppc_stfiw");
141 Builder.defineMacro("__stdcx", "__builtin_ppc_stdcx");
142 Builder.defineMacro("__stwcx", "__builtin_ppc_stwcx");
143 Builder.defineMacro("__sthcx", "__builtin_ppc_sthcx");
144 Builder.defineMacro("__stbcx", "__builtin_ppc_stbcx");
145 Builder.defineMacro("__tdw", "__builtin_ppc_tdw");
146 Builder.defineMacro("__tw", "__builtin_ppc_tw");
147 Builder.defineMacro("__trap", "__builtin_ppc_trap");
148 Builder.defineMacro("__trapd", "__builtin_ppc_trapd");
149 Builder.defineMacro("__fcfid", "__builtin_ppc_fcfid");
150 Builder.defineMacro("__fcfud", "__builtin_ppc_fcfud");
151 Builder.defineMacro("__fctid", "__builtin_ppc_fctid");
152 Builder.defineMacro("__fctidz", "__builtin_ppc_fctidz");
153 Builder.defineMacro("__fctiw", "__builtin_ppc_fctiw");
154 Builder.defineMacro("__fctiwz", "__builtin_ppc_fctiwz");
155 Builder.defineMacro("__fctudz", "__builtin_ppc_fctudz");
156 Builder.defineMacro("__fctuwz", "__builtin_ppc_fctuwz");
157 Builder.defineMacro("__cmpeqb", "__builtin_ppc_cmpeqb");
158 Builder.defineMacro("__cmprb", "__builtin_ppc_cmprb");
159 Builder.defineMacro("__setb", "__builtin_ppc_setb");
160 Builder.defineMacro("__cmpb", "__builtin_ppc_cmpb");
161 Builder.defineMacro("__mulhd", "__builtin_ppc_mulhd");
162 Builder.defineMacro("__mulhdu", "__builtin_ppc_mulhdu");
163 Builder.defineMacro("__mulhw", "__builtin_ppc_mulhw");
164 Builder.defineMacro("__mulhwu", "__builtin_ppc_mulhwu");
165 Builder.defineMacro("__maddhd", "__builtin_ppc_maddhd");
166 Builder.defineMacro("__maddhdu", "__builtin_ppc_maddhdu");
167 Builder.defineMacro("__maddld", "__builtin_ppc_maddld");
168 Builder.defineMacro("__rlwnm", "__builtin_ppc_rlwnm");
169 Builder.defineMacro("__rlwimi", "__builtin_ppc_rlwimi");
170 Builder.defineMacro("__rldimi", "__builtin_ppc_rldimi");
171 Builder.defineMacro("__load2r", "__builtin_ppc_load2r");
172 Builder.defineMacro("__load4r", "__builtin_ppc_load4r");
173 Builder.defineMacro("__load8r", "__builtin_ppc_load8r");
174 Builder.defineMacro("__store2r", "__builtin_ppc_store2r");
175 Builder.defineMacro("__store4r", "__builtin_ppc_store4r");
176 Builder.defineMacro("__store8r", "__builtin_ppc_store8r");
177 Builder.defineMacro("__extract_exp", "__builtin_ppc_extract_exp");
178 Builder.defineMacro("__extract_sig", "__builtin_ppc_extract_sig");
179 Builder.defineMacro("__mtfsb0", "__builtin_ppc_mtfsb0");
180 Builder.defineMacro("__mtfsb1", "__builtin_ppc_mtfsb1");
181 Builder.defineMacro("__mtfsf", "__builtin_ppc_mtfsf");
182 Builder.defineMacro("__mtfsfi", "__builtin_ppc_mtfsfi");
183 Builder.defineMacro("__insert_exp", "__builtin_ppc_insert_exp");
184 Builder.defineMacro("__fmsub", "__builtin_ppc_fmsub");
185 Builder.defineMacro("__fmsubs", "__builtin_ppc_fmsubs");
186 Builder.defineMacro("__fnmadd", "__builtin_ppc_fnmadd");
187 Builder.defineMacro("__fnmadds", "__builtin_ppc_fnmadds");
188 Builder.defineMacro("__fnmsub", "__builtin_ppc_fnmsub");
189 Builder.defineMacro("__fnmsubs", "__builtin_ppc_fnmsubs");
190 Builder.defineMacro("__fre", "__builtin_ppc_fre");
191 Builder.defineMacro("__fres", "__builtin_ppc_fres");
192 Builder.defineMacro("__swdiv_nochk", "__builtin_ppc_swdiv_nochk");
193 Builder.defineMacro("__swdivs_nochk", "__builtin_ppc_swdivs_nochk");
194 Builder.defineMacro("__alloca", "__builtin_alloca");
195 Builder.defineMacro("__vcipher", "__builtin_altivec_crypto_vcipher");
196 Builder.defineMacro("__vcipherlast", "__builtin_altivec_crypto_vcipherlast");
197 Builder.defineMacro("__vncipher", "__builtin_altivec_crypto_vncipher");
198 Builder.defineMacro("__vncipherlast",
199 "__builtin_altivec_crypto_vncipherlast");
200 Builder.defineMacro("__vpermxor", "__builtin_altivec_crypto_vpermxor");
201 Builder.defineMacro("__vpmsumb", "__builtin_altivec_crypto_vpmsumb");
202 Builder.defineMacro("__vpmsumd", "__builtin_altivec_crypto_vpmsumd");
203 Builder.defineMacro("__vpmsumh", "__builtin_altivec_crypto_vpmsumh");
204 Builder.defineMacro("__vpmsumw", "__builtin_altivec_crypto_vpmsumw");
205 Builder.defineMacro("__divde", "__builtin_divde");
206 Builder.defineMacro("__divwe", "__builtin_divwe");
207 Builder.defineMacro("__divdeu", "__builtin_divdeu");
208 Builder.defineMacro("__divweu", "__builtin_divweu");
209 Builder.defineMacro("__alignx", "__builtin_ppc_alignx");
210 Builder.defineMacro("__bcopy", "bcopy");
211 Builder.defineMacro("__bpermd", "__builtin_bpermd");
212 Builder.defineMacro("__cntlz4", "__builtin_clz");
213 Builder.defineMacro("__cntlz8", "__builtin_clzll");
214 Builder.defineMacro("__cmplx", "__builtin_complex");
215 Builder.defineMacro("__cmplxf", "__builtin_complex");
216 Builder.defineMacro("__cnttz4", "__builtin_ctz");
217 Builder.defineMacro("__cnttz8", "__builtin_ctzll");
218 Builder.defineMacro("__darn", "__builtin_darn");
219 Builder.defineMacro("__darn_32", "__builtin_darn_32");
220 Builder.defineMacro("__darn_raw", "__builtin_darn_raw");
221 Builder.defineMacro("__dcbf", "__builtin_dcbf");
222 Builder.defineMacro("__fence", "__builtin_ppc_fence");
223 Builder.defineMacro("__fmadd", "__builtin_fma");
224 Builder.defineMacro("__fmadds", "__builtin_fmaf");
225 Builder.defineMacro("__abs", "__builtin_abs");
226 Builder.defineMacro("__labs", "__builtin_labs");
227 Builder.defineMacro("__llabs", "__builtin_llabs");
228 Builder.defineMacro("__popcnt4", "__builtin_popcount");
229 Builder.defineMacro("__popcnt8", "__builtin_popcountll");
230 Builder.defineMacro("__readflm", "__builtin_readflm");
231 Builder.defineMacro("__rotatel4", "__builtin_rotateleft32");
232 Builder.defineMacro("__rotatel8", "__builtin_rotateleft64");
233 Builder.defineMacro("__rdlam", "__builtin_ppc_rdlam");
234 Builder.defineMacro("__setflm", "__builtin_setflm");
235 Builder.defineMacro("__setrnd", "__builtin_setrnd");
236 Builder.defineMacro("__dcbtstt", "__builtin_ppc_dcbtstt");
237 Builder.defineMacro("__dcbtt", "__builtin_ppc_dcbtt");
238 Builder.defineMacro("__mftbu", "__builtin_ppc_mftbu");
239 Builder.defineMacro("__mfmsr", "__builtin_ppc_mfmsr");
240 Builder.defineMacro("__mtmsr", "__builtin_ppc_mtmsr");
241 Builder.defineMacro("__mfspr", "__builtin_ppc_mfspr");
242 Builder.defineMacro("__mtspr", "__builtin_ppc_mtspr");
243 Builder.defineMacro("__fric", "__builtin_ppc_fric");
244 Builder.defineMacro("__frim", "__builtin_ppc_frim");
245 Builder.defineMacro("__frims", "__builtin_ppc_frims");
246 Builder.defineMacro("__frin", "__builtin_ppc_frin");
247 Builder.defineMacro("__frins", "__builtin_ppc_frins");
248 Builder.defineMacro("__frip", "__builtin_ppc_frip");
249 Builder.defineMacro("__frips", "__builtin_ppc_frips");
250 Builder.defineMacro("__friz", "__builtin_ppc_friz");
251 Builder.defineMacro("__frizs", "__builtin_ppc_frizs");
252 Builder.defineMacro("__fsel", "__builtin_ppc_fsel");
253 Builder.defineMacro("__fsels", "__builtin_ppc_fsels");
254 Builder.defineMacro("__frsqrte", "__builtin_ppc_frsqrte");
255 Builder.defineMacro("__frsqrtes", "__builtin_ppc_frsqrtes");
256 Builder.defineMacro("__fsqrt", "__builtin_ppc_fsqrt");
257 Builder.defineMacro("__fsqrts", "__builtin_ppc_fsqrts");
258 Builder.defineMacro("__addex", "__builtin_ppc_addex");
259 Builder.defineMacro("__cmplxl", "__builtin_complex");
260 Builder.defineMacro("__compare_exp_uo", "__builtin_ppc_compare_exp_uo");
261 Builder.defineMacro("__compare_exp_lt", "__builtin_ppc_compare_exp_lt");
262 Builder.defineMacro("__compare_exp_gt", "__builtin_ppc_compare_exp_gt");
263 Builder.defineMacro("__compare_exp_eq", "__builtin_ppc_compare_exp_eq");
264 Builder.defineMacro("__test_data_class", "__builtin_ppc_test_data_class");
265 Builder.defineMacro("__swdiv", "__builtin_ppc_swdiv");
266 Builder.defineMacro("__swdivs", "__builtin_ppc_swdivs");
267 Builder.defineMacro("__fnabs", "__builtin_ppc_fnabs");
268 Builder.defineMacro("__fnabss", "__builtin_ppc_fnabss");
269 Builder.defineMacro("__builtin_maxfe", "__builtin_ppc_maxfe");
270 Builder.defineMacro("__builtin_maxfl", "__builtin_ppc_maxfl");
271 Builder.defineMacro("__builtin_maxfs", "__builtin_ppc_maxfs");
272 Builder.defineMacro("__builtin_minfe", "__builtin_ppc_minfe");
273 Builder.defineMacro("__builtin_minfl", "__builtin_ppc_minfl");
274 Builder.defineMacro("__builtin_minfs", "__builtin_ppc_minfs");
275 Builder.defineMacro("__builtin_mffs", "__builtin_ppc_mffs");
276 Builder.defineMacro("__builtin_mffsl", "__builtin_ppc_mffsl");
277 Builder.defineMacro("__builtin_mtfsf", "__builtin_ppc_mtfsf");
278 Builder.defineMacro("__builtin_set_fpscr_rn", "__builtin_ppc_set_fpscr_rn");
279}
280
281/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
282/// #defines that are not tied to a specific subtarget.
284 MacroBuilder &Builder) const {
285
286 // We define the XLC compatibility macros only on AIX and Linux since XLC
287 // was never available on any other platforms.
288 if (getTriple().isOSAIX() || getTriple().isOSLinux())
289 defineXLCompatMacros(Builder);
290
291 // Target identification.
292 Builder.defineMacro("__ppc__");
293 Builder.defineMacro("__PPC__");
294 Builder.defineMacro("_ARCH_PPC");
295 Builder.defineMacro("__powerpc__");
296 Builder.defineMacro("__POWERPC__");
297 if (PointerWidth == 64) {
298 Builder.defineMacro("_ARCH_PPC64");
299 Builder.defineMacro("__powerpc64__");
300 Builder.defineMacro("__PPC64__");
301 } else if (getTriple().isOSAIX()) {
302 // The XL compilers on AIX define _ARCH_PPC64 for both 32 and 64-bit modes.
303 Builder.defineMacro("_ARCH_PPC64");
304 }
305 if (getTriple().isOSAIX()) {
306 Builder.defineMacro("__THW_PPC__");
307 // Define __PPC and __powerpc for AIX XL C/C++ compatibility
308 Builder.defineMacro("__PPC");
309 Builder.defineMacro("__powerpc");
310 }
311
312 // Target properties.
313 if (getTriple().getArch() == llvm::Triple::ppc64le ||
314 getTriple().getArch() == llvm::Triple::ppcle) {
315 Builder.defineMacro("_LITTLE_ENDIAN");
316 } else {
317 if (!getTriple().isOSNetBSD() &&
318 !getTriple().isOSOpenBSD())
319 Builder.defineMacro("_BIG_ENDIAN");
320 }
321
322 // ABI options.
323 if (ABI == "elfv1")
324 Builder.defineMacro("_CALL_ELF", "1");
325 if (ABI == "elfv2")
326 Builder.defineMacro("_CALL_ELF", "2");
327
328 // This typically is only for a new enough linker (bfd >= 2.16.2 or gold), but
329 // our support post-dates this and it should work on all 64-bit ppc linux
330 // platforms. It is guaranteed to work on all elfv2 platforms.
331 if (getTriple().getOS() == llvm::Triple::Linux && PointerWidth == 64)
332 Builder.defineMacro("_CALL_LINUX", "1");
333
334 // Subtarget options.
335 if (!getTriple().isOSAIX()){
336 Builder.defineMacro("__NATURAL_ALIGNMENT__");
337 }
338 Builder.defineMacro("__REGISTER_PREFIX__", "");
339
340 // FIXME: Should be controlled by command line option.
341 if (LongDoubleWidth == 128) {
342 Builder.defineMacro("__LONG_DOUBLE_128__");
343 Builder.defineMacro("__LONGDOUBLE128");
344 if (Opts.PPCIEEELongDouble)
345 Builder.defineMacro("__LONG_DOUBLE_IEEE128__");
346 else
347 Builder.defineMacro("__LONG_DOUBLE_IBM128__");
348 }
349
350 if (getTriple().isOSAIX() && Opts.LongDoubleSize == 64) {
351 assert(LongDoubleWidth == 64);
352 Builder.defineMacro("__LONGDOUBLE64");
353 }
354
355 // Define this for elfv2 (64-bit only).
356 if (ABI == "elfv2")
357 Builder.defineMacro("__STRUCT_PARM_ALIGN__", "16");
358
359 if (ArchDefs & ArchDefineName)
360 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
361 if (ArchDefs & ArchDefinePpcgr)
362 Builder.defineMacro("_ARCH_PPCGR");
363 if (ArchDefs & ArchDefinePpcsq)
364 Builder.defineMacro("_ARCH_PPCSQ");
365 if (ArchDefs & ArchDefine440)
366 Builder.defineMacro("_ARCH_440");
367 if (ArchDefs & ArchDefine603)
368 Builder.defineMacro("_ARCH_603");
369 if (ArchDefs & ArchDefine604)
370 Builder.defineMacro("_ARCH_604");
371 if (ArchDefs & ArchDefinePwr4)
372 Builder.defineMacro("_ARCH_PWR4");
373 if (ArchDefs & ArchDefinePwr5)
374 Builder.defineMacro("_ARCH_PWR5");
375 if (ArchDefs & ArchDefinePwr5x)
376 Builder.defineMacro("_ARCH_PWR5X");
377 if (ArchDefs & ArchDefinePwr6)
378 Builder.defineMacro("_ARCH_PWR6");
379 if (ArchDefs & ArchDefinePwr6x)
380 Builder.defineMacro("_ARCH_PWR6X");
381 if (ArchDefs & ArchDefinePwr7)
382 Builder.defineMacro("_ARCH_PWR7");
383 if (ArchDefs & ArchDefinePwr8)
384 Builder.defineMacro("_ARCH_PWR8");
385 if (ArchDefs & ArchDefinePwr9)
386 Builder.defineMacro("_ARCH_PWR9");
387 if (ArchDefs & ArchDefinePwr10)
388 Builder.defineMacro("_ARCH_PWR10");
389 if (ArchDefs & ArchDefinePwr11)
390 Builder.defineMacro("_ARCH_PWR11");
391 if (ArchDefs & ArchDefineA2)
392 Builder.defineMacro("_ARCH_A2");
393 if (ArchDefs & ArchDefineE500)
394 Builder.defineMacro("__NO_LWSYNC__");
395 if (ArchDefs & ArchDefineFuture)
396 Builder.defineMacro("_ARCH_PWR_FUTURE");
397
398 if (HasAltivec) {
399 Builder.defineMacro("__VEC__", "10206");
400 Builder.defineMacro("__ALTIVEC__");
401 }
402 if (HasSPE) {
403 Builder.defineMacro("__SPE__");
404 Builder.defineMacro("__NO_FPRS__");
405 }
406 if (HasVSX)
407 Builder.defineMacro("__VSX__");
408 if (HasP8Vector)
409 Builder.defineMacro("__POWER8_VECTOR__");
410 if (HasP8Crypto)
411 Builder.defineMacro("__CRYPTO__");
412 if (HasHTM)
413 Builder.defineMacro("__HTM__");
414 if (HasFloat128)
415 Builder.defineMacro("__FLOAT128__");
416 if (HasP9Vector)
417 Builder.defineMacro("__POWER9_VECTOR__");
418 if (HasMMA)
419 Builder.defineMacro("__MMA__");
420 if (HasROPProtect)
421 Builder.defineMacro("__ROP_PROTECT__");
422 if (HasP10Vector)
423 Builder.defineMacro("__POWER10_VECTOR__");
424 if (HasPCRelativeMemops)
425 Builder.defineMacro("__PCREL__");
426
427 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
428 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
429 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
430 if (PointerWidth == 64)
431 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
432
433 // We have support for the bswap intrinsics so we can define this.
434 Builder.defineMacro("__HAVE_BSWAP__", "1");
435
436 // FIXME: The following are not yet generated here by Clang, but are
437 // generated by GCC:
438 //
439 // _SOFT_FLOAT_
440 // __RECIP_PRECISION__
441 // __APPLE_ALTIVEC__
442 // __RECIP__
443 // __RECIPF__
444 // __RSQRTE__
445 // __RSQRTEF__
446 // _SOFT_DOUBLE_
447 // __NO_LWSYNC__
448 // __CMODEL_MEDIUM__
449 // __CMODEL_LARGE__
450 // _CALL_SYSV
451 // _CALL_DARWIN
452}
453
454// Handle explicit options being passed to the compiler here:
455// - if we've explicitly turned off vsx and turned on any of:
456// - power8-vector
457// - direct-move
458// - float128
459// - power9-vector
460// - paired-vector-memops
461// - mma
462// - power10-vector
463// - if we've explicitly turned on vsx and turned off altivec.
464// - if we've explicitly turned off hard-float and turned on altivec.
465// then go ahead and error since the customer has expressed an incompatible
466// set of options.
468 const std::vector<std::string> &FeaturesVec) {
469 // Cannot allow soft-float with Altivec.
470 if (llvm::is_contained(FeaturesVec, "-hard-float") &&
471 llvm::is_contained(FeaturesVec, "+altivec")) {
472 Diags.Report(diag::err_opt_not_valid_with_opt) << "-msoft-float"
473 << "-maltivec";
474 return false;
475 }
476
477 // Cannot allow soft-float with VSX.
478 if (llvm::is_contained(FeaturesVec, "-hard-float") &&
479 llvm::is_contained(FeaturesVec, "+vsx")) {
480 Diags.Report(diag::err_opt_not_valid_with_opt) << "-msoft-float"
481 << "-mvsx";
482 return false;
483 }
484
485 // Cannot allow VSX with no Altivec.
486 if (llvm::is_contained(FeaturesVec, "+vsx") &&
487 llvm::is_contained(FeaturesVec, "-altivec")) {
488 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mvsx"
489 << "-mno-altivec";
490 return false;
491 }
492
493 // vsx was not explicitly turned off.
494 if (!llvm::is_contained(FeaturesVec, "-vsx"))
495 return true;
496
497 auto FindVSXSubfeature = [&](StringRef Feature, StringRef Option) {
498 if (llvm::is_contained(FeaturesVec, Feature)) {
499 Diags.Report(diag::err_opt_not_valid_with_opt) << Option << "-mno-vsx";
500 return true;
501 }
502 return false;
503 };
504
505 bool Found = FindVSXSubfeature("+power8-vector", "-mpower8-vector");
506 Found |= FindVSXSubfeature("+direct-move", "-mdirect-move");
507 Found |= FindVSXSubfeature("+float128", "-mfloat128");
508 Found |= FindVSXSubfeature("+power9-vector", "-mpower9-vector");
509 Found |= FindVSXSubfeature("+paired-vector-memops", "-mpaired-vector-memops");
510 Found |= FindVSXSubfeature("+mma", "-mmma");
511 Found |= FindVSXSubfeature("+power10-vector", "-mpower10-vector");
512
513 // Return false if any vsx subfeatures was found.
514 return !Found;
515}
516
518 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
519 const std::vector<std::string> &FeaturesVec) const {
520 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
521 .Case("7400", true)
522 .Case("g4", true)
523 .Case("7450", true)
524 .Case("g4+", true)
525 .Case("970", true)
526 .Case("g5", true)
527 .Case("pwr6", true)
528 .Case("pwr7", true)
529 .Case("pwr8", true)
530 .Case("pwr9", true)
531 .Case("ppc64", true)
532 .Case("ppc64le", true)
533 .Default(false);
534
535 Features["power9-vector"] = (CPU == "pwr9");
536 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
537 .Case("ppc64le", true)
538 .Case("pwr9", true)
539 .Case("pwr8", true)
540 .Default(false);
541 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
542 .Case("ppc64le", true)
543 .Case("pwr9", true)
544 .Case("pwr8", true)
545 .Default(false);
546 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
547 .Case("ppc64le", true)
548 .Case("pwr9", true)
549 .Case("pwr8", true)
550 .Case("pwr7", true)
551 .Default(false);
552 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
553 .Case("ppc64le", true)
554 .Case("pwr9", true)
555 .Case("pwr8", true)
556 .Case("pwr7", true)
557 .Default(false);
558 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
559 .Case("ppc64le", true)
560 .Case("pwr9", true)
561 .Case("pwr8", true)
562 .Default(false);
563 Features["crbits"] = llvm::StringSwitch<bool>(CPU)
564 .Case("ppc64le", true)
565 .Case("pwr9", true)
566 .Case("pwr8", true)
567 .Default(false);
568 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
569 .Case("ppc64le", true)
570 .Case("pwr9", true)
571 .Case("pwr8", true)
572 .Case("pwr7", true)
573 .Default(false);
574 Features["htm"] = llvm::StringSwitch<bool>(CPU)
575 .Case("ppc64le", true)
576 .Case("pwr9", true)
577 .Case("pwr8", true)
578 .Default(false);
579
580 // ROP Protect is off by default.
581 Features["rop-protect"] = false;
582 // Privileged instructions are off by default.
583 Features["privileged"] = false;
584
585 // The code generated by the -maix-small-local-[exec|dynamic]-tls option is
586 // turned off by default.
587 Features["aix-small-local-exec-tls"] = false;
588 Features["aix-small-local-dynamic-tls"] = false;
589
590 // Turn off TLS model opt by default.
591 Features["aix-shared-lib-tls-model-opt"] = false;
592
593 Features["spe"] = llvm::StringSwitch<bool>(CPU)
594 .Case("8548", true)
595 .Case("e500", true)
596 .Default(false);
597
598 Features["isa-v206-instructions"] = llvm::StringSwitch<bool>(CPU)
599 .Case("ppc64le", true)
600 .Case("pwr9", true)
601 .Case("pwr8", true)
602 .Case("pwr7", true)
603 .Case("a2", true)
604 .Default(false);
605
606 Features["isa-v207-instructions"] = llvm::StringSwitch<bool>(CPU)
607 .Case("ppc64le", true)
608 .Case("pwr9", true)
609 .Case("pwr8", true)
610 .Default(false);
611
612 Features["isa-v30-instructions"] =
613 llvm::StringSwitch<bool>(CPU).Case("pwr9", true).Default(false);
614
615 Features["quadword-atomics"] =
616 getTriple().isArch64Bit() && llvm::StringSwitch<bool>(CPU)
617 .Case("pwr9", true)
618 .Case("pwr8", true)
619 .Default(false);
620
621 // Power10 includes all the same features as Power9 plus any features specific
622 // to the Power10 core.
623 if (CPU == "pwr10" || CPU == "power10") {
624 initFeatureMap(Features, Diags, "pwr9", FeaturesVec);
625 addP10SpecificFeatures(Features);
626 }
627
628 // Power11 includes all the same features as Power10 plus any features
629 // specific to the Power11 core.
630 if (CPU == "pwr11" || CPU == "power11") {
631 initFeatureMap(Features, Diags, "pwr10", FeaturesVec);
632 addP11SpecificFeatures(Features);
633 }
634
635 // Future CPU should include all of the features of Power 11 as well as any
636 // additional features (yet to be determined) specific to it.
637 if (CPU == "future") {
638 initFeatureMap(Features, Diags, "pwr11", FeaturesVec);
640 }
641
642 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
643 return false;
644
645 if (!(ArchDefs & ArchDefinePwr7) && (ArchDefs & ArchDefinePpcgr) &&
646 llvm::is_contained(FeaturesVec, "+float128")) {
647 // We have __float128 on PPC but not pre-VSX targets.
648 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128" << CPU;
649 return false;
650 }
651
652 if (!(ArchDefs & ArchDefinePwr10)) {
653 if (llvm::is_contained(FeaturesVec, "+mma")) {
654 // MMA operations are not available pre-Power10.
655 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mmma" << CPU;
656 return false;
657 }
658 if (llvm::is_contained(FeaturesVec, "+pcrel")) {
659 // PC-Relative instructions are not available pre-Power10,
660 // and these instructions also require prefixed instructions support.
661 Diags.Report(diag::err_opt_not_valid_without_opt)
662 << "-mpcrel"
663 << "-mcpu=pwr10 -mprefixed";
664 return false;
665 }
666 if (llvm::is_contained(FeaturesVec, "+prefixed")) {
667 // Prefixed instructions are not available pre-Power10.
668 Diags.Report(diag::err_opt_not_valid_without_opt) << "-mprefixed"
669 << "-mcpu=pwr10";
670 return false;
671 }
672 if (llvm::is_contained(FeaturesVec, "+paired-vector-memops")) {
673 // Paired vector memops are not available pre-Power10.
674 Diags.Report(diag::err_opt_not_valid_without_opt)
675 << "-mpaired-vector-memops"
676 << "-mcpu=pwr10";
677 return false;
678 }
679 }
680
681 if (!(ArchDefs & ArchDefinePwr8) &&
682 llvm::is_contained(FeaturesVec, "+rop-protect")) {
683 // We can turn on ROP Protect on Power 8 and above.
684 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mrop-protect" << CPU;
685 return false;
686 }
687
688 if (!(ArchDefs & ArchDefinePwr8) &&
689 llvm::is_contained(FeaturesVec, "+privileged")) {
690 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mprivileged" << CPU;
691 return false;
692 }
693
694 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
695}
696
697// Add any Power10 specific features.
699 llvm::StringMap<bool> &Features) const {
700 Features["htm"] = false; // HTM was removed for P10.
701 Features["paired-vector-memops"] = true;
702 Features["mma"] = true;
703 Features["power10-vector"] = true;
704 Features["pcrelative-memops"] = true;
705 Features["prefix-instrs"] = true;
706 Features["isa-v31-instructions"] = true;
707}
708
709// Add any Power11 specific features.
711 llvm::StringMap<bool> &Features) const {}
712
713// Add features specific to the "Future" CPU.
715 llvm::StringMap<bool> &Features) const {}
716
717bool PPCTargetInfo::hasFeature(StringRef Feature) const {
718 return llvm::StringSwitch<bool>(Feature)
719 .Case("powerpc", true)
720 .Case("altivec", HasAltivec)
721 .Case("vsx", HasVSX)
722 .Case("crbits", UseCRBits)
723 .Case("power8-vector", HasP8Vector)
724 .Case("crypto", HasP8Crypto)
725 .Case("direct-move", HasDirectMove)
726 .Case("htm", HasHTM)
727 .Case("bpermd", HasBPERMD)
728 .Case("extdiv", HasExtDiv)
729 .Case("float128", HasFloat128)
730 .Case("power9-vector", HasP9Vector)
731 .Case("paired-vector-memops", PairedVectorMemops)
732 .Case("power10-vector", HasP10Vector)
733 .Case("pcrelative-memops", HasPCRelativeMemops)
734 .Case("prefix-instrs", HasPrefixInstrs)
735 .Case("spe", HasSPE)
736 .Case("mma", HasMMA)
737 .Case("rop-protect", HasROPProtect)
738 .Case("privileged", HasPrivileged)
739 .Case("aix-small-local-exec-tls", HasAIXSmallLocalExecTLS)
740 .Case("aix-small-local-dynamic-tls", HasAIXSmallLocalDynamicTLS)
741 .Case("isa-v206-instructions", IsISA2_06)
742 .Case("isa-v207-instructions", IsISA2_07)
743 .Case("isa-v30-instructions", IsISA3_0)
744 .Case("isa-v31-instructions", IsISA3_1)
745 .Case("quadword-atomics", HasQuadwordAtomics)
746 .Case("aix-shared-lib-tls-model-opt", HasAIXShLibTLSModelOpt)
747 .Case("longcall", UseLongCalls)
748 .Default(false);
749}
750
751void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
752 StringRef Name, bool Enabled) const {
753 if (Enabled) {
754 if (Name == "efpu2")
755 Features["spe"] = true;
756 // If we're enabling any of the vsx based features then enable vsx and
757 // altivec. We'll diagnose any problems later.
758 bool FeatureHasVSX = llvm::StringSwitch<bool>(Name)
759 .Case("vsx", true)
760 .Case("direct-move", true)
761 .Case("power8-vector", true)
762 .Case("power9-vector", true)
763 .Case("paired-vector-memops", true)
764 .Case("power10-vector", true)
765 .Case("float128", true)
766 .Case("mma", true)
767 .Default(false);
768 if (FeatureHasVSX)
769 Features["vsx"] = Features["altivec"] = true;
770 if (Name == "power9-vector")
771 Features["power8-vector"] = true;
772 else if (Name == "power10-vector")
773 Features["power8-vector"] = Features["power9-vector"] = true;
774 if (Name == "pcrel")
775 Features["pcrelative-memops"] = true;
776 else if (Name == "prefixed")
777 Features["prefix-instrs"] = true;
778 else
779 Features[Name] = true;
780 } else {
781 if (Name == "spe")
782 Features["efpu2"] = false;
783 // If we're disabling altivec or vsx go ahead and disable all of the vsx
784 // features.
785 if ((Name == "altivec") || (Name == "vsx"))
786 Features["vsx"] = Features["direct-move"] = Features["power8-vector"] =
787 Features["float128"] = Features["power9-vector"] =
788 Features["paired-vector-memops"] = Features["mma"] =
789 Features["power10-vector"] = false;
790 if (Name == "power8-vector")
791 Features["power9-vector"] = Features["paired-vector-memops"] =
792 Features["mma"] = Features["power10-vector"] = false;
793 else if (Name == "power9-vector")
794 Features["paired-vector-memops"] = Features["mma"] =
795 Features["power10-vector"] = false;
796 if (Name == "pcrel")
797 Features["pcrelative-memops"] = false;
798 else if (Name == "prefixed")
799 Features["prefix-instrs"] = false;
800 else
801 Features[Name] = false;
802 }
803}
804
805// Make sure that registers are added in the correct array index which should be
806// the DWARF number for PPC registers.
807const char *const PPCTargetInfo::GCCRegNames[] = {
808 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8",
809 "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17",
810 "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26",
811 "r27", "r28", "r29", "r30", "r31", "f0", "f1", "f2", "f3",
812 "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12",
813 "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21",
814 "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30",
815 "f31", "mq", "lr", "ctr", "ap", "cr0", "cr1", "cr2", "cr3",
816 "cr4", "cr5", "cr6", "cr7", "xer", "v0", "v1", "v2", "v3",
817 "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12",
818 "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
819 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30",
820 "v31", "vrsave", "vscr", "spe_acc", "spefscr", "sfp"
821};
822
824 return llvm::ArrayRef(GCCRegNames);
825}
826
827const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
828 // While some of these aliases do map to different registers
829 // they still share the same register name.
830 {{"0"}, "r0"}, {{"1", "sp"}, "r1"}, {{"2"}, "r2"},
831 {{"3"}, "r3"}, {{"4"}, "r4"}, {{"5"}, "r5"},
832 {{"6"}, "r6"}, {{"7"}, "r7"}, {{"8"}, "r8"},
833 {{"9"}, "r9"}, {{"10"}, "r10"}, {{"11"}, "r11"},
834 {{"12"}, "r12"}, {{"13"}, "r13"}, {{"14"}, "r14"},
835 {{"15"}, "r15"}, {{"16"}, "r16"}, {{"17"}, "r17"},
836 {{"18"}, "r18"}, {{"19"}, "r19"}, {{"20"}, "r20"},
837 {{"21"}, "r21"}, {{"22"}, "r22"}, {{"23"}, "r23"},
838 {{"24"}, "r24"}, {{"25"}, "r25"}, {{"26"}, "r26"},
839 {{"27"}, "r27"}, {{"28"}, "r28"}, {{"29"}, "r29"},
840 {{"30"}, "r30"}, {{"31"}, "r31"}, {{"fr0"}, "f0"},
841 {{"fr1"}, "f1"}, {{"fr2"}, "f2"}, {{"fr3"}, "f3"},
842 {{"fr4"}, "f4"}, {{"fr5"}, "f5"}, {{"fr6"}, "f6"},
843 {{"fr7"}, "f7"}, {{"fr8"}, "f8"}, {{"fr9"}, "f9"},
844 {{"fr10"}, "f10"}, {{"fr11"}, "f11"}, {{"fr12"}, "f12"},
845 {{"fr13"}, "f13"}, {{"fr14"}, "f14"}, {{"fr15"}, "f15"},
846 {{"fr16"}, "f16"}, {{"fr17"}, "f17"}, {{"fr18"}, "f18"},
847 {{"fr19"}, "f19"}, {{"fr20"}, "f20"}, {{"fr21"}, "f21"},
848 {{"fr22"}, "f22"}, {{"fr23"}, "f23"}, {{"fr24"}, "f24"},
849 {{"fr25"}, "f25"}, {{"fr26"}, "f26"}, {{"fr27"}, "f27"},
850 {{"fr28"}, "f28"}, {{"fr29"}, "f29"}, {{"fr30"}, "f30"},
851 {{"fr31"}, "f31"}, {{"cc"}, "cr0"},
852};
853
855 return llvm::ArrayRef(GCCRegAliases);
856}
857
858// PPC ELFABIv2 DWARF Definition "Table 2.26. Mappings of Common Registers".
859// vs0 ~ vs31 is mapping to 32 - 63,
860// vs32 ~ vs63 is mapping to 77 - 108.
861// And this mapping applies to all OSes which run on powerpc.
863 // Table of additional register names to use in user input.
864 {{"vs0"}, 32}, {{"vs1"}, 33}, {{"vs2"}, 34}, {{"vs3"}, 35},
865 {{"vs4"}, 36}, {{"vs5"}, 37}, {{"vs6"}, 38}, {{"vs7"}, 39},
866 {{"vs8"}, 40}, {{"vs9"}, 41}, {{"vs10"}, 42}, {{"vs11"}, 43},
867 {{"vs12"}, 44}, {{"vs13"}, 45}, {{"vs14"}, 46}, {{"vs15"}, 47},
868 {{"vs16"}, 48}, {{"vs17"}, 49}, {{"vs18"}, 50}, {{"vs19"}, 51},
869 {{"vs20"}, 52}, {{"vs21"}, 53}, {{"vs22"}, 54}, {{"vs23"}, 55},
870 {{"vs24"}, 56}, {{"vs25"}, 57}, {{"vs26"}, 58}, {{"vs27"}, 59},
871 {{"vs28"}, 60}, {{"vs29"}, 61}, {{"vs30"}, 62}, {{"vs31"}, 63},
872 {{"vs32"}, 77}, {{"vs33"}, 78}, {{"vs34"}, 79}, {{"vs35"}, 80},
873 {{"vs36"}, 81}, {{"vs37"}, 82}, {{"vs38"}, 83}, {{"vs39"}, 84},
874 {{"vs40"}, 85}, {{"vs41"}, 86}, {{"vs42"}, 87}, {{"vs43"}, 88},
875 {{"vs44"}, 89}, {{"vs45"}, 90}, {{"vs46"}, 91}, {{"vs47"}, 92},
876 {{"vs48"}, 93}, {{"vs49"}, 94}, {{"vs50"}, 95}, {{"vs51"}, 96},
877 {{"vs52"}, 97}, {{"vs53"}, 98}, {{"vs54"}, 99}, {{"vs55"}, 100},
878 {{"vs56"}, 101}, {{"vs57"}, 102}, {{"vs58"}, 103}, {{"vs59"}, 104},
879 {{"vs60"}, 105}, {{"vs61"}, 106}, {{"vs62"}, 107}, {{"vs63"}, 108},
880};
881
884}
885
886bool PPCTargetInfo::isValidCPUName(StringRef Name) const {
887 return llvm::PPC::isValidCPU(Name);
888}
889
891 llvm::PPC::fillValidCPUList(Values);
892}
893
895 if (HasAltivec)
896 Opts.AltiVec = 1;
897 TargetInfo::adjust(Diags, Opts);
898 if (LongDoubleFormat != &llvm::APFloat::IEEEdouble())
899 LongDoubleFormat = Opts.PPCIEEELongDouble
900 ? &llvm::APFloat::IEEEquad()
901 : &llvm::APFloat::PPCDoubleDouble();
902 Opts.IEEE128 = 1;
903 if (getTriple().isOSAIX() && Opts.EnableAIXQuadwordAtomicsABI &&
904 HasQuadwordAtomics)
906}
907
911}
912
913bool PPCTargetInfo::validateCpuSupports(StringRef FeatureStr) const {
914 llvm::Triple Triple = getTriple();
915 if (Triple.isOSAIX()) {
916#define PPC_AIX_FEATURE(NAME, DESC, SUPPORT_METHOD, INDEX, MASK, COMP_OP, \
917 VALUE) \
918 .Case(NAME, true)
919 return llvm::StringSwitch<bool>(FeatureStr)
920#include "llvm/TargetParser/PPCTargetParser.def"
921 .Default(false);
922 }
923
924 assert(Triple.isOSLinux() &&
925 "__builtin_cpu_supports() is only supported for AIX and Linux.");
926
927#define PPC_LNX_FEATURE(NAME, DESC, ENUMNAME, ENUMVAL, HWCAPN) .Case(NAME, true)
928 return llvm::StringSwitch<bool>(FeatureStr)
929#include "llvm/TargetParser/PPCTargetParser.def"
930 .Default(false);
931}
932
933bool PPCTargetInfo::validateCpuIs(StringRef CPUName) const {
934 llvm::Triple Triple = getTriple();
935 assert((Triple.isOSAIX() || Triple.isOSLinux()) &&
936 "__builtin_cpu_is() is only supported for AIX and Linux.");
937
938#define PPC_CPU(NAME, Linux_SUPPORT_METHOD, LinuxID, AIX_SUPPORT_METHOD, \
939 AIXID) \
940 .Case(NAME, {Linux_SUPPORT_METHOD, AIX_SUPPORT_METHOD})
941
942 std::pair<unsigned, unsigned> SuppportMethod =
943 llvm::StringSwitch<std::pair<unsigned, unsigned>>(CPUName)
944#include "llvm/TargetParser/PPCTargetParser.def"
945 .Default({BUILTIN_PPC_UNSUPPORTED, BUILTIN_PPC_UNSUPPORTED});
946 return Triple.isOSLinux()
947 ? (SuppportMethod.first != BUILTIN_PPC_UNSUPPORTED)
948 : (SuppportMethod.second != BUILTIN_PPC_UNSUPPORTED);
949}
Defines the Diagnostic-related interfaces.
const TargetInfo::AddlRegName GCCAddlRegNames[]
Definition: PPC.cpp:862
static constexpr Builtin::Info BuiltinInfo[]
Definition: PPC.cpp:22
static void defineXLCompatMacros(MacroBuilder &Builder)
Definition: PPC.cpp:107
static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags, const std::vector< std::string > &FeaturesVec)
Definition: PPC.cpp:467
static constexpr Builtin::Info BuiltinInfo[]
Definition: Builtins.cpp:32
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.
Definition: Diagnostic.h:192
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Definition: Diagnostic.h:1547
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:461
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
Definition: TargetInfo.h:1256
virtual void adjust(DiagnosticsEngine &Diags, LangOptions &Opts)
Set forced language options.
Definition: TargetInfo.cpp:392
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 ...
Definition: TargetInfo.cpp:532
unsigned char MaxAtomicInlineWidth
Definition: TargetInfo.h:242
void addFutureSpecificFeatures(llvm::StringMap< bool > &Features) const
Definition: PPC.cpp:714
ArrayRef< const char * > getGCCRegNames() const override
Definition: PPC.cpp:823
void addP11SpecificFeatures(llvm::StringMap< bool > &Features) const
Definition: PPC.cpp:710
bool validateCpuIs(StringRef Name) const override
Definition: PPC.cpp:933
bool isValidCPUName(StringRef Name) const override
Determine whether this TargetInfo supports the given CPU name.
Definition: PPC.cpp:886
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
handleTargetFeatures - Perform initialization based on the user configured set of features.
Definition: PPC.cpp:34
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
Definition: PPC.cpp:717
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
Definition: PPC.cpp:854
ArrayRef< Builtin::Info > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
Definition: PPC.cpp:908
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override
Set forced language options.
Definition: PPC.cpp:894
void addP10SpecificFeatures(llvm::StringMap< bool > &Features) const
Definition: PPC.cpp:698
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.
Definition: PPC.cpp:751
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific #defines that are not tied to ...
Definition: PPC.cpp:283
ArrayRef< TargetInfo::AddlRegName > getGCCAddlRegNames() const override
Definition: PPC.cpp:882
bool validateCpuSupports(StringRef Feature) const override
Definition: PPC.cpp:913
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 ...
Definition: PPC.cpp:517
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
Definition: PPC.cpp:890
The JSON file list parser is used to communicate input to InstallAPI.
const llvm::fltSemantics * LongDoubleFormat
Definition: TargetInfo.h:139