xref: /freebsd/contrib/llvm-project/clang/lib/Basic/Targets/VE.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15ffd83dbSDimitry Andric //===--- VE.h - Declare VE target feature support ---------------*- C++ -*-===//
25ffd83dbSDimitry Andric //
35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65ffd83dbSDimitry Andric //
75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
85ffd83dbSDimitry Andric //
95ffd83dbSDimitry Andric // This file declares VE TargetInfo objects.
105ffd83dbSDimitry Andric //
115ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
125ffd83dbSDimitry Andric 
135ffd83dbSDimitry Andric #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_VE_H
145ffd83dbSDimitry Andric #define LLVM_CLANG_LIB_BASIC_TARGETS_VE_H
155ffd83dbSDimitry Andric 
165ffd83dbSDimitry Andric #include "clang/Basic/TargetInfo.h"
175ffd83dbSDimitry Andric #include "clang/Basic/TargetOptions.h"
185ffd83dbSDimitry Andric #include "llvm/Support/Compiler.h"
1906c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h"
205ffd83dbSDimitry Andric 
215ffd83dbSDimitry Andric namespace clang {
225ffd83dbSDimitry Andric namespace targets {
235ffd83dbSDimitry Andric 
245ffd83dbSDimitry Andric class LLVM_LIBRARY_VISIBILITY VETargetInfo : public TargetInfo {
255ffd83dbSDimitry Andric 
265ffd83dbSDimitry Andric public:
VETargetInfo(const llvm::Triple & Triple,const TargetOptions &)275ffd83dbSDimitry Andric   VETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
285ffd83dbSDimitry Andric       : TargetInfo(Triple) {
295ffd83dbSDimitry Andric     NoAsmVariants = true;
305ffd83dbSDimitry Andric     LongDoubleWidth = 128;
315ffd83dbSDimitry Andric     LongDoubleAlign = 128;
325ffd83dbSDimitry Andric     LongDoubleFormat = &llvm::APFloat::IEEEquad();
335ffd83dbSDimitry Andric     DoubleAlign = LongLongAlign = 64;
345ffd83dbSDimitry Andric     SuitableAlign = 64;
355ffd83dbSDimitry Andric     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
365ffd83dbSDimitry Andric     SizeType = UnsignedLong;
375ffd83dbSDimitry Andric     PtrDiffType = SignedLong;
385ffd83dbSDimitry Andric     IntPtrType = SignedLong;
395ffd83dbSDimitry Andric     IntMaxType = SignedLong;
405ffd83dbSDimitry Andric     Int64Type = SignedLong;
415ffd83dbSDimitry Andric     RegParmMax = 8;
425ffd83dbSDimitry Andric     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
43*0fca6ea1SDimitry Andric     HasUnalignedAccess = true;
445ffd83dbSDimitry Andric 
455ffd83dbSDimitry Andric     WCharType = UnsignedInt;
465ffd83dbSDimitry Andric     WIntType = UnsignedInt;
475ffd83dbSDimitry Andric     UseZeroLengthBitfieldAlignment = true;
48e8d8bef9SDimitry Andric     resetDataLayout(
49e8d8bef9SDimitry Andric         "e-m:e-i64:64-n32:64-S128-v64:64:64-v128:64:64-v256:64:64-v512:64:64-"
50e8d8bef9SDimitry Andric         "v1024:64:64-v2048:64:64-v4096:64:64-v8192:64:64-v16384:64:64");
515ffd83dbSDimitry Andric   }
525ffd83dbSDimitry Andric 
535ffd83dbSDimitry Andric   void getTargetDefines(const LangOptions &Opts,
545ffd83dbSDimitry Andric                         MacroBuilder &Builder) const override;
555ffd83dbSDimitry Andric 
hasSjLjLowering()56e8d8bef9SDimitry Andric   bool hasSjLjLowering() const override { return true; }
575ffd83dbSDimitry Andric 
585ffd83dbSDimitry Andric   ArrayRef<Builtin::Info> getTargetBuiltins() const override;
595ffd83dbSDimitry Andric 
getBuiltinVaListKind()605ffd83dbSDimitry Andric   BuiltinVaListKind getBuiltinVaListKind() const override {
615ffd83dbSDimitry Andric     return TargetInfo::VoidPtrBuiltinVaList;
625ffd83dbSDimitry Andric   }
635ffd83dbSDimitry Andric 
checkCallingConvention(CallingConv CC)645ffd83dbSDimitry Andric   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
655ffd83dbSDimitry Andric     switch (CC) {
665ffd83dbSDimitry Andric     default:
675ffd83dbSDimitry Andric       return CCCR_Warning;
685ffd83dbSDimitry Andric     case CC_C:
695ffd83dbSDimitry Andric       return CCCR_OK;
705ffd83dbSDimitry Andric     }
715ffd83dbSDimitry Andric   }
725ffd83dbSDimitry Andric 
getClobbers()7306c3fb27SDimitry Andric   std::string_view getClobbers() const override { return ""; }
745ffd83dbSDimitry Andric 
getGCCRegNames()755ffd83dbSDimitry Andric   ArrayRef<const char *> getGCCRegNames() const override {
765ffd83dbSDimitry Andric     static const char *const GCCRegNames[] = {
775ffd83dbSDimitry Andric         // Regular registers
785ffd83dbSDimitry Andric         "sx0",  "sx1",  "sx2",  "sx3",  "sx4",  "sx5",  "sx6",  "sx7",
795ffd83dbSDimitry Andric         "sx8",  "sx9",  "sx10", "sx11", "sx12", "sx13", "sx14", "sx15",
805ffd83dbSDimitry Andric         "sx16", "sx17", "sx18", "sx19", "sx20", "sx21", "sx22", "sx23",
815ffd83dbSDimitry Andric         "sx24", "sx25", "sx26", "sx27", "sx28", "sx29", "sx30", "sx31",
825ffd83dbSDimitry Andric         "sx32", "sx33", "sx34", "sx35", "sx36", "sx37", "sx38", "sx39",
835ffd83dbSDimitry Andric         "sx40", "sx41", "sx42", "sx43", "sx44", "sx45", "sx46", "sx47",
845ffd83dbSDimitry Andric         "sx48", "sx49", "sx50", "sx51", "sx52", "sx53", "sx54", "sx55",
855ffd83dbSDimitry Andric         "sx56", "sx57", "sx58", "sx59", "sx60", "sx61", "sx62", "sx63",
865ffd83dbSDimitry Andric     };
87bdd1243dSDimitry Andric     return llvm::ArrayRef(GCCRegNames);
885ffd83dbSDimitry Andric   }
895ffd83dbSDimitry Andric 
getGCCRegAliases()905ffd83dbSDimitry Andric   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
915ffd83dbSDimitry Andric     static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
925ffd83dbSDimitry Andric         {{"s0"}, "sx0"},
935ffd83dbSDimitry Andric         {{"s1"}, "sx1"},
945ffd83dbSDimitry Andric         {{"s2"}, "sx2"},
955ffd83dbSDimitry Andric         {{"s3"}, "sx3"},
965ffd83dbSDimitry Andric         {{"s4"}, "sx4"},
975ffd83dbSDimitry Andric         {{"s5"}, "sx5"},
985ffd83dbSDimitry Andric         {{"s6"}, "sx6"},
995ffd83dbSDimitry Andric         {{"s7"}, "sx7"},
1005ffd83dbSDimitry Andric         {{"s8", "sl"}, "sx8"},
1015ffd83dbSDimitry Andric         {{"s9", "fp"}, "sx9"},
1025ffd83dbSDimitry Andric         {{"s10", "lr"}, "sx10"},
1035ffd83dbSDimitry Andric         {{"s11", "sp"}, "sx11"},
1045ffd83dbSDimitry Andric         {{"s12", "outer"}, "sx12"},
1055ffd83dbSDimitry Andric         {{"s13"}, "sx13"},
1065ffd83dbSDimitry Andric         {{"s14", "tp"}, "sx14"},
1075ffd83dbSDimitry Andric         {{"s15", "got"}, "sx15"},
1085ffd83dbSDimitry Andric         {{"s16", "plt"}, "sx16"},
1095ffd83dbSDimitry Andric         {{"s17", "info"}, "sx17"},
1105ffd83dbSDimitry Andric         {{"s18"}, "sx18"},
1115ffd83dbSDimitry Andric         {{"s19"}, "sx19"},
1125ffd83dbSDimitry Andric         {{"s20"}, "sx20"},
1135ffd83dbSDimitry Andric         {{"s21"}, "sx21"},
1145ffd83dbSDimitry Andric         {{"s22"}, "sx22"},
1155ffd83dbSDimitry Andric         {{"s23"}, "sx23"},
1165ffd83dbSDimitry Andric         {{"s24"}, "sx24"},
1175ffd83dbSDimitry Andric         {{"s25"}, "sx25"},
1185ffd83dbSDimitry Andric         {{"s26"}, "sx26"},
1195ffd83dbSDimitry Andric         {{"s27"}, "sx27"},
1205ffd83dbSDimitry Andric         {{"s28"}, "sx28"},
1215ffd83dbSDimitry Andric         {{"s29"}, "sx29"},
1225ffd83dbSDimitry Andric         {{"s30"}, "sx30"},
1235ffd83dbSDimitry Andric         {{"s31"}, "sx31"},
1245ffd83dbSDimitry Andric         {{"s32"}, "sx32"},
1255ffd83dbSDimitry Andric         {{"s33"}, "sx33"},
1265ffd83dbSDimitry Andric         {{"s34"}, "sx34"},
1275ffd83dbSDimitry Andric         {{"s35"}, "sx35"},
1285ffd83dbSDimitry Andric         {{"s36"}, "sx36"},
1295ffd83dbSDimitry Andric         {{"s37"}, "sx37"},
1305ffd83dbSDimitry Andric         {{"s38"}, "sx38"},
1315ffd83dbSDimitry Andric         {{"s39"}, "sx39"},
1325ffd83dbSDimitry Andric         {{"s40"}, "sx40"},
1335ffd83dbSDimitry Andric         {{"s41"}, "sx41"},
1345ffd83dbSDimitry Andric         {{"s42"}, "sx42"},
1355ffd83dbSDimitry Andric         {{"s43"}, "sx43"},
1365ffd83dbSDimitry Andric         {{"s44"}, "sx44"},
1375ffd83dbSDimitry Andric         {{"s45"}, "sx45"},
1385ffd83dbSDimitry Andric         {{"s46"}, "sx46"},
1395ffd83dbSDimitry Andric         {{"s47"}, "sx47"},
1405ffd83dbSDimitry Andric         {{"s48"}, "sx48"},
1415ffd83dbSDimitry Andric         {{"s49"}, "sx49"},
1425ffd83dbSDimitry Andric         {{"s50"}, "sx50"},
1435ffd83dbSDimitry Andric         {{"s51"}, "sx51"},
1445ffd83dbSDimitry Andric         {{"s52"}, "sx52"},
1455ffd83dbSDimitry Andric         {{"s53"}, "sx53"},
1465ffd83dbSDimitry Andric         {{"s54"}, "sx54"},
1475ffd83dbSDimitry Andric         {{"s55"}, "sx55"},
1485ffd83dbSDimitry Andric         {{"s56"}, "sx56"},
1495ffd83dbSDimitry Andric         {{"s57"}, "sx57"},
1505ffd83dbSDimitry Andric         {{"s58"}, "sx58"},
1515ffd83dbSDimitry Andric         {{"s59"}, "sx59"},
1525ffd83dbSDimitry Andric         {{"s60"}, "sx60"},
1535ffd83dbSDimitry Andric         {{"s61"}, "sx61"},
1545ffd83dbSDimitry Andric         {{"s62"}, "sx62"},
1555ffd83dbSDimitry Andric         {{"s63"}, "sx63"},
1565ffd83dbSDimitry Andric     };
157bdd1243dSDimitry Andric     return llvm::ArrayRef(GCCRegAliases);
1585ffd83dbSDimitry Andric   }
1595ffd83dbSDimitry Andric 
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info)1605ffd83dbSDimitry Andric   bool validateAsmConstraint(const char *&Name,
1615ffd83dbSDimitry Andric                              TargetInfo::ConstraintInfo &Info) const override {
162e8d8bef9SDimitry Andric     switch (*Name) {
163e8d8bef9SDimitry Andric     default:
164e8d8bef9SDimitry Andric       return false;
165e8d8bef9SDimitry Andric     case 'v':
166e8d8bef9SDimitry Andric       Info.setAllowsRegister();
167e8d8bef9SDimitry Andric       return true;
168e8d8bef9SDimitry Andric     }
1695ffd83dbSDimitry Andric     return false;
1705ffd83dbSDimitry Andric   }
1715ffd83dbSDimitry Andric 
allowsLargerPreferedTypeAlignment()1725ffd83dbSDimitry Andric   bool allowsLargerPreferedTypeAlignment() const override { return false; }
1735ffd83dbSDimitry Andric };
1745ffd83dbSDimitry Andric } // namespace targets
1755ffd83dbSDimitry Andric } // namespace clang
1765ffd83dbSDimitry Andric #endif // LLVM_CLANG_LIB_BASIC_TARGETS_VE_H
177