xref: /netbsd-src/external/apache2/llvm/dist/clang/lib/Basic/Targets/VE.h (revision e038c9c4676b0f19b1b7dd08a940c6ed64a6d5ae)
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