181 lines · c
1//===-- LoongArch.h - Declare LoongArch target feature support --*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file declares LoongArch TargetInfo objects.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H14#define LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H15 16#include "clang/Basic/TargetInfo.h"17#include "clang/Basic/TargetOptions.h"18#include "llvm/Support/Compiler.h"19#include "llvm/TargetParser/Triple.h"20 21namespace clang {22namespace targets {23 24class LLVM_LIBRARY_VISIBILITY LoongArchTargetInfo : public TargetInfo {25protected:26 std::string ABI;27 std::string CPU;28 bool HasFeatureD;29 bool HasFeatureF;30 bool HasFeatureLSX;31 bool HasFeatureLASX;32 bool HasFeatureFrecipe;33 bool HasFeatureLAM_BH;34 bool HasFeatureLAMCAS;35 bool HasFeatureLD_SEQ_SA;36 bool HasFeatureDiv32;37 bool HasFeatureSCQ;38 39public:40 LoongArchTargetInfo(const llvm::Triple &Triple, const TargetOptions &)41 : TargetInfo(Triple) {42 HasFeatureD = false;43 HasFeatureF = false;44 HasFeatureLSX = false;45 HasFeatureLASX = false;46 HasFeatureFrecipe = false;47 HasFeatureLAM_BH = false;48 HasFeatureLAMCAS = false;49 HasFeatureLD_SEQ_SA = false;50 HasFeatureDiv32 = false;51 HasFeatureSCQ = false;52 BFloat16Width = 16;53 BFloat16Align = 16;54 BFloat16Format = &llvm::APFloat::BFloat();55 LongDoubleWidth = 128;56 LongDoubleAlign = 128;57 LongDoubleFormat = &llvm::APFloat::IEEEquad();58 MCountName = "_mcount";59 HasFloat16 = true;60 SuitableAlign = 128;61 WCharType = SignedInt;62 WIntType = UnsignedInt;63 BitIntMaxAlign = 128;64 }65 66 bool setCPU(const std::string &Name) override {67 if (!isValidCPUName(Name))68 return false;69 CPU = Name;70 return true;71 }72 73 StringRef getCPU() const { return CPU; }74 75 StringRef getABI() const override { return ABI; }76 77 void getTargetDefines(const LangOptions &Opts,78 MacroBuilder &Builder) const override;79 80 llvm::SmallVector<Builtin::InfosShard> getTargetBuiltins() const override;81 82 BuiltinVaListKind getBuiltinVaListKind() const override {83 return TargetInfo::VoidPtrBuiltinVaList;84 }85 86 std::string_view getClobbers() const override { return ""; }87 88 ArrayRef<const char *> getGCCRegNames() const override;89 90 int getEHDataRegisterNumber(unsigned RegNo) const override {91 if (RegNo == 0)92 return 4;93 if (RegNo == 1)94 return 5;95 return -1;96 }97 98 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;99 100 bool validateAsmConstraint(const char *&Name,101 TargetInfo::ConstraintInfo &Info) const override;102 std::string convertConstraint(const char *&Constraint) const override;103 104 bool hasBitIntType() const override { return true; }105 106 bool hasBFloat16Type() const override { return true; }107 108 bool useFP16ConversionIntrinsics() const override { return false; }109 110 bool handleTargetFeatures(std::vector<std::string> &Features,111 DiagnosticsEngine &Diags) override;112 113 ParsedTargetAttr parseTargetAttr(StringRef Str) const override;114 bool supportsTargetAttributeTune() const override { return true; }115 116 bool117 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,118 StringRef CPU,119 const std::vector<std::string> &FeaturesVec) const override;120 121 bool hasFeature(StringRef Feature) const override;122 123 bool isValidCPUName(StringRef Name) const override;124 void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;125 bool isValidFeatureName(StringRef Name) const override;126};127 128class LLVM_LIBRARY_VISIBILITY LoongArch32TargetInfo129 : public LoongArchTargetInfo {130public:131 LoongArch32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)132 : LoongArchTargetInfo(Triple, Opts) {133 IntPtrType = SignedInt;134 PtrDiffType = SignedInt;135 SizeType = UnsignedInt;136 resetDataLayout("e-m:e-p:32:32-i64:64-n32-S128");137 // TODO: select appropriate ABI.138 setABI("ilp32d");139 }140 141 bool setABI(const std::string &Name) override {142 if (Name == "ilp32d" || Name == "ilp32f" || Name == "ilp32s") {143 ABI = Name;144 return true;145 }146 return false;147 }148 void setMaxAtomicWidth() override {149 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;150 }151};152 153class LLVM_LIBRARY_VISIBILITY LoongArch64TargetInfo154 : public LoongArchTargetInfo {155public:156 LoongArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)157 : LoongArchTargetInfo(Triple, Opts) {158 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;159 IntMaxType = Int64Type = SignedLong;160 HasUnalignedAccess = true;161 resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n32:64-S128");162 // TODO: select appropriate ABI.163 setABI("lp64d");164 }165 166 bool setABI(const std::string &Name) override {167 if (Name == "lp64d" || Name == "lp64f" || Name == "lp64s") {168 ABI = Name;169 return true;170 }171 return false;172 }173 void setMaxAtomicWidth() override {174 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;175 }176};177} // end namespace targets178} // end namespace clang179 180#endif // LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H181