19 #include "llvm/ADT/StringSwitch.h" 20 #include "llvm/IR/DataLayout.h" 22 using namespace clang;
32 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128" 33 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5";
36 "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32" 37 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128" 38 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5" 41 const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = {
56 const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = {
75 #define BUILTIN(ID, TYPE, ATTRS) \ 76 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, 77 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \ 78 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE}, 79 #include "clang/Basic/BuiltinsAMDGPU.def" 82 const char *
const AMDGPUTargetInfo::GCCRegNames[] = {
83 "v0",
"v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
84 "v9",
"v10",
"v11",
"v12",
"v13",
"v14",
"v15",
"v16",
"v17",
85 "v18",
"v19",
"v20",
"v21",
"v22",
"v23",
"v24",
"v25",
"v26",
86 "v27",
"v28",
"v29",
"v30",
"v31",
"v32",
"v33",
"v34",
"v35",
87 "v36",
"v37",
"v38",
"v39",
"v40",
"v41",
"v42",
"v43",
"v44",
88 "v45",
"v46",
"v47",
"v48",
"v49",
"v50",
"v51",
"v52",
"v53",
89 "v54",
"v55",
"v56",
"v57",
"v58",
"v59",
"v60",
"v61",
"v62",
90 "v63",
"v64",
"v65",
"v66",
"v67",
"v68",
"v69",
"v70",
"v71",
91 "v72",
"v73",
"v74",
"v75",
"v76",
"v77",
"v78",
"v79",
"v80",
92 "v81",
"v82",
"v83",
"v84",
"v85",
"v86",
"v87",
"v88",
"v89",
93 "v90",
"v91",
"v92",
"v93",
"v94",
"v95",
"v96",
"v97",
"v98",
94 "v99",
"v100",
"v101",
"v102",
"v103",
"v104",
"v105",
"v106",
"v107",
95 "v108",
"v109",
"v110",
"v111",
"v112",
"v113",
"v114",
"v115",
"v116",
96 "v117",
"v118",
"v119",
"v120",
"v121",
"v122",
"v123",
"v124",
"v125",
97 "v126",
"v127",
"v128",
"v129",
"v130",
"v131",
"v132",
"v133",
"v134",
98 "v135",
"v136",
"v137",
"v138",
"v139",
"v140",
"v141",
"v142",
"v143",
99 "v144",
"v145",
"v146",
"v147",
"v148",
"v149",
"v150",
"v151",
"v152",
100 "v153",
"v154",
"v155",
"v156",
"v157",
"v158",
"v159",
"v160",
"v161",
101 "v162",
"v163",
"v164",
"v165",
"v166",
"v167",
"v168",
"v169",
"v170",
102 "v171",
"v172",
"v173",
"v174",
"v175",
"v176",
"v177",
"v178",
"v179",
103 "v180",
"v181",
"v182",
"v183",
"v184",
"v185",
"v186",
"v187",
"v188",
104 "v189",
"v190",
"v191",
"v192",
"v193",
"v194",
"v195",
"v196",
"v197",
105 "v198",
"v199",
"v200",
"v201",
"v202",
"v203",
"v204",
"v205",
"v206",
106 "v207",
"v208",
"v209",
"v210",
"v211",
"v212",
"v213",
"v214",
"v215",
107 "v216",
"v217",
"v218",
"v219",
"v220",
"v221",
"v222",
"v223",
"v224",
108 "v225",
"v226",
"v227",
"v228",
"v229",
"v230",
"v231",
"v232",
"v233",
109 "v234",
"v235",
"v236",
"v237",
"v238",
"v239",
"v240",
"v241",
"v242",
110 "v243",
"v244",
"v245",
"v246",
"v247",
"v248",
"v249",
"v250",
"v251",
111 "v252",
"v253",
"v254",
"v255",
"s0",
"s1",
"s2",
"s3",
"s4",
112 "s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
"s12",
"s13",
113 "s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
114 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
115 "s32",
"s33",
"s34",
"s35",
"s36",
"s37",
"s38",
"s39",
"s40",
116 "s41",
"s42",
"s43",
"s44",
"s45",
"s46",
"s47",
"s48",
"s49",
117 "s50",
"s51",
"s52",
"s53",
"s54",
"s55",
"s56",
"s57",
"s58",
118 "s59",
"s60",
"s61",
"s62",
"s63",
"s64",
"s65",
"s66",
"s67",
119 "s68",
"s69",
"s70",
"s71",
"s72",
"s73",
"s74",
"s75",
"s76",
120 "s77",
"s78",
"s79",
"s80",
"s81",
"s82",
"s83",
"s84",
"s85",
121 "s86",
"s87",
"s88",
"s89",
"s90",
"s91",
"s92",
"s93",
"s94",
122 "s95",
"s96",
"s97",
"s98",
"s99",
"s100",
"s101",
"s102",
"s103",
123 "s104",
"s105",
"s106",
"s107",
"s108",
"s109",
"s110",
"s111",
"s112",
124 "s113",
"s114",
"s115",
"s116",
"s117",
"s118",
"s119",
"s120",
"s121",
125 "s122",
"s123",
"s124",
"s125",
"s126",
"s127",
"exec",
"vcc",
"scc",
126 "m0",
"flat_scratch",
"exec_lo",
"exec_hi",
"vcc_lo",
"vcc_hi",
127 "flat_scratch_lo",
"flat_scratch_hi" 136 const std::vector<std::string> &FeatureVec)
const {
138 using namespace llvm::AMDGPU;
141 if (isAMDGCN(getTriple())) {
142 switch (llvm::AMDGPU::parseArchAMDGCN(CPU)) {
145 Features[
"dot1-insts"] =
true;
146 Features[
"dot2-insts"] =
true;
147 Features[
"dot5-insts"] =
true;
148 Features[
"dot6-insts"] =
true;
151 Features[
"dl-insts"] =
true;
152 Features[
"ci-insts"] =
true;
153 Features[
"flat-address-space"] =
true;
154 Features[
"16-bit-insts"] =
true;
155 Features[
"dpp"] =
true;
156 Features[
"gfx8-insts"] =
true;
157 Features[
"gfx9-insts"] =
true;
158 Features[
"gfx10-insts"] =
true;
159 Features[
"s-memrealtime"] =
true;
162 Features[
"dot3-insts"] =
true;
163 Features[
"dot4-insts"] =
true;
164 Features[
"dot5-insts"] =
true;
165 Features[
"dot6-insts"] =
true;
168 Features[
"dl-insts"] =
true;
169 Features[
"dot1-insts"] =
true;
170 Features[
"dot2-insts"] =
true;
176 Features[
"gfx9-insts"] =
true;
182 Features[
"gfx8-insts"] =
true;
183 Features[
"16-bit-insts"] =
true;
184 Features[
"dpp"] =
true;
185 Features[
"s-memrealtime"] =
true;
192 Features[
"ci-insts"] =
true;
193 Features[
"flat-address-space"] =
true;
201 llvm_unreachable(
"Unhandled GPU!");
207 switch (llvm::AMDGPU::parseArchR600(CPU)) {
228 llvm_unreachable(
"Unhandled GPU!");
237 bool hasFP32Denormals =
false;
238 bool hasFP64Denormals =
false;
241 if (I ==
"+fp32-denormals" || I ==
"-fp32-denormals")
242 hasFP32Denormals =
true;
243 if (I ==
"+fp64-fp16-denormals" || I ==
"-fp64-fp16-denormals")
244 hasFP64Denormals =
true;
246 if (!hasFP32Denormals)
248 (Twine(hasFastFMAF() && hasFullRateDenormalsF32() && !CGOpts.FlushDenorm
249 ?
'+' :
'-') + Twine(
"fp32-denormals"))
252 if (!hasFP64Denormals && hasFP64())
253 TargetOpts.
Features.push_back(
"+fp64-fp16-denormals");
258 if (isAMDGCN(getTriple()))
259 llvm::AMDGPU::fillValidArchListAMDGCN(Values);
261 llvm::AMDGPU::fillValidArchListR600(Values);
265 AddrSpaceMap = DefaultIsPrivate ? &AMDGPUDefIsPrivMap : &AMDGPUDefIsGenMap;
271 GPUKind(isAMDGCN(Triple) ?
272 llvm::AMDGPU::parseArchAMDGCN(Opts.CPU) :
273 llvm::AMDGPU::parseArchR600(Opts.CPU)),
274 GPUFeatures(isAMDGCN(Triple) ?
275 llvm::AMDGPU::getArchAttrAMDGCN(GPUKind) :
276 llvm::AMDGPU::getArchAttrR600(GPUKind)) {
279 assert(
DataLayout->getAllocaAddrSpace() == Private);
324 if (GPUKind != llvm::AMDGPU::GK_NONE) {
325 StringRef CanonName = isAMDGCN(
getTriple()) ?
326 getArchNameAMDGCN(GPUKind) : getArchNameR600(GPUKind);
327 Builder.
defineMacro(Twine(
"__") + Twine(CanonName) + Twine(
"__"));
bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const override
Initialize the map with the default set of target features for the CPU this should include all legal ...
Defines the clang::MacroBuilder utility class.
virtual void adjust(LangOptions &Opts)
Set forced language options.
const llvm::fltSemantics * FloatFormat
Specialize PointerLikeTypeTraits to allow LazyGenerationalUpdatePtr to be placed into a PointerUnion...
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
Options for controlling the target.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods --------------------——===//
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
unsigned char MaxAtomicPromoteWidth
const llvm::fltSemantics * HalfFormat
const llvm::fltSemantics * Float128Format
Concrete class used by the front-end to report problems and issues.
ArrayRef< const char * > getGCCRegNames() const override
void setAddressSpaceMap(bool DefaultIsPrivate)
static const char *const GCCRegNames[]
Exposes information about the current target.
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
Defines the clang::LangOptions interface.
void adjustTargetOptions(const CodeGenOptions &CGOpts, TargetOptions &TargetOpts) const override
Adjust target options based on codegen options.
void setAuxTarget(const TargetInfo *Aux) override
const llvm::fltSemantics * LongDoubleFormat
Enumerates target-specific builtins in their own namespaces within namespace clang.
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings startin...
static const char *const DataLayoutStringR600
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line...
unsigned char PointerWidth
AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Dataflow Directional Tag Classes.
static const char *const DataLayoutStringAMDGCN
unsigned[(unsigned) LangAS::FirstTargetAddressSpace] LangASMap
The type of a lookup table which maps from language-specific address spaces to target-specific ones...
ArrayRef< Builtin::Info > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
void copyAuxTarget(const TargetInfo *Aux)
Copy type and layout related info.
void adjust(LangOptions &Opts) override
Set forced language options.
const llvm::fltSemantics * DoubleFormat
unsigned char MaxAtomicInlineWidth
void defineMacro(const Twine &Name, const Twine &Value="1")
Append a #define line for macro of the form "\#define Name Value\n".
unsigned char PointerAlign
std::unique_ptr< llvm::DataLayout > DataLayout
void resetDataLayout(StringRef DL)
Defines enum values for all the target-independent builtin functions.
uint64_t getMaxPointerWidth() const override
Return the maximum width of pointers on this target.
bool UseAddrSpaceMapMangling
Specify if mangling based on address space map should be used or not for language specific address sp...