PPC.cpp 37 KB

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