1*e038c9c4Sjoerg //===--- VE.h - Declare VE target feature support ---------------*- C++ -*-===// 2*e038c9c4Sjoerg // 3*e038c9c4Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*e038c9c4Sjoerg // See https://llvm.org/LICENSE.txt for license information. 5*e038c9c4Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*e038c9c4Sjoerg // 7*e038c9c4Sjoerg //===----------------------------------------------------------------------===// 8*e038c9c4Sjoerg // 9*e038c9c4Sjoerg // This file declares VE TargetInfo objects. 10*e038c9c4Sjoerg // 11*e038c9c4Sjoerg //===----------------------------------------------------------------------===// 12*e038c9c4Sjoerg 13*e038c9c4Sjoerg #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_VE_H 14*e038c9c4Sjoerg #define LLVM_CLANG_LIB_BASIC_TARGETS_VE_H 15*e038c9c4Sjoerg 16*e038c9c4Sjoerg #include "clang/Basic/TargetInfo.h" 17*e038c9c4Sjoerg #include "clang/Basic/TargetOptions.h" 18*e038c9c4Sjoerg #include "llvm/ADT/Triple.h" 19*e038c9c4Sjoerg #include "llvm/Support/Compiler.h" 20*e038c9c4Sjoerg 21*e038c9c4Sjoerg namespace clang { 22*e038c9c4Sjoerg namespace targets { 23*e038c9c4Sjoerg 24*e038c9c4Sjoerg class LLVM_LIBRARY_VISIBILITY VETargetInfo : public TargetInfo { 25*e038c9c4Sjoerg static const Builtin::Info BuiltinInfo[]; 26*e038c9c4Sjoerg 27*e038c9c4Sjoerg public: VETargetInfo(const llvm::Triple & Triple,const TargetOptions &)28*e038c9c4Sjoerg VETargetInfo(const llvm::Triple &Triple, const TargetOptions &) 29*e038c9c4Sjoerg : TargetInfo(Triple) { 30*e038c9c4Sjoerg NoAsmVariants = true; 31*e038c9c4Sjoerg LongDoubleWidth = 128; 32*e038c9c4Sjoerg LongDoubleAlign = 128; 33*e038c9c4Sjoerg LongDoubleFormat = &llvm::APFloat::IEEEquad(); 34*e038c9c4Sjoerg DoubleAlign = LongLongAlign = 64; 35*e038c9c4Sjoerg SuitableAlign = 64; 36*e038c9c4Sjoerg LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 37*e038c9c4Sjoerg SizeType = UnsignedLong; 38*e038c9c4Sjoerg PtrDiffType = SignedLong; 39*e038c9c4Sjoerg IntPtrType = SignedLong; 40*e038c9c4Sjoerg IntMaxType = SignedLong; 41*e038c9c4Sjoerg Int64Type = SignedLong; 42*e038c9c4Sjoerg RegParmMax = 8; 43*e038c9c4Sjoerg MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 44*e038c9c4Sjoerg 45*e038c9c4Sjoerg WCharType = UnsignedInt; 46*e038c9c4Sjoerg WIntType = UnsignedInt; 47*e038c9c4Sjoerg UseZeroLengthBitfieldAlignment = true; 48*e038c9c4Sjoerg resetDataLayout( 49*e038c9c4Sjoerg "e-m:e-i64:64-n32:64-S128-v64:64:64-v128:64:64-v256:64:64-v512:64:64-" 50*e038c9c4Sjoerg "v1024:64:64-v2048:64:64-v4096:64:64-v8192:64:64-v16384:64:64"); 51*e038c9c4Sjoerg } 52*e038c9c4Sjoerg 53*e038c9c4Sjoerg void getTargetDefines(const LangOptions &Opts, 54*e038c9c4Sjoerg MacroBuilder &Builder) const override; 55*e038c9c4Sjoerg hasSjLjLowering()56*e038c9c4Sjoerg bool hasSjLjLowering() const override { return true; } 57*e038c9c4Sjoerg 58*e038c9c4Sjoerg ArrayRef<Builtin::Info> getTargetBuiltins() const override; 59*e038c9c4Sjoerg getBuiltinVaListKind()60*e038c9c4Sjoerg BuiltinVaListKind getBuiltinVaListKind() const override { 61*e038c9c4Sjoerg return TargetInfo::VoidPtrBuiltinVaList; 62*e038c9c4Sjoerg } 63*e038c9c4Sjoerg checkCallingConvention(CallingConv CC)64*e038c9c4Sjoerg CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 65*e038c9c4Sjoerg switch (CC) { 66*e038c9c4Sjoerg default: 67*e038c9c4Sjoerg return CCCR_Warning; 68*e038c9c4Sjoerg case CC_C: 69*e038c9c4Sjoerg return CCCR_OK; 70*e038c9c4Sjoerg } 71*e038c9c4Sjoerg } 72*e038c9c4Sjoerg getClobbers()73*e038c9c4Sjoerg const char *getClobbers() const override { return ""; } 74*e038c9c4Sjoerg getGCCRegNames()75*e038c9c4Sjoerg ArrayRef<const char *> getGCCRegNames() const override { 76*e038c9c4Sjoerg static const char *const GCCRegNames[] = { 77*e038c9c4Sjoerg // Regular registers 78*e038c9c4Sjoerg "sx0", "sx1", "sx2", "sx3", "sx4", "sx5", "sx6", "sx7", 79*e038c9c4Sjoerg "sx8", "sx9", "sx10", "sx11", "sx12", "sx13", "sx14", "sx15", 80*e038c9c4Sjoerg "sx16", "sx17", "sx18", "sx19", "sx20", "sx21", "sx22", "sx23", 81*e038c9c4Sjoerg "sx24", "sx25", "sx26", "sx27", "sx28", "sx29", "sx30", "sx31", 82*e038c9c4Sjoerg "sx32", "sx33", "sx34", "sx35", "sx36", "sx37", "sx38", "sx39", 83*e038c9c4Sjoerg "sx40", "sx41", "sx42", "sx43", "sx44", "sx45", "sx46", "sx47", 84*e038c9c4Sjoerg "sx48", "sx49", "sx50", "sx51", "sx52", "sx53", "sx54", "sx55", 85*e038c9c4Sjoerg "sx56", "sx57", "sx58", "sx59", "sx60", "sx61", "sx62", "sx63", 86*e038c9c4Sjoerg }; 87*e038c9c4Sjoerg return llvm::makeArrayRef(GCCRegNames); 88*e038c9c4Sjoerg } 89*e038c9c4Sjoerg getGCCRegAliases()90*e038c9c4Sjoerg ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 91*e038c9c4Sjoerg static const TargetInfo::GCCRegAlias GCCRegAliases[] = { 92*e038c9c4Sjoerg {{"s0"}, "sx0"}, 93*e038c9c4Sjoerg {{"s1"}, "sx1"}, 94*e038c9c4Sjoerg {{"s2"}, "sx2"}, 95*e038c9c4Sjoerg {{"s3"}, "sx3"}, 96*e038c9c4Sjoerg {{"s4"}, "sx4"}, 97*e038c9c4Sjoerg {{"s5"}, "sx5"}, 98*e038c9c4Sjoerg {{"s6"}, "sx6"}, 99*e038c9c4Sjoerg {{"s7"}, "sx7"}, 100*e038c9c4Sjoerg {{"s8", "sl"}, "sx8"}, 101*e038c9c4Sjoerg {{"s9", "fp"}, "sx9"}, 102*e038c9c4Sjoerg {{"s10", "lr"}, "sx10"}, 103*e038c9c4Sjoerg {{"s11", "sp"}, "sx11"}, 104*e038c9c4Sjoerg {{"s12", "outer"}, "sx12"}, 105*e038c9c4Sjoerg {{"s13"}, "sx13"}, 106*e038c9c4Sjoerg {{"s14", "tp"}, "sx14"}, 107*e038c9c4Sjoerg {{"s15", "got"}, "sx15"}, 108*e038c9c4Sjoerg {{"s16", "plt"}, "sx16"}, 109*e038c9c4Sjoerg {{"s17", "info"}, "sx17"}, 110*e038c9c4Sjoerg {{"s18"}, "sx18"}, 111*e038c9c4Sjoerg {{"s19"}, "sx19"}, 112*e038c9c4Sjoerg {{"s20"}, "sx20"}, 113*e038c9c4Sjoerg {{"s21"}, "sx21"}, 114*e038c9c4Sjoerg {{"s22"}, "sx22"}, 115*e038c9c4Sjoerg {{"s23"}, "sx23"}, 116*e038c9c4Sjoerg {{"s24"}, "sx24"}, 117*e038c9c4Sjoerg {{"s25"}, "sx25"}, 118*e038c9c4Sjoerg {{"s26"}, "sx26"}, 119*e038c9c4Sjoerg {{"s27"}, "sx27"}, 120*e038c9c4Sjoerg {{"s28"}, "sx28"}, 121*e038c9c4Sjoerg {{"s29"}, "sx29"}, 122*e038c9c4Sjoerg {{"s30"}, "sx30"}, 123*e038c9c4Sjoerg {{"s31"}, "sx31"}, 124*e038c9c4Sjoerg {{"s32"}, "sx32"}, 125*e038c9c4Sjoerg {{"s33"}, "sx33"}, 126*e038c9c4Sjoerg {{"s34"}, "sx34"}, 127*e038c9c4Sjoerg {{"s35"}, "sx35"}, 128*e038c9c4Sjoerg {{"s36"}, "sx36"}, 129*e038c9c4Sjoerg {{"s37"}, "sx37"}, 130*e038c9c4Sjoerg {{"s38"}, "sx38"}, 131*e038c9c4Sjoerg {{"s39"}, "sx39"}, 132*e038c9c4Sjoerg {{"s40"}, "sx40"}, 133*e038c9c4Sjoerg {{"s41"}, "sx41"}, 134*e038c9c4Sjoerg {{"s42"}, "sx42"}, 135*e038c9c4Sjoerg {{"s43"}, "sx43"}, 136*e038c9c4Sjoerg {{"s44"}, "sx44"}, 137*e038c9c4Sjoerg {{"s45"}, "sx45"}, 138*e038c9c4Sjoerg {{"s46"}, "sx46"}, 139*e038c9c4Sjoerg {{"s47"}, "sx47"}, 140*e038c9c4Sjoerg {{"s48"}, "sx48"}, 141*e038c9c4Sjoerg {{"s49"}, "sx49"}, 142*e038c9c4Sjoerg {{"s50"}, "sx50"}, 143*e038c9c4Sjoerg {{"s51"}, "sx51"}, 144*e038c9c4Sjoerg {{"s52"}, "sx52"}, 145*e038c9c4Sjoerg {{"s53"}, "sx53"}, 146*e038c9c4Sjoerg {{"s54"}, "sx54"}, 147*e038c9c4Sjoerg {{"s55"}, "sx55"}, 148*e038c9c4Sjoerg {{"s56"}, "sx56"}, 149*e038c9c4Sjoerg {{"s57"}, "sx57"}, 150*e038c9c4Sjoerg {{"s58"}, "sx58"}, 151*e038c9c4Sjoerg {{"s59"}, "sx59"}, 152*e038c9c4Sjoerg {{"s60"}, "sx60"}, 153*e038c9c4Sjoerg {{"s61"}, "sx61"}, 154*e038c9c4Sjoerg {{"s62"}, "sx62"}, 155*e038c9c4Sjoerg {{"s63"}, "sx63"}, 156*e038c9c4Sjoerg }; 157*e038c9c4Sjoerg return llvm::makeArrayRef(GCCRegAliases); 158*e038c9c4Sjoerg } 159*e038c9c4Sjoerg validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info)160*e038c9c4Sjoerg bool validateAsmConstraint(const char *&Name, 161*e038c9c4Sjoerg TargetInfo::ConstraintInfo &Info) const override { 162*e038c9c4Sjoerg switch (*Name) { 163*e038c9c4Sjoerg default: 164*e038c9c4Sjoerg return false; 165*e038c9c4Sjoerg case 'v': 166*e038c9c4Sjoerg Info.setAllowsRegister(); 167*e038c9c4Sjoerg return true; 168*e038c9c4Sjoerg } 169*e038c9c4Sjoerg return false; 170*e038c9c4Sjoerg } 171*e038c9c4Sjoerg allowsLargerPreferedTypeAlignment()172*e038c9c4Sjoerg bool allowsLargerPreferedTypeAlignment() const override { return false; } 173*e038c9c4Sjoerg }; 174*e038c9c4Sjoerg } // namespace targets 175*e038c9c4Sjoerg } // namespace clang 176*e038c9c4Sjoerg #endif // LLVM_CLANG_LIB_BASIC_TARGETS_VE_H 177