17#include "llvm/Support/raw_ostream.h"
18#include "llvm/TargetParser/LoongArchTargetParser.h"
26 "$r0",
"$r1",
"$r2",
"$r3",
"$r4",
"$r5",
"$r6",
"$r7",
"$r8",
"$r9",
27 "$r10",
"$r11",
"$r12",
"$r13",
"$r14",
"$r15",
"$r16",
"$r17",
"$r18",
28 "$r19",
"$r20",
"$r21",
"$r22",
"$r23",
"$r24",
"$r25",
"$r26",
"$r27",
29 "$r28",
"$r29",
"$r30",
"$r31",
31 "$f0",
"$f1",
"$f2",
"$f3",
"$f4",
"$f5",
"$f6",
"$f7",
"$f8",
"$f9",
32 "$f10",
"$f11",
"$f12",
"$f13",
"$f14",
"$f15",
"$f16",
"$f17",
"$f18",
33 "$f19",
"$f20",
"$f21",
"$f22",
"$f23",
"$f24",
"$f25",
"$f26",
"$f27",
34 "$f28",
"$f29",
"$f30",
"$f31",
36 "$fcc0",
"$fcc1",
"$fcc2",
"$fcc3",
"$fcc4",
"$fcc5",
"$fcc6",
"$fcc7",
38 "$vr0",
"$vr1",
"$vr2",
"$vr3",
"$vr4",
"$vr5",
"$vr6",
"$vr7",
"$vr8",
39 "$vr9",
"$vr10",
"$vr11",
"$vr12",
"$vr13",
"$vr14",
"$vr15",
"$vr16",
40 "$vr17",
"$vr18",
"$vr19",
"$vr20",
"$vr21",
"$vr22",
"$vr23",
"$vr24",
41 "$vr25",
"$vr26",
"$vr27",
"$vr28",
"$vr29",
"$vr30",
"$vr31",
43 "$xr0",
"$xr1",
"$xr2",
"$xr3",
"$xr4",
"$xr5",
"$xr6",
"$xr7",
"$xr8",
44 "$xr9",
"$xr10",
"$xr11",
"$xr12",
"$xr13",
"$xr14",
"$xr15",
"$xr16",
45 "$xr17",
"$xr18",
"$xr19",
"$xr20",
"$xr21",
"$xr22",
"$xr23",
"$xr24",
46 "$xr25",
"$xr26",
"$xr27",
"$xr28",
"$xr29",
"$xr30",
"$xr31"};
53 {{
"zero",
"$zero",
"r0"},
"$r0"},
54 {{
"ra",
"$ra",
"r1"},
"$r1"},
55 {{
"tp",
"$tp",
"r2"},
"$r2"},
56 {{
"sp",
"$sp",
"r3"},
"$r3"},
57 {{
"a0",
"$a0",
"r4"},
"$r4"},
58 {{
"a1",
"$a1",
"r5"},
"$r5"},
59 {{
"a2",
"$a2",
"r6"},
"$r6"},
60 {{
"a3",
"$a3",
"r7"},
"$r7"},
61 {{
"a4",
"$a4",
"r8"},
"$r8"},
62 {{
"a5",
"$a5",
"r9"},
"$r9"},
63 {{
"a6",
"$a6",
"r10"},
"$r10"},
64 {{
"a7",
"$a7",
"r11"},
"$r11"},
65 {{
"t0",
"$t0",
"r12"},
"$r12"},
66 {{
"t1",
"$t1",
"r13"},
"$r13"},
67 {{
"t2",
"$t2",
"r14"},
"$r14"},
68 {{
"t3",
"$t3",
"r15"},
"$r15"},
69 {{
"t4",
"$t4",
"r16"},
"$r16"},
70 {{
"t5",
"$t5",
"r17"},
"$r17"},
71 {{
"t6",
"$t6",
"r18"},
"$r18"},
72 {{
"t7",
"$t7",
"r19"},
"$r19"},
73 {{
"t8",
"$t8",
"r20"},
"$r20"},
75 {{
"s9",
"$s9",
"r22",
"fp",
"$fp"},
"$r22"},
76 {{
"s0",
"$s0",
"r23"},
"$r23"},
77 {{
"s1",
"$s1",
"r24"},
"$r24"},
78 {{
"s2",
"$s2",
"r25"},
"$r25"},
79 {{
"s3",
"$s3",
"r26"},
"$r26"},
80 {{
"s4",
"$s4",
"r27"},
"$r27"},
81 {{
"s5",
"$s5",
"r28"},
"$r28"},
82 {{
"s6",
"$s6",
"r29"},
"$r29"},
83 {{
"s7",
"$s7",
"r30"},
"$r30"},
84 {{
"s8",
"$s8",
"r31"},
"$r31"},
160 if (Name[1] ==
'C' || Name[1] ==
'B') {
172 switch (*Constraint) {
176 R =
"^" + std::string(Constraint, 2);
188 Builder.defineMacro(
"__loongarch__");
190 Builder.defineMacro(
"__loongarch_grlen", Twine(GRLen));
192 Builder.defineMacro(
"__loongarch64");
195 Builder.defineMacro(
"__loongarch_frlen",
"64");
197 Builder.defineMacro(
"__loongarch_frlen",
"32");
199 Builder.defineMacro(
"__loongarch_frlen",
"0");
202 StringRef ArchName =
getCPU();
203 if (ArchName ==
"loongarch64") {
210 Builder.defineMacro(
"__loongarch_arch",
211 Twine(
'"') +
"la64v1.1" + Twine(
'"'));
213 Builder.defineMacro(
"__loongarch_arch",
214 Twine(
'"') +
"la64v1.0" + Twine(
'"'));
216 Builder.defineMacro(
"__loongarch_arch",
217 Twine(
'"') + ArchName + Twine(
'"'));
220 Builder.defineMacro(
"__loongarch_arch", Twine(
'"') + ArchName + Twine(
'"'));
227 Builder.defineMacro(
"__loongarch_tune", Twine(
'"') + TuneCPU + Twine(
'"'));
230 Builder.defineMacro(
"__loongarch_simd_width",
"256");
231 Builder.defineMacro(
"__loongarch_sx", Twine(1));
232 Builder.defineMacro(
"__loongarch_asx", Twine(1));
234 Builder.defineMacro(
"__loongarch_simd_width",
"128");
235 Builder.defineMacro(
"__loongarch_sx", Twine(1));
238 Builder.defineMacro(
"__loongarch_frecipe", Twine(1));
241 Builder.defineMacro(
"__loongarch_lam_bh", Twine(1));
244 Builder.defineMacro(
"__loongarch_lamcas", Twine(1));
247 Builder.defineMacro(
"__loongarch_ld_seq_sa", Twine(1));
250 Builder.defineMacro(
"__loongarch_div32", Twine(1));
253 if (
ABI ==
"lp64d" ||
ABI ==
"lp64f" ||
ABI ==
"lp64s")
254 Builder.defineMacro(
"__loongarch_lp64");
256 if (
ABI ==
"lp64d" ||
ABI ==
"ilp32d") {
257 Builder.defineMacro(
"__loongarch_hard_float");
258 Builder.defineMacro(
"__loongarch_double_float");
259 }
else if (
ABI ==
"lp64f" ||
ABI ==
"ilp32f") {
260 Builder.defineMacro(
"__loongarch_hard_float");
261 Builder.defineMacro(
"__loongarch_single_float");
262 }
else if (
ABI ==
"lp64s" ||
ABI ==
"ilp32s") {
263 Builder.defineMacro(
"__loongarch_soft_float");
266 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
267 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
268 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
270 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
274#define BUILTIN(ID, TYPE, ATTRS) \
275 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
276#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
277 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
278#include "clang/Basic/BuiltinsLoongArch.def"
283 const std::vector<std::string> &FeaturesVec)
const {
284 if (
getTriple().getArch() == llvm::Triple::loongarch64)
285 Features[
"64bit"] =
true;
286 if (
getTriple().getArch() == llvm::Triple::loongarch32)
287 Features[
"32bit"] =
true;
294 bool Is64Bit =
getTriple().getArch() == llvm::Triple::loongarch64;
296 return llvm::StringSwitch<bool>(Feature)
297 .Case(
"loongarch32", !Is64Bit)
298 .Case(
"loongarch64", Is64Bit)
299 .Case(
"32bit", !Is64Bit)
300 .Case(
"64bit", Is64Bit)
313 for (
const auto &Feature : Features) {
314 if (Feature ==
"+d" || Feature ==
"+f") {
317 if (Feature ==
"+d") {
320 }
else if (Feature ==
"+lsx")
322 else if (Feature ==
"+lasx")
324 else if (Feature ==
"-ual")
326 else if (Feature ==
"+frecipe")
328 else if (Feature ==
"+lam-bh")
330 else if (Feature ==
"+lamcas")
332 else if (Feature ==
"+ld-seq-sa")
334 else if (Feature ==
"+div32")
341 return llvm::LoongArch::isValidCPUName(Name);
346 llvm::LoongArch::fillValidCPUList(Values);
Defines the Diagnostic-related interfaces.
static constexpr Builtin::Info BuiltinInfo[]
Defines the clang::MacroBuilder utility class.
Enumerates target-specific builtins in their own namespaces within namespace clang.
Concrete class used by the front-end to report problems and issues.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
TargetOptions & getTargetOpts() const
Retrieve the target options.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
unsigned HasUnalignedAccess
virtual unsigned getRegisterWidth() const
Return the "preferred" register width on this 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 ...
virtual std::string convertConstraint(const char *&Constraint) const
std::string TuneCPU
If given, the name of the target CPU to tune code for.
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
StringRef getABI() const override
Get the ABI currently in use.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
ArrayRef< Builtin::Info > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
bool isValidCPUName(StringRef Name) const override
Determine whether this TargetInfo supports the given CPU name.
bool validateAsmConstraint(const char *&Name, TargetInfo::ConstraintInfo &Info) const override
ArrayRef< const char * > getGCCRegNames() const override
bool hasFeature(StringRef Feature) const override
Return true if has this feature.
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
Perform initialization based on the user configured set of features (e.g., +sse4).
std::string convertConstraint(const char *&Constraint) const override
bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeaturesVec) const override
Initialize the map with the default set of target features for the CPU this should include all legal ...
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
static const char *const GCCRegNames[]
The JSON file list parser is used to communicate input to InstallAPI.
void setRequiresImmediate(int Min, int Max)