1ebba5926SErich Keane //===--- PPC.cpp - Implement PPC target feature support -------------------===//
2ebba5926SErich Keane //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ebba5926SErich Keane //
7ebba5926SErich Keane //===----------------------------------------------------------------------===//
8ebba5926SErich Keane //
9ebba5926SErich Keane // This file implements PPC TargetInfo objects.
10ebba5926SErich Keane //
11ebba5926SErich Keane //===----------------------------------------------------------------------===//
12ebba5926SErich Keane 
13ebba5926SErich Keane #include "PPC.h"
14ebba5926SErich Keane #include "clang/Basic/Diagnostic.h"
15ebba5926SErich Keane #include "clang/Basic/MacroBuilder.h"
16ebba5926SErich Keane #include "clang/Basic/TargetBuiltins.h"
17ebba5926SErich Keane 
18ebba5926SErich Keane using namespace clang;
19ebba5926SErich Keane using namespace clang::targets;
20ebba5926SErich Keane 
21ebba5926SErich Keane const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
22ebba5926SErich Keane #define BUILTIN(ID, TYPE, ATTRS)                                               \
23ebba5926SErich Keane   {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
24ebba5926SErich Keane #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER)                                    \
25ebba5926SErich Keane   {#ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr},
26ebba5926SErich Keane #include "clang/Basic/BuiltinsPPC.def"
27ebba5926SErich Keane };
28ebba5926SErich Keane 
29ebba5926SErich Keane /// handleTargetFeatures - Perform initialization based on the user
30ebba5926SErich Keane /// configured set of features.
handleTargetFeatures(std::vector<std::string> & Features,DiagnosticsEngine & Diags)31ebba5926SErich Keane bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
32ebba5926SErich Keane                                          DiagnosticsEngine &Diags) {
334f839ac1SStrahinja Petrovic   FloatABI = HardFloat;
34ebba5926SErich Keane   for (const auto &Feature : Features) {
35ebba5926SErich Keane     if (Feature == "+altivec") {
36ebba5926SErich Keane       HasAltivec = true;
37ebba5926SErich Keane     } else if (Feature == "+vsx") {
38ebba5926SErich Keane       HasVSX = true;
392534dc12SAmy Kwan     } else if (Feature == "+crbits") {
402534dc12SAmy Kwan       UseCRBits = true;
41ebba5926SErich Keane     } else if (Feature == "+bpermd") {
42ebba5926SErich Keane       HasBPERMD = true;
43ebba5926SErich Keane     } else if (Feature == "+extdiv") {
44ebba5926SErich Keane       HasExtDiv = true;
45ebba5926SErich Keane     } else if (Feature == "+power8-vector") {
46ebba5926SErich Keane       HasP8Vector = true;
47ebba5926SErich Keane     } else if (Feature == "+crypto") {
48ebba5926SErich Keane       HasP8Crypto = true;
49ebba5926SErich Keane     } else if (Feature == "+direct-move") {
50ebba5926SErich Keane       HasDirectMove = true;
51ebba5926SErich Keane     } else if (Feature == "+htm") {
52ebba5926SErich Keane       HasHTM = true;
53ebba5926SErich Keane     } else if (Feature == "+float128") {
54ebba5926SErich Keane       HasFloat128 = true;
55ebba5926SErich Keane     } else if (Feature == "+power9-vector") {
56ebba5926SErich Keane       HasP9Vector = true;
5737e72f47SAhsan Saghir     } else if (Feature == "+power10-vector") {
5837e72f47SAhsan Saghir       HasP10Vector = true;
597cfded35SLei Huang     } else if (Feature == "+pcrelative-memops") {
607cfded35SLei Huang       HasPCRelativeMemops = true;
619469ff15SLei Huang     } else if (Feature == "+prefix-instrs") {
629469ff15SLei Huang       HasPrefixInstrs = true;
633f7b4ce9SNemanja Ivanovic     } else if (Feature == "+spe" || Feature == "+efpu2") {
645c18d113SQiu Chaofan       HasStrictFP = false;
653dac2142SJustin Hibbits       HasSPE = true;
663dac2142SJustin Hibbits       LongDoubleWidth = LongDoubleAlign = 64;
673dac2142SJustin Hibbits       LongDoubleFormat = &llvm::APFloat::IEEEdouble();
684f839ac1SStrahinja Petrovic     } else if (Feature == "-hard-float") {
694f839ac1SStrahinja Petrovic       FloatABI = SoftFloat;
707aaa8562SBaptiste Saleil     } else if (Feature == "+paired-vector-memops") {
717aaa8562SBaptiste Saleil       PairedVectorMemops = true;
72512e256cSBaptiste Saleil     } else if (Feature == "+mma") {
73512e256cSBaptiste Saleil       HasMMA = true;
740e4f5f3eSStefan Pintilie     } else if (Feature == "+rop-protect") {
750e4f5f3eSStefan Pintilie       HasROPProtect = true;
7691f4c111SStefan Pintilie     } else if (Feature == "+privileged") {
7791f4c111SStefan Pintilie       HasPrivileged = true;
78fb4e44c4SStefan Pintilie     } else if (Feature == "+isa-v206-instructions") {
79fb4e44c4SStefan Pintilie       IsISA2_06 = true;
80781929b4SVictor Huang     } else if (Feature == "+isa-v207-instructions") {
81781929b4SVictor Huang       IsISA2_07 = true;
82781929b4SVictor Huang     } else if (Feature == "+isa-v30-instructions") {
83781929b4SVictor Huang       IsISA3_0 = true;
84781929b4SVictor Huang     } else if (Feature == "+isa-v31-instructions") {
85781929b4SVictor Huang       IsISA3_1 = true;
86549e118eSKai Luo     } else if (Feature == "+quadword-atomics") {
87549e118eSKai Luo       HasQuadwordAtomics = true;
88ebba5926SErich Keane     }
89ebba5926SErich Keane     // TODO: Finish this list and add an assert that we've handled them
90ebba5926SErich Keane     // all.
91ebba5926SErich Keane   }
92ebba5926SErich Keane 
93ebba5926SErich Keane   return true;
94ebba5926SErich Keane }
95ebba5926SErich Keane 
defineXLCompatMacros(MacroBuilder & Builder)96994bb937SQuinn Pham static void defineXLCompatMacros(MacroBuilder &Builder) {
97994bb937SQuinn Pham   Builder.defineMacro("__popcntb", "__builtin_ppc_popcntb");
984eb107ccSVictor Huang   Builder.defineMacro("__poppar4", "__builtin_ppc_poppar4");
994eb107ccSVictor Huang   Builder.defineMacro("__poppar8", "__builtin_ppc_poppar8");
100994bb937SQuinn Pham   Builder.defineMacro("__eieio", "__builtin_ppc_eieio");
101994bb937SQuinn Pham   Builder.defineMacro("__iospace_eieio", "__builtin_ppc_iospace_eieio");
102994bb937SQuinn Pham   Builder.defineMacro("__isync", "__builtin_ppc_isync");
103994bb937SQuinn Pham   Builder.defineMacro("__lwsync", "__builtin_ppc_lwsync");
104994bb937SQuinn Pham   Builder.defineMacro("__iospace_lwsync", "__builtin_ppc_iospace_lwsync");
105994bb937SQuinn Pham   Builder.defineMacro("__sync", "__builtin_ppc_sync");
106994bb937SQuinn Pham   Builder.defineMacro("__iospace_sync", "__builtin_ppc_iospace_sync");
107994bb937SQuinn Pham   Builder.defineMacro("__dcbfl", "__builtin_ppc_dcbfl");
108994bb937SQuinn Pham   Builder.defineMacro("__dcbflp", "__builtin_ppc_dcbflp");
109994bb937SQuinn Pham   Builder.defineMacro("__dcbst", "__builtin_ppc_dcbst");
110994bb937SQuinn Pham   Builder.defineMacro("__dcbt", "__builtin_ppc_dcbt");
111994bb937SQuinn Pham   Builder.defineMacro("__dcbtst", "__builtin_ppc_dcbtst");
112994bb937SQuinn Pham   Builder.defineMacro("__dcbz", "__builtin_ppc_dcbz");
113994bb937SQuinn Pham   Builder.defineMacro("__icbt", "__builtin_ppc_icbt");
114f3ef4f5bSJinsong Ji   Builder.defineMacro("__compare_and_swap", "__builtin_ppc_compare_and_swap");
115f3ef4f5bSJinsong Ji   Builder.defineMacro("__compare_and_swaplp",
116f3ef4f5bSJinsong Ji                       "__builtin_ppc_compare_and_swaplp");
117eb237ffcSJinsong Ji   Builder.defineMacro("__fetch_and_add", "__builtin_ppc_fetch_and_add");
118eb237ffcSJinsong Ji   Builder.defineMacro("__fetch_and_addlp", "__builtin_ppc_fetch_and_addlp");
119eb237ffcSJinsong Ji   Builder.defineMacro("__fetch_and_and", "__builtin_ppc_fetch_and_and");
120eb237ffcSJinsong Ji   Builder.defineMacro("__fetch_and_andlp", "__builtin_ppc_fetch_and_andlp");
121eb237ffcSJinsong Ji   Builder.defineMacro("__fetch_and_or", "__builtin_ppc_fetch_and_or");
122eb237ffcSJinsong Ji   Builder.defineMacro("__fetch_and_orlp", "__builtin_ppc_fetch_and_orlp");
123eb237ffcSJinsong Ji   Builder.defineMacro("__fetch_and_swap", "__builtin_ppc_fetch_and_swap");
124eb237ffcSJinsong Ji   Builder.defineMacro("__fetch_and_swaplp", "__builtin_ppc_fetch_and_swaplp");
1257d10dd60SAlbion Fung   Builder.defineMacro("__ldarx", "__builtin_ppc_ldarx");
1267d10dd60SAlbion Fung   Builder.defineMacro("__lwarx", "__builtin_ppc_lwarx");
1273434ac9eSAlbion Fung   Builder.defineMacro("__lharx", "__builtin_ppc_lharx");
1283434ac9eSAlbion Fung   Builder.defineMacro("__lbarx", "__builtin_ppc_lbarx");
1293434ac9eSAlbion Fung   Builder.defineMacro("__stfiw", "__builtin_ppc_stfiw");
1307d10dd60SAlbion Fung   Builder.defineMacro("__stdcx", "__builtin_ppc_stdcx");
1317d10dd60SAlbion Fung   Builder.defineMacro("__stwcx", "__builtin_ppc_stwcx");
1323434ac9eSAlbion Fung   Builder.defineMacro("__sthcx", "__builtin_ppc_sthcx");
13326ea4a44SVictor Huang   Builder.defineMacro("__stbcx", "__builtin_ppc_stbcx");
134ef49d925SAlbion Fung   Builder.defineMacro("__tdw", "__builtin_ppc_tdw");
135ef49d925SAlbion Fung   Builder.defineMacro("__tw", "__builtin_ppc_tw");
136ef49d925SAlbion Fung   Builder.defineMacro("__trap", "__builtin_ppc_trap");
137ef49d925SAlbion Fung   Builder.defineMacro("__trapd", "__builtin_ppc_trapd");
138ef49d925SAlbion Fung   Builder.defineMacro("__fcfid", "__builtin_ppc_fcfid");
139ef49d925SAlbion Fung   Builder.defineMacro("__fcfud", "__builtin_ppc_fcfud");
140ef49d925SAlbion Fung   Builder.defineMacro("__fctid", "__builtin_ppc_fctid");
141ef49d925SAlbion Fung   Builder.defineMacro("__fctidz", "__builtin_ppc_fctidz");
142ef49d925SAlbion Fung   Builder.defineMacro("__fctiw", "__builtin_ppc_fctiw");
143ef49d925SAlbion Fung   Builder.defineMacro("__fctiwz", "__builtin_ppc_fctiwz");
144ef49d925SAlbion Fung   Builder.defineMacro("__fctudz", "__builtin_ppc_fctudz");
145ef49d925SAlbion Fung   Builder.defineMacro("__fctuwz", "__builtin_ppc_fctuwz");
14618c19414SVictor Huang   Builder.defineMacro("__cmpeqb", "__builtin_ppc_cmpeqb");
14718c19414SVictor Huang   Builder.defineMacro("__cmprb", "__builtin_ppc_cmprb");
14818c19414SVictor Huang   Builder.defineMacro("__setb", "__builtin_ppc_setb");
1491a762f93SVictor Huang   Builder.defineMacro("__cmpb", "__builtin_ppc_cmpb");
15018c19414SVictor Huang   Builder.defineMacro("__mulhd", "__builtin_ppc_mulhd");
15118c19414SVictor Huang   Builder.defineMacro("__mulhdu", "__builtin_ppc_mulhdu");
15218c19414SVictor Huang   Builder.defineMacro("__mulhw", "__builtin_ppc_mulhw");
15318c19414SVictor Huang   Builder.defineMacro("__mulhwu", "__builtin_ppc_mulhwu");
15418c19414SVictor Huang   Builder.defineMacro("__maddhd", "__builtin_ppc_maddhd");
15518c19414SVictor Huang   Builder.defineMacro("__maddhdu", "__builtin_ppc_maddhdu");
15618c19414SVictor Huang   Builder.defineMacro("__maddld", "__builtin_ppc_maddld");
157d40e8091SVictor Huang   Builder.defineMacro("__rlwnm", "__builtin_ppc_rlwnm");
158d40e8091SVictor Huang   Builder.defineMacro("__rlwimi", "__builtin_ppc_rlwimi");
159d40e8091SVictor Huang   Builder.defineMacro("__rldimi", "__builtin_ppc_rldimi");
1604eb107ccSVictor Huang   Builder.defineMacro("__load2r", "__builtin_ppc_load2r");
1614eb107ccSVictor Huang   Builder.defineMacro("__load4r", "__builtin_ppc_load4r");
1624eb107ccSVictor Huang   Builder.defineMacro("__load8r", "__builtin_ppc_load8r");
1634eb107ccSVictor Huang   Builder.defineMacro("__store2r", "__builtin_ppc_store2r");
1644eb107ccSVictor Huang   Builder.defineMacro("__store4r", "__builtin_ppc_store4r");
1654eb107ccSVictor Huang   Builder.defineMacro("__store8r", "__builtin_ppc_store8r");
166c8937b6cSLei Huang   Builder.defineMacro("__extract_exp", "__builtin_ppc_extract_exp");
167c8937b6cSLei Huang   Builder.defineMacro("__extract_sig", "__builtin_ppc_extract_sig");
168c8937b6cSLei Huang   Builder.defineMacro("__mtfsb0", "__builtin_ppc_mtfsb0");
169c8937b6cSLei Huang   Builder.defineMacro("__mtfsb1", "__builtin_ppc_mtfsb1");
170c8937b6cSLei Huang   Builder.defineMacro("__mtfsf", "__builtin_ppc_mtfsf");
171c8937b6cSLei Huang   Builder.defineMacro("__mtfsfi", "__builtin_ppc_mtfsfi");
172c8937b6cSLei Huang   Builder.defineMacro("__insert_exp", "__builtin_ppc_insert_exp");
173c8937b6cSLei Huang   Builder.defineMacro("__fmsub", "__builtin_ppc_fmsub");
174c8937b6cSLei Huang   Builder.defineMacro("__fmsubs", "__builtin_ppc_fmsubs");
175c8937b6cSLei Huang   Builder.defineMacro("__fnmadd", "__builtin_ppc_fnmadd");
176c8937b6cSLei Huang   Builder.defineMacro("__fnmadds", "__builtin_ppc_fnmadds");
177c8937b6cSLei Huang   Builder.defineMacro("__fnmsub", "__builtin_ppc_fnmsub");
178c8937b6cSLei Huang   Builder.defineMacro("__fnmsubs", "__builtin_ppc_fnmsubs");
179c8937b6cSLei Huang   Builder.defineMacro("__fre", "__builtin_ppc_fre");
180c8937b6cSLei Huang   Builder.defineMacro("__fres", "__builtin_ppc_fres");
1810268e123SQuinn Pham   Builder.defineMacro("__swdiv_nochk", "__builtin_ppc_swdiv_nochk");
1820268e123SQuinn Pham   Builder.defineMacro("__swdivs_nochk", "__builtin_ppc_swdivs_nochk");
18302cd9379SStefan Pintilie   Builder.defineMacro("__alloca", "__builtin_alloca");
18402cd9379SStefan Pintilie   Builder.defineMacro("__vcipher", "__builtin_altivec_crypto_vcipher");
18502cd9379SStefan Pintilie   Builder.defineMacro("__vcipherlast", "__builtin_altivec_crypto_vcipherlast");
18602cd9379SStefan Pintilie   Builder.defineMacro("__vncipher", "__builtin_altivec_crypto_vncipher");
18702cd9379SStefan Pintilie   Builder.defineMacro("__vncipherlast",
18802cd9379SStefan Pintilie                       "__builtin_altivec_crypto_vncipherlast");
18902cd9379SStefan Pintilie   Builder.defineMacro("__vpermxor", "__builtin_altivec_crypto_vpermxor");
19002cd9379SStefan Pintilie   Builder.defineMacro("__vpmsumb", "__builtin_altivec_crypto_vpmsumb");
19102cd9379SStefan Pintilie   Builder.defineMacro("__vpmsumd", "__builtin_altivec_crypto_vpmsumd");
19202cd9379SStefan Pintilie   Builder.defineMacro("__vpmsumh", "__builtin_altivec_crypto_vpmsumh");
19302cd9379SStefan Pintilie   Builder.defineMacro("__vpmsumw", "__builtin_altivec_crypto_vpmsumw");
19402cd9379SStefan Pintilie   Builder.defineMacro("__divde", "__builtin_divde");
19502cd9379SStefan Pintilie   Builder.defineMacro("__divwe", "__builtin_divwe");
19602cd9379SStefan Pintilie   Builder.defineMacro("__divdeu", "__builtin_divdeu");
19702cd9379SStefan Pintilie   Builder.defineMacro("__divweu", "__builtin_divweu");
19802cd9379SStefan Pintilie   Builder.defineMacro("__alignx", "__builtin_ppc_alignx");
19902cd9379SStefan Pintilie   Builder.defineMacro("__bcopy", "bcopy");
20002cd9379SStefan Pintilie   Builder.defineMacro("__bpermd", "__builtin_bpermd");
20102cd9379SStefan Pintilie   Builder.defineMacro("__cntlz4", "__builtin_clz");
20202cd9379SStefan Pintilie   Builder.defineMacro("__cntlz8", "__builtin_clzll");
20302cd9379SStefan Pintilie   Builder.defineMacro("__cmplx", "__builtin_complex");
20402cd9379SStefan Pintilie   Builder.defineMacro("__cmplxf", "__builtin_complex");
20502cd9379SStefan Pintilie   Builder.defineMacro("__cnttz4", "__builtin_ctz");
20602cd9379SStefan Pintilie   Builder.defineMacro("__cnttz8", "__builtin_ctzll");
20702cd9379SStefan Pintilie   Builder.defineMacro("__darn", "__builtin_darn");
20802cd9379SStefan Pintilie   Builder.defineMacro("__darn_32", "__builtin_darn_32");
20902cd9379SStefan Pintilie   Builder.defineMacro("__darn_raw", "__builtin_darn_raw");
21002cd9379SStefan Pintilie   Builder.defineMacro("__dcbf", "__builtin_dcbf");
21102cd9379SStefan Pintilie   Builder.defineMacro("__fmadd", "__builtin_fma");
21202cd9379SStefan Pintilie   Builder.defineMacro("__fmadds", "__builtin_fmaf");
2133c776c70SChen Zheng   Builder.defineMacro("__abs", "__builtin_abs");
21402cd9379SStefan Pintilie   Builder.defineMacro("__labs", "__builtin_labs");
21502cd9379SStefan Pintilie   Builder.defineMacro("__llabs", "__builtin_llabs");
21602cd9379SStefan Pintilie   Builder.defineMacro("__popcnt4", "__builtin_popcount");
21702cd9379SStefan Pintilie   Builder.defineMacro("__popcnt8", "__builtin_popcountll");
21802cd9379SStefan Pintilie   Builder.defineMacro("__readflm", "__builtin_readflm");
21902cd9379SStefan Pintilie   Builder.defineMacro("__rotatel4", "__builtin_rotateleft32");
22002cd9379SStefan Pintilie   Builder.defineMacro("__rotatel8", "__builtin_rotateleft64");
22102cd9379SStefan Pintilie   Builder.defineMacro("__rdlam", "__builtin_ppc_rdlam");
22202cd9379SStefan Pintilie   Builder.defineMacro("__setflm", "__builtin_setflm");
22302cd9379SStefan Pintilie   Builder.defineMacro("__setrnd", "__builtin_setrnd");
2243434ac9eSAlbion Fung   Builder.defineMacro("__dcbtstt", "__builtin_ppc_dcbtstt");
2253434ac9eSAlbion Fung   Builder.defineMacro("__dcbtt", "__builtin_ppc_dcbtt");
2263434ac9eSAlbion Fung   Builder.defineMacro("__mftbu", "__builtin_ppc_mftbu");
2273434ac9eSAlbion Fung   Builder.defineMacro("__mfmsr", "__builtin_ppc_mfmsr");
2282fd15202SAlbion Fung   Builder.defineMacro("__mtmsr", "__builtin_ppc_mtmsr");
2292fd15202SAlbion Fung   Builder.defineMacro("__mfspr", "__builtin_ppc_mfspr");
2302fd15202SAlbion Fung   Builder.defineMacro("__mtspr", "__builtin_ppc_mtspr");
231e002d251SQuinn Pham   Builder.defineMacro("__fric", "__builtin_ppc_fric");
232e002d251SQuinn Pham   Builder.defineMacro("__frim", "__builtin_ppc_frim");
233e002d251SQuinn Pham   Builder.defineMacro("__frims", "__builtin_ppc_frims");
234e002d251SQuinn Pham   Builder.defineMacro("__frin", "__builtin_ppc_frin");
235e002d251SQuinn Pham   Builder.defineMacro("__frins", "__builtin_ppc_frins");
236e002d251SQuinn Pham   Builder.defineMacro("__frip", "__builtin_ppc_frip");
237e002d251SQuinn Pham   Builder.defineMacro("__frips", "__builtin_ppc_frips");
238e002d251SQuinn Pham   Builder.defineMacro("__friz", "__builtin_ppc_friz");
239e002d251SQuinn Pham   Builder.defineMacro("__frizs", "__builtin_ppc_frizs");
240e002d251SQuinn Pham   Builder.defineMacro("__fsel", "__builtin_ppc_fsel");
241e002d251SQuinn Pham   Builder.defineMacro("__fsels", "__builtin_ppc_fsels");
242e002d251SQuinn Pham   Builder.defineMacro("__frsqrte", "__builtin_ppc_frsqrte");
243e002d251SQuinn Pham   Builder.defineMacro("__frsqrtes", "__builtin_ppc_frsqrtes");
244e002d251SQuinn Pham   Builder.defineMacro("__fsqrt", "__builtin_ppc_fsqrt");
245e002d251SQuinn Pham   Builder.defineMacro("__fsqrts", "__builtin_ppc_fsqrts");
2468930af45SLei Huang   Builder.defineMacro("__addex", "__builtin_ppc_addex");
2479d4faa8aSAlbion Fung   Builder.defineMacro("__cmplxl", "__builtin_complex");
24870391b34SQuinn Pham   Builder.defineMacro("__compare_exp_uo", "__builtin_ppc_compare_exp_uo");
24970391b34SQuinn Pham   Builder.defineMacro("__compare_exp_lt", "__builtin_ppc_compare_exp_lt");
25070391b34SQuinn Pham   Builder.defineMacro("__compare_exp_gt", "__builtin_ppc_compare_exp_gt");
25170391b34SQuinn Pham   Builder.defineMacro("__compare_exp_eq", "__builtin_ppc_compare_exp_eq");
25270391b34SQuinn Pham   Builder.defineMacro("__test_data_class", "__builtin_ppc_test_data_class");
25367a3d1e2SQuinn Pham   Builder.defineMacro("__swdiv", "__builtin_ppc_swdiv");
25467a3d1e2SQuinn Pham   Builder.defineMacro("__swdivs", "__builtin_ppc_swdivs");
255c35ca3a1SAmy Kwan   Builder.defineMacro("__fnabs", "__builtin_ppc_fnabs");
256c35ca3a1SAmy Kwan   Builder.defineMacro("__fnabss", "__builtin_ppc_fnabss");
257b389354bSTing Wang   Builder.defineMacro("__builtin_maxfe", "__builtin_ppc_maxfe");
258b389354bSTing Wang   Builder.defineMacro("__builtin_maxfl", "__builtin_ppc_maxfl");
259b389354bSTing Wang   Builder.defineMacro("__builtin_maxfs", "__builtin_ppc_maxfs");
260b389354bSTing Wang   Builder.defineMacro("__builtin_minfe", "__builtin_ppc_minfe");
261b389354bSTing Wang   Builder.defineMacro("__builtin_minfl", "__builtin_ppc_minfl");
262b389354bSTing Wang   Builder.defineMacro("__builtin_minfs", "__builtin_ppc_minfs");
263994bb937SQuinn Pham }
264994bb937SQuinn Pham 
265ebba5926SErich Keane /// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
266ebba5926SErich Keane /// #defines that are not tied to a specific subtarget.
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const267ebba5926SErich Keane void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
268ebba5926SErich Keane                                      MacroBuilder &Builder) const {
26962b5df7fSQuinn Pham 
270c9539f95SNemanja Ivanovic   // We define the XLC compatibility macros only on AIX and Linux since XLC
271c9539f95SNemanja Ivanovic   // was never available on any other platforms.
272c9539f95SNemanja Ivanovic   if (getTriple().isOSAIX() || getTriple().isOSLinux())
27362b5df7fSQuinn Pham     defineXLCompatMacros(Builder);
27462b5df7fSQuinn Pham 
275ebba5926SErich Keane   // Target identification.
276ebba5926SErich Keane   Builder.defineMacro("__ppc__");
277ebba5926SErich Keane   Builder.defineMacro("__PPC__");
278ebba5926SErich Keane   Builder.defineMacro("_ARCH_PPC");
279ebba5926SErich Keane   Builder.defineMacro("__powerpc__");
280ebba5926SErich Keane   Builder.defineMacro("__POWERPC__");
281ebba5926SErich Keane   if (PointerWidth == 64) {
282ebba5926SErich Keane     Builder.defineMacro("_ARCH_PPC64");
283ebba5926SErich Keane     Builder.defineMacro("__powerpc64__");
284ebba5926SErich Keane     Builder.defineMacro("__ppc64__");
285ebba5926SErich Keane     Builder.defineMacro("__PPC64__");
28641bcfe81SJake Egan   } else if (getTriple().isOSAIX()) {
28741bcfe81SJake Egan     // The XL compilers on AIX define _ARCH_PPC64 for both 32 and 64-bit modes.
28841bcfe81SJake Egan     Builder.defineMacro("_ARCH_PPC64");
289ebba5926SErich Keane   }
2903189dd20SJake Egan   if (getTriple().isOSAIX()) {
2913189dd20SJake Egan     Builder.defineMacro("__THW_PPC__");
29237f23ea9SJake Egan     // Define __PPC and __powerpc for AIX XL C/C++ compatibility
29337f23ea9SJake Egan     Builder.defineMacro("__PPC");
29437f23ea9SJake Egan     Builder.defineMacro("__powerpc");
2953189dd20SJake Egan   }
296ebba5926SErich Keane 
297ebba5926SErich Keane   // Target properties.
2986cee9d0cSBrandon Bergren   if (getTriple().getArch() == llvm::Triple::ppc64le ||
2996cee9d0cSBrandon Bergren       getTriple().getArch() == llvm::Triple::ppcle) {
300ebba5926SErich Keane     Builder.defineMacro("_LITTLE_ENDIAN");
301ebba5926SErich Keane   } else {
3025a409d0eSMichal Gorny     if (!getTriple().isOSNetBSD() &&
3035a409d0eSMichal Gorny         !getTriple().isOSOpenBSD())
304ebba5926SErich Keane       Builder.defineMacro("_BIG_ENDIAN");
305ebba5926SErich Keane   }
306ebba5926SErich Keane 
307ebba5926SErich Keane   // ABI options.
308d28f8672SJinsong Ji   if (ABI == "elfv1")
309ebba5926SErich Keane     Builder.defineMacro("_CALL_ELF", "1");
310ebba5926SErich Keane   if (ABI == "elfv2")
311ebba5926SErich Keane     Builder.defineMacro("_CALL_ELF", "2");
312ebba5926SErich Keane 
313ebba5926SErich Keane   // This typically is only for a new enough linker (bfd >= 2.16.2 or gold), but
3142a8c18d9SAlexander Kornienko   // our support post-dates this and it should work on all 64-bit ppc linux
315ebba5926SErich Keane   // platforms. It is guaranteed to work on all elfv2 platforms.
316ebba5926SErich Keane   if (getTriple().getOS() == llvm::Triple::Linux && PointerWidth == 64)
317ebba5926SErich Keane     Builder.defineMacro("_CALL_LINUX", "1");
318ebba5926SErich Keane 
319ebba5926SErich Keane   // Subtarget options.
3207f7867b0SJason Liu   if (!getTriple().isOSAIX()){
321ebba5926SErich Keane     Builder.defineMacro("__NATURAL_ALIGNMENT__");
3227f7867b0SJason Liu   }
323ebba5926SErich Keane   Builder.defineMacro("__REGISTER_PREFIX__", "");
324ebba5926SErich Keane 
325ebba5926SErich Keane   // FIXME: Should be controlled by command line option.
326ebba5926SErich Keane   if (LongDoubleWidth == 128) {
327ebba5926SErich Keane     Builder.defineMacro("__LONG_DOUBLE_128__");
328ebba5926SErich Keane     Builder.defineMacro("__LONGDOUBLE128");
3292abc3368SQiu Chaofan     if (Opts.PPCIEEELongDouble)
3302abc3368SQiu Chaofan       Builder.defineMacro("__LONG_DOUBLE_IEEE128__");
3312abc3368SQiu Chaofan     else
3322abc3368SQiu Chaofan       Builder.defineMacro("__LONG_DOUBLE_IBM128__");
333ebba5926SErich Keane   }
334ebba5926SErich Keane 
3351b52e9baSJake Egan   if (getTriple().isOSAIX() && Opts.LongDoubleSize == 64) {
3361b52e9baSJake Egan     assert(LongDoubleWidth == 64);
3371b52e9baSJake Egan     Builder.defineMacro("__LONGDOUBLE64");
3381b52e9baSJake Egan   }
3391b52e9baSJake Egan 
340ebba5926SErich Keane   // Define this for elfv2 (64-bit only) or 64-bit darwin.
341ebba5926SErich Keane   if (ABI == "elfv2" ||
342ebba5926SErich Keane       (getTriple().getOS() == llvm::Triple::Darwin && PointerWidth == 64))
343ebba5926SErich Keane     Builder.defineMacro("__STRUCT_PARM_ALIGN__", "16");
344ebba5926SErich Keane 
345a6ce3fe7SStefan Pintilie   if (ArchDefs & ArchDefineName)
346ebba5926SErich Keane     Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
347a6ce3fe7SStefan Pintilie   if (ArchDefs & ArchDefinePpcgr)
348ebba5926SErich Keane     Builder.defineMacro("_ARCH_PPCGR");
349a6ce3fe7SStefan Pintilie   if (ArchDefs & ArchDefinePpcsq)
350ebba5926SErich Keane     Builder.defineMacro("_ARCH_PPCSQ");
351a6ce3fe7SStefan Pintilie   if (ArchDefs & ArchDefine440)
352ebba5926SErich Keane     Builder.defineMacro("_ARCH_440");
353a6ce3fe7SStefan Pintilie   if (ArchDefs & ArchDefine603)
354ebba5926SErich Keane     Builder.defineMacro("_ARCH_603");
355a6ce3fe7SStefan Pintilie   if (ArchDefs & ArchDefine604)
356ebba5926SErich Keane     Builder.defineMacro("_ARCH_604");
357a6ce3fe7SStefan Pintilie   if (ArchDefs & ArchDefinePwr4)
358ebba5926SErich Keane     Builder.defineMacro("_ARCH_PWR4");
359a6ce3fe7SStefan Pintilie   if (ArchDefs & ArchDefinePwr5)
360ebba5926SErich Keane     Builder.defineMacro("_ARCH_PWR5");
361a6ce3fe7SStefan Pintilie   if (ArchDefs & ArchDefinePwr5x)
362ebba5926SErich Keane     Builder.defineMacro("_ARCH_PWR5X");
363a6ce3fe7SStefan Pintilie   if (ArchDefs & ArchDefinePwr6)
364ebba5926SErich Keane     Builder.defineMacro("_ARCH_PWR6");
365a6ce3fe7SStefan Pintilie   if (ArchDefs & ArchDefinePwr6x)
366ebba5926SErich Keane     Builder.defineMacro("_ARCH_PWR6X");
367a6ce3fe7SStefan Pintilie   if (ArchDefs & ArchDefinePwr7)
368ebba5926SErich Keane     Builder.defineMacro("_ARCH_PWR7");
369a6ce3fe7SStefan Pintilie   if (ArchDefs & ArchDefinePwr8)
370ebba5926SErich Keane     Builder.defineMacro("_ARCH_PWR8");
371a6ce3fe7SStefan Pintilie   if (ArchDefs & ArchDefinePwr9)
372ebba5926SErich Keane     Builder.defineMacro("_ARCH_PWR9");
3732368bf52SLei Huang   if (ArchDefs & ArchDefinePwr10)
3742368bf52SLei Huang     Builder.defineMacro("_ARCH_PWR10");
375a6ce3fe7SStefan Pintilie   if (ArchDefs & ArchDefineA2)
376ebba5926SErich Keane     Builder.defineMacro("_ARCH_A2");
377bc4bc5aaSJustin Hibbits   if (ArchDefs & ArchDefineE500)
378bc4bc5aaSJustin Hibbits     Builder.defineMacro("__NO_LWSYNC__");
3795fcf89f7SStefan Pintilie   if (ArchDefs & ArchDefineFuture)
3805fcf89f7SStefan Pintilie     Builder.defineMacro("_ARCH_PWR_FUTURE");
381ebba5926SErich Keane 
382ebba5926SErich Keane   if (HasAltivec) {
383ebba5926SErich Keane     Builder.defineMacro("__VEC__", "10206");
384ebba5926SErich Keane     Builder.defineMacro("__ALTIVEC__");
385ebba5926SErich Keane   }
3863dac2142SJustin Hibbits   if (HasSPE) {
3873dac2142SJustin Hibbits     Builder.defineMacro("__SPE__");
3883dac2142SJustin Hibbits     Builder.defineMacro("__NO_FPRS__");
3893dac2142SJustin Hibbits   }
390ebba5926SErich Keane   if (HasVSX)
391ebba5926SErich Keane     Builder.defineMacro("__VSX__");
392ebba5926SErich Keane   if (HasP8Vector)
393ebba5926SErich Keane     Builder.defineMacro("__POWER8_VECTOR__");
394ebba5926SErich Keane   if (HasP8Crypto)
395ebba5926SErich Keane     Builder.defineMacro("__CRYPTO__");
396ebba5926SErich Keane   if (HasHTM)
397ebba5926SErich Keane     Builder.defineMacro("__HTM__");
398ebba5926SErich Keane   if (HasFloat128)
399ebba5926SErich Keane     Builder.defineMacro("__FLOAT128__");
400ebba5926SErich Keane   if (HasP9Vector)
401ebba5926SErich Keane     Builder.defineMacro("__POWER9_VECTOR__");
402512e256cSBaptiste Saleil   if (HasMMA)
403512e256cSBaptiste Saleil     Builder.defineMacro("__MMA__");
4040e4f5f3eSStefan Pintilie   if (HasROPProtect)
4050e4f5f3eSStefan Pintilie     Builder.defineMacro("__ROP_PROTECT__");
40637e72f47SAhsan Saghir   if (HasP10Vector)
40737e72f47SAhsan Saghir     Builder.defineMacro("__POWER10_VECTOR__");
40886f2a3d1SStefan Pintilie   if (HasPCRelativeMemops)
40986f2a3d1SStefan Pintilie     Builder.defineMacro("__PCREL__");
410ebba5926SErich Keane 
411ebba5926SErich Keane   Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
412ebba5926SErich Keane   Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
413ebba5926SErich Keane   Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
414ebba5926SErich Keane   if (PointerWidth == 64)
415ebba5926SErich Keane     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
416ebba5926SErich Keane 
417ebba5926SErich Keane   // We have support for the bswap intrinsics so we can define this.
418ebba5926SErich Keane   Builder.defineMacro("__HAVE_BSWAP__", "1");
419ebba5926SErich Keane 
420ebba5926SErich Keane   // FIXME: The following are not yet generated here by Clang, but are
421ebba5926SErich Keane   //        generated by GCC:
422ebba5926SErich Keane   //
423ebba5926SErich Keane   //   _SOFT_FLOAT_
424ebba5926SErich Keane   //   __RECIP_PRECISION__
425ebba5926SErich Keane   //   __APPLE_ALTIVEC__
426ebba5926SErich Keane   //   __RECIP__
427ebba5926SErich Keane   //   __RECIPF__
428ebba5926SErich Keane   //   __RSQRTE__
429ebba5926SErich Keane   //   __RSQRTEF__
430ebba5926SErich Keane   //   _SOFT_DOUBLE_
431ebba5926SErich Keane   //   __NO_LWSYNC__
432ebba5926SErich Keane   //   __CMODEL_MEDIUM__
433ebba5926SErich Keane   //   __CMODEL_LARGE__
434ebba5926SErich Keane   //   _CALL_SYSV
435ebba5926SErich Keane   //   _CALL_DARWIN
436ebba5926SErich Keane }
437ebba5926SErich Keane 
438ebba5926SErich Keane // Handle explicit options being passed to the compiler here: if we've
439ebba5926SErich Keane // explicitly turned off vsx and turned on any of:
440ebba5926SErich Keane // - power8-vector
441ebba5926SErich Keane // - direct-move
442ebba5926SErich Keane // - float128
443ebba5926SErich Keane // - power9-vector
4447aaa8562SBaptiste Saleil // - paired-vector-memops
445512e256cSBaptiste Saleil // - mma
44637e72f47SAhsan Saghir // - power10-vector
447ebba5926SErich Keane // then go ahead and error since the customer has expressed an incompatible
448ebba5926SErich Keane // set of options.
ppcUserFeaturesCheck(DiagnosticsEngine & Diags,const std::vector<std::string> & FeaturesVec)449ebba5926SErich Keane static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
450ebba5926SErich Keane                                  const std::vector<std::string> &FeaturesVec) {
451ebba5926SErich Keane 
45210b60ddeSLei Huang   // vsx was not explicitly turned off.
4530e9373a6SKazu Hirata   if (!llvm::is_contained(FeaturesVec, "-vsx"))
454ebba5926SErich Keane     return true;
45510b60ddeSLei Huang 
45610b60ddeSLei Huang   auto FindVSXSubfeature = [&](StringRef Feature, StringRef Option) {
4570e9373a6SKazu Hirata     if (llvm::is_contained(FeaturesVec, Feature)) {
45810b60ddeSLei Huang       Diags.Report(diag::err_opt_not_valid_with_opt) << Option << "-mno-vsx";
45910b60ddeSLei Huang       return true;
46010b60ddeSLei Huang     }
46110b60ddeSLei Huang     return false;
46210b60ddeSLei Huang   };
46310b60ddeSLei Huang 
46410b60ddeSLei Huang   bool Found = FindVSXSubfeature("+power8-vector", "-mpower8-vector");
46510b60ddeSLei Huang   Found |= FindVSXSubfeature("+direct-move", "-mdirect-move");
46610b60ddeSLei Huang   Found |= FindVSXSubfeature("+float128", "-mfloat128");
46710b60ddeSLei Huang   Found |= FindVSXSubfeature("+power9-vector", "-mpower9-vector");
4687aaa8562SBaptiste Saleil   Found |= FindVSXSubfeature("+paired-vector-memops", "-mpaired-vector-memops");
469512e256cSBaptiste Saleil   Found |= FindVSXSubfeature("+mma", "-mmma");
47037e72f47SAhsan Saghir   Found |= FindVSXSubfeature("+power10-vector", "-mpower10-vector");
47110b60ddeSLei Huang 
47210b60ddeSLei Huang   // Return false if any vsx subfeatures was found.
47310b60ddeSLei Huang   return !Found;
474ebba5926SErich Keane }
475ebba5926SErich Keane 
initFeatureMap(llvm::StringMap<bool> & Features,DiagnosticsEngine & Diags,StringRef CPU,const std::vector<std::string> & FeaturesVec) const476ebba5926SErich Keane bool PPCTargetInfo::initFeatureMap(
477ebba5926SErich Keane     llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
478ebba5926SErich Keane     const std::vector<std::string> &FeaturesVec) const {
479ebba5926SErich Keane   Features["altivec"] = llvm::StringSwitch<bool>(CPU)
480ebba5926SErich Keane                             .Case("7400", true)
481ebba5926SErich Keane                             .Case("g4", true)
482ebba5926SErich Keane                             .Case("7450", true)
483ebba5926SErich Keane                             .Case("g4+", true)
484ebba5926SErich Keane                             .Case("970", true)
485ebba5926SErich Keane                             .Case("g5", true)
486ebba5926SErich Keane                             .Case("pwr6", true)
487ebba5926SErich Keane                             .Case("pwr7", true)
488ebba5926SErich Keane                             .Case("pwr8", true)
489ebba5926SErich Keane                             .Case("pwr9", true)
490ebba5926SErich Keane                             .Case("ppc64", true)
491ebba5926SErich Keane                             .Case("ppc64le", true)
492ebba5926SErich Keane                             .Default(false);
493ebba5926SErich Keane 
494559845f8SLei Huang   Features["power9-vector"] = (CPU == "pwr9");
495ebba5926SErich Keane   Features["crypto"] = llvm::StringSwitch<bool>(CPU)
496ebba5926SErich Keane                            .Case("ppc64le", true)
497ebba5926SErich Keane                            .Case("pwr9", true)
498ebba5926SErich Keane                            .Case("pwr8", true)
499ebba5926SErich Keane                            .Default(false);
500ebba5926SErich Keane   Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
501ebba5926SErich Keane                                   .Case("ppc64le", true)
502ebba5926SErich Keane                                   .Case("pwr9", true)
503ebba5926SErich Keane                                   .Case("pwr8", true)
504ebba5926SErich Keane                                   .Default(false);
505ebba5926SErich Keane   Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
506ebba5926SErich Keane                            .Case("ppc64le", true)
507ebba5926SErich Keane                            .Case("pwr9", true)
508ebba5926SErich Keane                            .Case("pwr8", true)
509ebba5926SErich Keane                            .Case("pwr7", true)
510ebba5926SErich Keane                            .Default(false);
511ebba5926SErich Keane   Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
512ebba5926SErich Keane                            .Case("ppc64le", true)
513ebba5926SErich Keane                            .Case("pwr9", true)
514ebba5926SErich Keane                            .Case("pwr8", true)
515ebba5926SErich Keane                            .Case("pwr7", true)
516ebba5926SErich Keane                            .Default(false);
517ebba5926SErich Keane   Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
518ebba5926SErich Keane                                 .Case("ppc64le", true)
519ebba5926SErich Keane                                 .Case("pwr9", true)
520ebba5926SErich Keane                                 .Case("pwr8", true)
521ebba5926SErich Keane                                 .Default(false);
5222534dc12SAmy Kwan   Features["crbits"] = llvm::StringSwitch<bool>(CPU)
5232534dc12SAmy Kwan                                 .Case("ppc64le", true)
5242534dc12SAmy Kwan                                 .Case("pwr9", true)
5252534dc12SAmy Kwan                                 .Case("pwr8", true)
5262534dc12SAmy Kwan                                 .Default(false);
527ebba5926SErich Keane   Features["vsx"] = llvm::StringSwitch<bool>(CPU)
528ebba5926SErich Keane                         .Case("ppc64le", true)
529ebba5926SErich Keane                         .Case("pwr9", true)
530ebba5926SErich Keane                         .Case("pwr8", true)
531ebba5926SErich Keane                         .Case("pwr7", true)
532ebba5926SErich Keane                         .Default(false);
533ebba5926SErich Keane   Features["htm"] = llvm::StringSwitch<bool>(CPU)
534ebba5926SErich Keane                         .Case("ppc64le", true)
535ebba5926SErich Keane                         .Case("pwr9", true)
536ebba5926SErich Keane                         .Case("pwr8", true)
537ebba5926SErich Keane                         .Default(false);
538ebba5926SErich Keane 
5390e4f5f3eSStefan Pintilie   // ROP Protect is off by default.
5400e4f5f3eSStefan Pintilie   Features["rop-protect"] = false;
54191f4c111SStefan Pintilie   // Privileged instructions are off by default.
54291f4c111SStefan Pintilie   Features["privileged"] = false;
543b80357d4SStefan Pintilie 
544ba91dffaSFangrui Song   Features["spe"] = llvm::StringSwitch<bool>(CPU)
545bc4bc5aaSJustin Hibbits                         .Case("8548", true)
546bc4bc5aaSJustin Hibbits                         .Case("e500", true)
547bc4bc5aaSJustin Hibbits                         .Default(false);
548bc4bc5aaSJustin Hibbits 
549fb4e44c4SStefan Pintilie   Features["isa-v206-instructions"] = llvm::StringSwitch<bool>(CPU)
550fb4e44c4SStefan Pintilie                                           .Case("ppc64le", true)
551fb4e44c4SStefan Pintilie                                           .Case("pwr9", true)
552fb4e44c4SStefan Pintilie                                           .Case("pwr8", true)
553fb4e44c4SStefan Pintilie                                           .Case("pwr7", true)
554289236d5STing Wang                                           .Case("a2", true)
555fb4e44c4SStefan Pintilie                                           .Default(false);
556fb4e44c4SStefan Pintilie 
557781929b4SVictor Huang   Features["isa-v207-instructions"] = llvm::StringSwitch<bool>(CPU)
558781929b4SVictor Huang                                           .Case("ppc64le", true)
559781929b4SVictor Huang                                           .Case("pwr9", true)
560781929b4SVictor Huang                                           .Case("pwr8", true)
561781929b4SVictor Huang                                           .Default(false);
562781929b4SVictor Huang 
563781929b4SVictor Huang   Features["isa-v30-instructions"] =
564781929b4SVictor Huang       llvm::StringSwitch<bool>(CPU).Case("pwr9", true).Default(false);
565781929b4SVictor Huang 
566549e118eSKai Luo   Features["quadword-atomics"] =
567549e118eSKai Luo       getTriple().isArch64Bit() && llvm::StringSwitch<bool>(CPU)
568549e118eSKai Luo                                        .Case("pwr9", true)
569549e118eSKai Luo                                        .Case("pwr8", true)
570549e118eSKai Luo                                        .Default(false);
571549e118eSKai Luo 
5722368bf52SLei Huang   // Power10 includes all the same features as Power9 plus any features specific
5732368bf52SLei Huang   // to the Power10 core.
5742368bf52SLei Huang   if (CPU == "pwr10" || CPU == "power10") {
5752368bf52SLei Huang     initFeatureMap(Features, Diags, "pwr9", FeaturesVec);
5762368bf52SLei Huang     addP10SpecificFeatures(Features);
5772368bf52SLei Huang   }
5782368bf52SLei Huang 
5792368bf52SLei Huang   // Future CPU should include all of the features of Power 10 as well as any
5805fcf89f7SStefan Pintilie   // additional features (yet to be determined) specific to it.
5815fcf89f7SStefan Pintilie   if (CPU == "future") {
5822368bf52SLei Huang     initFeatureMap(Features, Diags, "pwr10", FeaturesVec);
5835fcf89f7SStefan Pintilie     addFutureSpecificFeatures(Features);
5845fcf89f7SStefan Pintilie   }
5855fcf89f7SStefan Pintilie 
586ebba5926SErich Keane   if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
587ebba5926SErich Keane     return false;
588ebba5926SErich Keane 
589d771cf27SQiu Chaofan   if (!(ArchDefs & ArchDefinePwr7) && (ArchDefs & ArchDefinePpcgr) &&
5900e9373a6SKazu Hirata       llvm::is_contained(FeaturesVec, "+float128")) {
591d771cf27SQiu Chaofan     // We have __float128 on PPC but not pre-VSX targets.
592a6ce3fe7SStefan Pintilie     Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128" << CPU;
593a6ce3fe7SStefan Pintilie     return false;
594a6ce3fe7SStefan Pintilie   }
595a6ce3fe7SStefan Pintilie 
5965eaf5b91SAmy Kwan   if (!(ArchDefs & ArchDefinePwr10)) {
597d9372897SKazu Hirata     if (llvm::is_contained(FeaturesVec, "+mma")) {
5985eaf5b91SAmy Kwan       // MMA operations are not available pre-Power10.
599170e45aeSBaptiste Saleil       Diags.Report(diag::err_opt_not_valid_with_opt) << "-mmma" << CPU;
600170e45aeSBaptiste Saleil       return false;
601170e45aeSBaptiste Saleil     }
602d9372897SKazu Hirata     if (llvm::is_contained(FeaturesVec, "+pcrel")) {
6035eaf5b91SAmy Kwan       // PC-Relative instructions are not available pre-Power10,
6045eaf5b91SAmy Kwan       // and these instructions also require prefixed instructions support.
6055eaf5b91SAmy Kwan       Diags.Report(diag::err_opt_not_valid_without_opt)
6065eaf5b91SAmy Kwan           << "-mpcrel"
6075eaf5b91SAmy Kwan           << "-mcpu=pwr10 -mprefixed";
6085eaf5b91SAmy Kwan       return false;
6095eaf5b91SAmy Kwan     }
610d9372897SKazu Hirata     if (llvm::is_contained(FeaturesVec, "+prefixed")) {
6115eaf5b91SAmy Kwan       // Prefixed instructions are not available pre-Power10.
6125eaf5b91SAmy Kwan       Diags.Report(diag::err_opt_not_valid_without_opt) << "-mprefixed"
6135eaf5b91SAmy Kwan                                                         << "-mcpu=pwr10";
6145eaf5b91SAmy Kwan       return false;
6155eaf5b91SAmy Kwan     }
616d9372897SKazu Hirata     if (llvm::is_contained(FeaturesVec, "+paired-vector-memops")) {
6175eaf5b91SAmy Kwan       // Paired vector memops are not available pre-Power10.
6185eaf5b91SAmy Kwan       Diags.Report(diag::err_opt_not_valid_without_opt)
6195eaf5b91SAmy Kwan           << "-mpaired-vector-memops"
6205eaf5b91SAmy Kwan           << "-mcpu=pwr10";
6215eaf5b91SAmy Kwan       return false;
6225eaf5b91SAmy Kwan     }
6235eaf5b91SAmy Kwan   }
624170e45aeSBaptiste Saleil 
625b80357d4SStefan Pintilie   if (!(ArchDefs & ArchDefinePwr8) &&
6260e9373a6SKazu Hirata       llvm::is_contained(FeaturesVec, "+rop-protect")) {
6270e4f5f3eSStefan Pintilie     // We can turn on ROP Protect on Power 8 and above.
6280e4f5f3eSStefan Pintilie     Diags.Report(diag::err_opt_not_valid_with_opt) << "-mrop-protect" << CPU;
629b80357d4SStefan Pintilie     return false;
630b80357d4SStefan Pintilie   }
631b80357d4SStefan Pintilie 
63291f4c111SStefan Pintilie   if (!(ArchDefs & ArchDefinePwr8) &&
6330e9373a6SKazu Hirata       llvm::is_contained(FeaturesVec, "+privileged")) {
63491f4c111SStefan Pintilie     Diags.Report(diag::err_opt_not_valid_with_opt) << "-mprivileged" << CPU;
63591f4c111SStefan Pintilie     return false;
63691f4c111SStefan Pintilie   }
63791f4c111SStefan Pintilie 
638ebba5926SErich Keane   return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
639ebba5926SErich Keane }
640ebba5926SErich Keane 
6412368bf52SLei Huang // Add any Power10 specific features.
addP10SpecificFeatures(llvm::StringMap<bool> & Features) const6422368bf52SLei Huang void PPCTargetInfo::addP10SpecificFeatures(
6432368bf52SLei Huang     llvm::StringMap<bool> &Features) const {
6442368bf52SLei Huang   Features["htm"] = false; // HTM was removed for P10.
6457aaa8562SBaptiste Saleil   Features["paired-vector-memops"] = true;
646512e256cSBaptiste Saleil   Features["mma"] = true;
64737e72f47SAhsan Saghir   Features["power10-vector"] = true;
6487cfded35SLei Huang   Features["pcrelative-memops"] = true;
6499469ff15SLei Huang   Features["prefix-instrs"] = true;
650781929b4SVictor Huang   Features["isa-v31-instructions"] = true;
6512368bf52SLei Huang }
6522368bf52SLei Huang 
6535fcf89f7SStefan Pintilie // Add features specific to the "Future" CPU.
addFutureSpecificFeatures(llvm::StringMap<bool> & Features) const6545fcf89f7SStefan Pintilie void PPCTargetInfo::addFutureSpecificFeatures(
6552d303e67SKazu Hirata     llvm::StringMap<bool> &Features) const {}
6565fcf89f7SStefan Pintilie 
hasFeature(StringRef Feature) const657ebba5926SErich Keane bool PPCTargetInfo::hasFeature(StringRef Feature) const {
658ebba5926SErich Keane   return llvm::StringSwitch<bool>(Feature)
659ebba5926SErich Keane       .Case("powerpc", true)
660ebba5926SErich Keane       .Case("altivec", HasAltivec)
661ebba5926SErich Keane       .Case("vsx", HasVSX)
6622534dc12SAmy Kwan       .Case("crbits", UseCRBits)
663ebba5926SErich Keane       .Case("power8-vector", HasP8Vector)
664ebba5926SErich Keane       .Case("crypto", HasP8Crypto)
665ebba5926SErich Keane       .Case("direct-move", HasDirectMove)
666ebba5926SErich Keane       .Case("htm", HasHTM)
667ebba5926SErich Keane       .Case("bpermd", HasBPERMD)
668ebba5926SErich Keane       .Case("extdiv", HasExtDiv)
669ebba5926SErich Keane       .Case("float128", HasFloat128)
670ebba5926SErich Keane       .Case("power9-vector", HasP9Vector)
6717aaa8562SBaptiste Saleil       .Case("paired-vector-memops", PairedVectorMemops)
67237e72f47SAhsan Saghir       .Case("power10-vector", HasP10Vector)
6737cfded35SLei Huang       .Case("pcrelative-memops", HasPCRelativeMemops)
6749469ff15SLei Huang       .Case("prefix-instrs", HasPrefixInstrs)
6753dac2142SJustin Hibbits       .Case("spe", HasSPE)
676512e256cSBaptiste Saleil       .Case("mma", HasMMA)
6770e4f5f3eSStefan Pintilie       .Case("rop-protect", HasROPProtect)
67891f4c111SStefan Pintilie       .Case("privileged", HasPrivileged)
679fb4e44c4SStefan Pintilie       .Case("isa-v206-instructions", IsISA2_06)
680781929b4SVictor Huang       .Case("isa-v207-instructions", IsISA2_07)
681781929b4SVictor Huang       .Case("isa-v30-instructions", IsISA3_0)
682781929b4SVictor Huang       .Case("isa-v31-instructions", IsISA3_1)
683549e118eSKai Luo       .Case("quadword-atomics", HasQuadwordAtomics)
684ebba5926SErich Keane       .Default(false);
685ebba5926SErich Keane }
686ebba5926SErich Keane 
setFeatureEnabled(llvm::StringMap<bool> & Features,StringRef Name,bool Enabled) const687ebba5926SErich Keane void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
688ebba5926SErich Keane                                       StringRef Name, bool Enabled) const {
689ebba5926SErich Keane   if (Enabled) {
6903f7b4ce9SNemanja Ivanovic     if (Name == "efpu2")
6913f7b4ce9SNemanja Ivanovic       Features["spe"] = true;
692ebba5926SErich Keane     // If we're enabling any of the vsx based features then enable vsx and
693ebba5926SErich Keane     // altivec. We'll diagnose any problems later.
694ebba5926SErich Keane     bool FeatureHasVSX = llvm::StringSwitch<bool>(Name)
695ebba5926SErich Keane                              .Case("vsx", true)
696ebba5926SErich Keane                              .Case("direct-move", true)
697ebba5926SErich Keane                              .Case("power8-vector", true)
698ebba5926SErich Keane                              .Case("power9-vector", true)
6997aaa8562SBaptiste Saleil                              .Case("paired-vector-memops", true)
70037e72f47SAhsan Saghir                              .Case("power10-vector", true)
701ebba5926SErich Keane                              .Case("float128", true)
702512e256cSBaptiste Saleil                              .Case("mma", true)
703ebba5926SErich Keane                              .Default(false);
704ebba5926SErich Keane     if (FeatureHasVSX)
705ebba5926SErich Keane       Features["vsx"] = Features["altivec"] = true;
706ebba5926SErich Keane     if (Name == "power9-vector")
707ebba5926SErich Keane       Features["power8-vector"] = true;
70837e72f47SAhsan Saghir     else if (Name == "power10-vector")
70937e72f47SAhsan Saghir       Features["power8-vector"] = Features["power9-vector"] = true;
7107cfded35SLei Huang     if (Name == "pcrel")
7117cfded35SLei Huang       Features["pcrelative-memops"] = true;
7129469ff15SLei Huang     else if (Name == "prefixed")
7139469ff15SLei Huang       Features["prefix-instrs"] = true;
7147cfded35SLei Huang     else
715ebba5926SErich Keane       Features[Name] = true;
716ebba5926SErich Keane   } else {
7173f7b4ce9SNemanja Ivanovic     if (Name == "spe")
7183f7b4ce9SNemanja Ivanovic       Features["efpu2"] = false;
719ebba5926SErich Keane     // If we're disabling altivec or vsx go ahead and disable all of the vsx
720ebba5926SErich Keane     // features.
721ebba5926SErich Keane     if ((Name == "altivec") || (Name == "vsx"))
722ebba5926SErich Keane       Features["vsx"] = Features["direct-move"] = Features["power8-vector"] =
72337e72f47SAhsan Saghir           Features["float128"] = Features["power9-vector"] =
724512e256cSBaptiste Saleil               Features["paired-vector-memops"] = Features["mma"] =
725512e256cSBaptiste Saleil                   Features["power10-vector"] = false;
726ebba5926SErich Keane     if (Name == "power8-vector")
7277aaa8562SBaptiste Saleil       Features["power9-vector"] = Features["paired-vector-memops"] =
728512e256cSBaptiste Saleil           Features["mma"] = Features["power10-vector"] = false;
7297aaa8562SBaptiste Saleil     else if (Name == "power9-vector")
730512e256cSBaptiste Saleil       Features["paired-vector-memops"] = Features["mma"] =
731512e256cSBaptiste Saleil           Features["power10-vector"] = false;
7327cfded35SLei Huang     if (Name == "pcrel")
7337cfded35SLei Huang       Features["pcrelative-memops"] = false;
7349469ff15SLei Huang     else if (Name == "prefixed")
7359469ff15SLei Huang       Features["prefix-instrs"] = false;
7367cfded35SLei Huang     else
737ebba5926SErich Keane       Features[Name] = false;
738ebba5926SErich Keane   }
739ebba5926SErich Keane }
740ebba5926SErich Keane 
741ebba5926SErich Keane const char *const PPCTargetInfo::GCCRegNames[] = {
742ebba5926SErich Keane     "r0",  "r1",     "r2",   "r3",      "r4",      "r5",  "r6",  "r7",  "r8",
743ebba5926SErich Keane     "r9",  "r10",    "r11",  "r12",     "r13",     "r14", "r15", "r16", "r17",
744ebba5926SErich Keane     "r18", "r19",    "r20",  "r21",     "r22",     "r23", "r24", "r25", "r26",
745ebba5926SErich Keane     "r27", "r28",    "r29",  "r30",     "r31",     "f0",  "f1",  "f2",  "f3",
746ebba5926SErich Keane     "f4",  "f5",     "f6",   "f7",      "f8",      "f9",  "f10", "f11", "f12",
747ebba5926SErich Keane     "f13", "f14",    "f15",  "f16",     "f17",     "f18", "f19", "f20", "f21",
748ebba5926SErich Keane     "f22", "f23",    "f24",  "f25",     "f26",     "f27", "f28", "f29", "f30",
749ebba5926SErich Keane     "f31", "mq",     "lr",   "ctr",     "ap",      "cr0", "cr1", "cr2", "cr3",
750ebba5926SErich Keane     "cr4", "cr5",    "cr6",  "cr7",     "xer",     "v0",  "v1",  "v2",  "v3",
751ebba5926SErich Keane     "v4",  "v5",     "v6",   "v7",      "v8",      "v9",  "v10", "v11", "v12",
752ebba5926SErich Keane     "v13", "v14",    "v15",  "v16",     "v17",     "v18", "v19", "v20", "v21",
753ebba5926SErich Keane     "v22", "v23",    "v24",  "v25",     "v26",     "v27", "v28", "v29", "v30",
754ebba5926SErich Keane     "v31", "vrsave", "vscr", "spe_acc", "spefscr", "sfp"
755ebba5926SErich Keane };
756ebba5926SErich Keane 
getGCCRegNames() const757ebba5926SErich Keane ArrayRef<const char *> PPCTargetInfo::getGCCRegNames() const {
758ebba5926SErich Keane   return llvm::makeArrayRef(GCCRegNames);
759ebba5926SErich Keane }
760ebba5926SErich Keane 
761ebba5926SErich Keane const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
762ebba5926SErich Keane     // While some of these aliases do map to different registers
763ebba5926SErich Keane     // they still share the same register name.
7646a028296SQuinn Pham     {{"0"}, "r0"},     {{"1", "sp"}, "r1"}, {{"2"}, "r2"},
7656a028296SQuinn Pham     {{"3"}, "r3"},     {{"4"}, "r4"},       {{"5"}, "r5"},
7666a028296SQuinn Pham     {{"6"}, "r6"},     {{"7"}, "r7"},       {{"8"}, "r8"},
7676a028296SQuinn Pham     {{"9"}, "r9"},     {{"10"}, "r10"},     {{"11"}, "r11"},
7686a028296SQuinn Pham     {{"12"}, "r12"},   {{"13"}, "r13"},     {{"14"}, "r14"},
7696a028296SQuinn Pham     {{"15"}, "r15"},   {{"16"}, "r16"},     {{"17"}, "r17"},
7706a028296SQuinn Pham     {{"18"}, "r18"},   {{"19"}, "r19"},     {{"20"}, "r20"},
7716a028296SQuinn Pham     {{"21"}, "r21"},   {{"22"}, "r22"},     {{"23"}, "r23"},
7726a028296SQuinn Pham     {{"24"}, "r24"},   {{"25"}, "r25"},     {{"26"}, "r26"},
7736a028296SQuinn Pham     {{"27"}, "r27"},   {{"28"}, "r28"},     {{"29"}, "r29"},
7746a028296SQuinn Pham     {{"30"}, "r30"},   {{"31"}, "r31"},     {{"fr0"}, "f0"},
7756a028296SQuinn Pham     {{"fr1"}, "f1"},   {{"fr2"}, "f2"},     {{"fr3"}, "f3"},
7766a028296SQuinn Pham     {{"fr4"}, "f4"},   {{"fr5"}, "f5"},     {{"fr6"}, "f6"},
7776a028296SQuinn Pham     {{"fr7"}, "f7"},   {{"fr8"}, "f8"},     {{"fr9"}, "f9"},
7786a028296SQuinn Pham     {{"fr10"}, "f10"}, {{"fr11"}, "f11"},   {{"fr12"}, "f12"},
7796a028296SQuinn Pham     {{"fr13"}, "f13"}, {{"fr14"}, "f14"},   {{"fr15"}, "f15"},
7806a028296SQuinn Pham     {{"fr16"}, "f16"}, {{"fr17"}, "f17"},   {{"fr18"}, "f18"},
7816a028296SQuinn Pham     {{"fr19"}, "f19"}, {{"fr20"}, "f20"},   {{"fr21"}, "f21"},
7826a028296SQuinn Pham     {{"fr22"}, "f22"}, {{"fr23"}, "f23"},   {{"fr24"}, "f24"},
7836a028296SQuinn Pham     {{"fr25"}, "f25"}, {{"fr26"}, "f26"},   {{"fr27"}, "f27"},
7846a028296SQuinn Pham     {{"fr28"}, "f28"}, {{"fr29"}, "f29"},   {{"fr30"}, "f30"},
7856a028296SQuinn Pham     {{"fr31"}, "f31"}, {{"cc"}, "cr0"},
786ebba5926SErich Keane };
787ebba5926SErich Keane 
getGCCRegAliases() const788ebba5926SErich Keane ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
789ebba5926SErich Keane   return llvm::makeArrayRef(GCCRegAliases);
790ebba5926SErich Keane }
791ebba5926SErich Keane 
7929606d58aSKang Zhang // PPC ELFABIv2 DWARF Definitoin "Table 2.26. Mappings of Common Registers".
7939606d58aSKang Zhang // vs0 ~ vs31 is mapping to 32 - 63,
7949606d58aSKang Zhang // vs32 ~ vs63 is mapping to 77 - 108.
7959606d58aSKang Zhang const TargetInfo::AddlRegName GCCAddlRegNames[] = {
7969606d58aSKang Zhang     // Table of additional register names to use in user input.
7979606d58aSKang Zhang     {{"vs0"}, 32},   {{"vs1"}, 33},   {{"vs2"}, 34},   {{"vs3"}, 35},
7989606d58aSKang Zhang     {{"vs4"}, 36},   {{"vs5"}, 37},   {{"vs6"}, 38},   {{"vs7"}, 39},
7999606d58aSKang Zhang     {{"vs8"}, 40},   {{"vs9"}, 41},   {{"vs10"}, 42},  {{"vs11"}, 43},
8009606d58aSKang Zhang     {{"vs12"}, 44},  {{"vs13"}, 45},  {{"vs14"}, 46},  {{"vs15"}, 47},
8019606d58aSKang Zhang     {{"vs16"}, 48},  {{"vs17"}, 49},  {{"vs18"}, 50},  {{"vs19"}, 51},
8029606d58aSKang Zhang     {{"vs20"}, 52},  {{"vs21"}, 53},  {{"vs22"}, 54},  {{"vs23"}, 55},
8039606d58aSKang Zhang     {{"vs24"}, 56},  {{"vs25"}, 57},  {{"vs26"}, 58},  {{"vs27"}, 59},
8049606d58aSKang Zhang     {{"vs28"}, 60},  {{"vs29"}, 61},  {{"vs30"}, 62},  {{"vs31"}, 63},
8059606d58aSKang Zhang     {{"vs32"}, 77},  {{"vs33"}, 78},  {{"vs34"}, 79},  {{"vs35"}, 80},
8069606d58aSKang Zhang     {{"vs36"}, 81},  {{"vs37"}, 82},  {{"vs38"}, 83},  {{"vs39"}, 84},
8079606d58aSKang Zhang     {{"vs40"}, 85},  {{"vs41"}, 86},  {{"vs42"}, 87},  {{"vs43"}, 88},
8089606d58aSKang Zhang     {{"vs44"}, 89},  {{"vs45"}, 90},  {{"vs46"}, 91},  {{"vs47"}, 92},
8099606d58aSKang Zhang     {{"vs48"}, 93},  {{"vs49"}, 94},  {{"vs50"}, 95},  {{"vs51"}, 96},
8109606d58aSKang Zhang     {{"vs52"}, 97},  {{"vs53"}, 98},  {{"vs54"}, 99},  {{"vs55"}, 100},
8119606d58aSKang Zhang     {{"vs56"}, 101}, {{"vs57"}, 102}, {{"vs58"}, 103}, {{"vs59"}, 104},
8129606d58aSKang Zhang     {{"vs60"}, 105}, {{"vs61"}, 106}, {{"vs62"}, 107}, {{"vs63"}, 108},
8139606d58aSKang Zhang };
8149606d58aSKang Zhang 
getGCCAddlRegNames() const8159606d58aSKang Zhang ArrayRef<TargetInfo::AddlRegName> PPCTargetInfo::getGCCAddlRegNames() const {
8169606d58aSKang Zhang   if (ABI == "elfv2")
8179606d58aSKang Zhang     return llvm::makeArrayRef(GCCAddlRegNames);
8189606d58aSKang Zhang   else
8199606d58aSKang Zhang     return TargetInfo::getGCCAddlRegNames();
8209606d58aSKang Zhang }
8219606d58aSKang Zhang 
822e44bdb3fSErich Keane static constexpr llvm::StringLiteral ValidCPUNames[] = {
823e44bdb3fSErich Keane     {"generic"},     {"440"},     {"450"},    {"601"},       {"602"},
824e44bdb3fSErich Keane     {"603"},         {"603e"},    {"603ev"},  {"604"},       {"604e"},
825e44bdb3fSErich Keane     {"620"},         {"630"},     {"g3"},     {"7400"},      {"g4"},
826bc4bc5aaSJustin Hibbits     {"7450"},        {"g4+"},     {"750"},    {"8548"},      {"970"},
827d28f8672SJinsong Ji     {"g5"},          {"a2"},      {"e500"},   {"e500mc"},    {"e5500"},
828d28f8672SJinsong Ji     {"power3"},      {"pwr3"},    {"power4"}, {"pwr4"},      {"power5"},
829d28f8672SJinsong Ji     {"pwr5"},        {"power5x"}, {"pwr5x"},  {"power6"},    {"pwr6"},
830d28f8672SJinsong Ji     {"power6x"},     {"pwr6x"},   {"power7"}, {"pwr7"},      {"power8"},
831d28f8672SJinsong Ji     {"pwr8"},        {"power9"},  {"pwr9"},   {"power10"},   {"pwr10"},
8328e336511SLemonBoy     {"powerpc"},     {"ppc"},     {"ppc32"},  {"powerpc64"}, {"ppc64"},
8338e336511SLemonBoy     {"powerpc64le"}, {"ppc64le"}, {"future"}};
834e44bdb3fSErich Keane 
isValidCPUName(StringRef Name) const835ebba5926SErich Keane bool PPCTargetInfo::isValidCPUName(StringRef Name) const {
8360e9373a6SKazu Hirata   return llvm::is_contained(ValidCPUNames, Name);
837e44bdb3fSErich Keane }
838e44bdb3fSErich Keane 
fillValidCPUList(SmallVectorImpl<StringRef> & Values) const839e44bdb3fSErich Keane void PPCTargetInfo::fillValidCPUList(SmallVectorImpl<StringRef> &Values) const {
840e44bdb3fSErich Keane   Values.append(std::begin(ValidCPUNames), std::end(ValidCPUNames));
841ebba5926SErich Keane }
842ebba5926SErich Keane 
adjust(DiagnosticsEngine & Diags,LangOptions & Opts)843aaba3718SMelanie Blower void PPCTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) {
844ebba5926SErich Keane   if (HasAltivec)
845ebba5926SErich Keane     Opts.AltiVec = 1;
846aaba3718SMelanie Blower   TargetInfo::adjust(Diags, Opts);
847c46d78d1SFangrui Song   if (LongDoubleFormat != &llvm::APFloat::IEEEdouble())
8486bd02a44SFangrui Song     LongDoubleFormat = Opts.PPCIEEELongDouble
8496bd02a44SFangrui Song                            ? &llvm::APFloat::IEEEquad()
8506bd02a44SFangrui Song                            : &llvm::APFloat::PPCDoubleDouble();
8514aa510beSserge-sans-paille   Opts.IEEE128 = 1;
852*1cbaf681SKai Luo   if (getTriple().isOSAIX() && Opts.EnableAIXQuadwordAtomicsABI &&
853*1cbaf681SKai Luo       HasQuadwordAtomics)
854*1cbaf681SKai Luo     MaxAtomicInlineWidth = 128;
855ebba5926SErich Keane }
856ebba5926SErich Keane 
getTargetBuiltins() const857ebba5926SErich Keane ArrayRef<Builtin::Info> PPCTargetInfo::getTargetBuiltins() const {
858ebba5926SErich Keane   return llvm::makeArrayRef(BuiltinInfo, clang::PPC::LastTSBuiltin -
859ebba5926SErich Keane                                              Builtin::FirstTSBuiltin);
860ebba5926SErich Keane }
861