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