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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file declares LoongArch TargetInfo objects. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H 14 #define LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H 15 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 21 namespace clang { 22 namespace targets { 23 24 class LLVM_LIBRARY_VISIBILITY LoongArchTargetInfo : public TargetInfo { 25 protected: 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 39 public: LoongArchTargetInfo(const llvm::Triple & Triple,const TargetOptions &)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 setCPU(const std::string & Name)66 bool setCPU(const std::string &Name) override { 67 if (!isValidCPUName(Name)) 68 return false; 69 CPU = Name; 70 return true; 71 } 72 getCPU()73 StringRef getCPU() const { return CPU; } 74 getABI()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 getBuiltinVaListKind()82 BuiltinVaListKind getBuiltinVaListKind() const override { 83 return TargetInfo::VoidPtrBuiltinVaList; 84 } 85 getClobbers()86 std::string_view getClobbers() const override { return ""; } 87 88 ArrayRef<const char *> getGCCRegNames() const override; 89 getEHDataRegisterNumber(unsigned RegNo)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 hasBitIntType()104 bool hasBitIntType() const override { return true; } 105 hasBFloat16Type()106 bool hasBFloat16Type() const override { return true; } 107 useFP16ConversionIntrinsics()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; supportsTargetAttributeTune()114 bool supportsTargetAttributeTune() const override { return true; } 115 116 bool 117 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 128 class LLVM_LIBRARY_VISIBILITY LoongArch32TargetInfo 129 : public LoongArchTargetInfo { 130 public: LoongArch32TargetInfo(const llvm::Triple & Triple,const TargetOptions & Opts)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 setABI(const std::string & Name)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 } setMaxAtomicWidth()148 void setMaxAtomicWidth() override { 149 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32; 150 } 151 }; 152 153 class LLVM_LIBRARY_VISIBILITY LoongArch64TargetInfo 154 : public LoongArchTargetInfo { 155 public: LoongArch64TargetInfo(const llvm::Triple & Triple,const TargetOptions & Opts)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 setABI(const std::string & Name)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 } setMaxAtomicWidth()173 void setMaxAtomicWidth() override { 174 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 175 } 176 }; 177 } // end namespace targets 178 } // end namespace clang 179 180 #endif // LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H 181