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