xref: /openbsd-src/gnu/llvm/clang/lib/Basic/Targets/VE.h (revision 12c855180aad702bbcca06e0398d774beeafb155)
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