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