blob: bb8724a2b2e7adbb5b0e345eb1dcaf7ee6aa1eb4 [file] [log] [blame]
Stanislav Mekhanoshin7f377942017-08-11 16:42:09 +00001//===-- AMDGPULibFunc.h ---------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef _AMDGPU_LIBFUNC_H_
11#define _AMDGPU_LIBFUNC_H_
12
13#include "llvm/ADT/StringRef.h"
14
15namespace llvm {
16
17class FunctionType;
18class Function;
19class Module;
20
21class AMDGPULibFunc {
22public:
23 enum EFuncId {
24 EI_NONE,
25
26 // IMPORTANT: enums below should go in ascending by 1 value order
27 // because they are used as indexes in the mangling rules table.
28 // don't use explicit value assignment.
29 EI_ABS,
30 EI_ABS_DIFF,
31 EI_ACOS,
32 EI_ACOSH,
33 EI_ACOSPI,
34 EI_ADD_SAT,
35 EI_ALL,
36 EI_ANY,
37 EI_ASIN,
38 EI_ASINH,
39 EI_ASINPI,
40 EI_ASYNC_WORK_GROUP_COPY,
41 EI_ASYNC_WORK_GROUP_STRIDED_COPY,
42 EI_ATAN,
43 EI_ATAN2,
44 EI_ATAN2PI,
45 EI_ATANH,
46 EI_ATANPI,
47 EI_ATOMIC_ADD,
48 EI_ATOMIC_AND,
49 EI_ATOMIC_CMPXCHG,
50 EI_ATOMIC_DEC,
51 EI_ATOMIC_INC,
52 EI_ATOMIC_MAX,
53 EI_ATOMIC_MIN,
54 EI_ATOMIC_OR,
55 EI_ATOMIC_SUB,
56 EI_ATOMIC_XCHG,
57 EI_ATOMIC_XOR,
58 EI_BITSELECT,
59 EI_CBRT,
60 EI_CEIL,
61 EI_CLAMP,
62 EI_CLZ,
63 EI_COMMIT_READ_PIPE,
64 EI_COMMIT_WRITE_PIPE,
65 EI_COPYSIGN,
66 EI_COS,
67 EI_COSH,
68 EI_COSPI,
69 EI_CROSS,
70 EI_CTZ,
71 EI_DEGREES,
72 EI_DISTANCE,
73 EI_DIVIDE,
74 EI_DOT,
75 EI_ERF,
76 EI_ERFC,
77 EI_EXP,
78 EI_EXP10,
79 EI_EXP2,
80 EI_EXPM1,
81 EI_FABS,
82 EI_FAST_DISTANCE,
83 EI_FAST_LENGTH,
84 EI_FAST_NORMALIZE,
85 EI_FDIM,
86 EI_FLOOR,
87 EI_FMA,
88 EI_FMAX,
89 EI_FMIN,
90 EI_FMOD,
91 EI_FRACT,
92 EI_FREXP,
93 EI_GET_IMAGE_ARRAY_SIZE,
94 EI_GET_IMAGE_CHANNEL_DATA_TYPE,
95 EI_GET_IMAGE_CHANNEL_ORDER,
96 EI_GET_IMAGE_DIM,
97 EI_GET_IMAGE_HEIGHT,
98 EI_GET_IMAGE_WIDTH,
99 EI_GET_PIPE_MAX_PACKETS,
100 EI_GET_PIPE_NUM_PACKETS,
101 EI_HADD,
102 EI_HYPOT,
103 EI_ILOGB,
104 EI_ISEQUAL,
105 EI_ISFINITE,
106 EI_ISGREATER,
107 EI_ISGREATEREQUAL,
108 EI_ISINF,
109 EI_ISLESS,
110 EI_ISLESSEQUAL,
111 EI_ISLESSGREATER,
112 EI_ISNAN,
113 EI_ISNORMAL,
114 EI_ISNOTEQUAL,
115 EI_ISORDERED,
116 EI_ISUNORDERED,
117 EI_LDEXP,
118 EI_LENGTH,
119 EI_LGAMMA,
120 EI_LGAMMA_R,
121 EI_LOG,
122 EI_LOG10,
123 EI_LOG1P,
124 EI_LOG2,
125 EI_LOGB,
126 EI_MAD,
127 EI_MAD24,
128 EI_MAD_HI,
129 EI_MAD_SAT,
130 EI_MAX,
131 EI_MAXMAG,
132 EI_MIN,
133 EI_MINMAG,
134 EI_MIX,
135 EI_MODF,
136 EI_MUL24,
137 EI_MUL_HI,
138 EI_NAN,
139 EI_NEXTAFTER,
140 EI_NORMALIZE,
141 EI_POPCOUNT,
142 EI_POW,
143 EI_POWN,
144 EI_POWR,
145 EI_PREFETCH,
146 EI_RADIANS,
147 EI_READ_PIPE,
148 EI_RECIP,
149 EI_REMAINDER,
150 EI_REMQUO,
151 EI_RESERVE_READ_PIPE,
152 EI_RESERVE_WRITE_PIPE,
153 EI_RHADD,
154 EI_RINT,
155 EI_ROOTN,
156 EI_ROTATE,
157 EI_ROUND,
158 EI_RSQRT,
159 EI_SELECT,
160 EI_SHUFFLE,
161 EI_SHUFFLE2,
162 EI_SIGN,
163 EI_SIGNBIT,
164 EI_SIN,
165 EI_SINCOS,
166 EI_SINH,
167 EI_SINPI,
168 EI_SMOOTHSTEP,
169 EI_SQRT,
170 EI_STEP,
171 EI_SUB_GROUP_BROADCAST,
172 EI_SUB_GROUP_COMMIT_READ_PIPE,
173 EI_SUB_GROUP_COMMIT_WRITE_PIPE,
174 EI_SUB_GROUP_REDUCE_ADD,
175 EI_SUB_GROUP_REDUCE_MAX,
176 EI_SUB_GROUP_REDUCE_MIN,
177 EI_SUB_GROUP_RESERVE_READ_PIPE,
178 EI_SUB_GROUP_RESERVE_WRITE_PIPE,
179 EI_SUB_GROUP_SCAN_EXCLUSIVE_ADD,
180 EI_SUB_GROUP_SCAN_EXCLUSIVE_MAX,
181 EI_SUB_GROUP_SCAN_EXCLUSIVE_MIN,
182 EI_SUB_GROUP_SCAN_INCLUSIVE_ADD,
183 EI_SUB_GROUP_SCAN_INCLUSIVE_MAX,
184 EI_SUB_GROUP_SCAN_INCLUSIVE_MIN,
185 EI_SUB_SAT,
186 EI_TAN,
187 EI_TANH,
188 EI_TANPI,
189 EI_TGAMMA,
190 EI_TRUNC,
191 EI_UPSAMPLE,
192 EI_VEC_STEP,
193 EI_VSTORE,
194 EI_VSTORE16,
195 EI_VSTORE2,
196 EI_VSTORE3,
197 EI_VSTORE4,
198 EI_VSTORE8,
199 EI_WORK_GROUP_COMMIT_READ_PIPE,
200 EI_WORK_GROUP_COMMIT_WRITE_PIPE,
201 EI_WORK_GROUP_REDUCE_ADD,
202 EI_WORK_GROUP_REDUCE_MAX,
203 EI_WORK_GROUP_REDUCE_MIN,
204 EI_WORK_GROUP_RESERVE_READ_PIPE,
205 EI_WORK_GROUP_RESERVE_WRITE_PIPE,
206 EI_WORK_GROUP_SCAN_EXCLUSIVE_ADD,
207 EI_WORK_GROUP_SCAN_EXCLUSIVE_MAX,
208 EI_WORK_GROUP_SCAN_EXCLUSIVE_MIN,
209 EI_WORK_GROUP_SCAN_INCLUSIVE_ADD,
210 EI_WORK_GROUP_SCAN_INCLUSIVE_MAX,
211 EI_WORK_GROUP_SCAN_INCLUSIVE_MIN,
212 EI_WRITE_IMAGEF,
213 EI_WRITE_IMAGEI,
214 EI_WRITE_IMAGEUI,
215 EI_WRITE_PIPE,
216 EI_NCOS,
217 EI_NEXP2,
218 EI_NFMA,
219 EI_NLOG2,
220 EI_NRCP,
221 EI_NRSQRT,
222 EI_NSIN,
223 EI_NSQRT,
224 EI_FTZ,
225 EI_FLDEXP,
226 EI_CLASS,
227 EI_RCBRT,
228
229 EX_INTRINSICS_COUNT
230 };
231
232 enum ENamePrefix {
233 NOPFX,
234 NATIVE,
235 HALF
236 };
237
238 enum EType {
239 B8 = 1,
240 B16 = 2,
241 B32 = 3,
242 B64 = 4,
243 SIZE_MASK = 7,
244 FLOAT = 0x10,
245 INT = 0x20,
246 UINT = 0x30,
247 BASE_TYPE_MASK = 0x30,
248 U8 = UINT | B8,
249 U16 = UINT | B16,
250 U32 = UINT | B32,
251 U64 = UINT | B64,
252 I8 = INT | B8,
253 I16 = INT | B16,
254 I32 = INT | B32,
255 I64 = INT | B64,
256 F16 = FLOAT | B16,
257 F32 = FLOAT | B32,
258 F64 = FLOAT | B64,
259 IMG1DA = 0x80,
260 IMG1DB,
261 IMG2DA,
262 IMG1D,
263 IMG2D,
264 IMG3D,
265 SAMPLER,
266 EVENT,
267 DUMMY
268 };
269
270 enum EPtrKind {
271 BYVALUE = 0,
272 PRIVATE,
273 GLOBAL,
274 READONLY,
275 LOCAL,
276 GENERIC,
277 OTHER,
278
279 ADDR_SPACE = 0xF,
280 CONST = 0x10,
281 VOLATILE = 0x20
282 };
283
284 struct Param {
285 unsigned char ArgType;
286 unsigned char VectorSize;
287 unsigned char PtrKind;
288
289 unsigned char Reserved;
290
291 void reset() {
292 ArgType = 0;
293 VectorSize = 1;
294 PtrKind = 0;
295 }
296 Param() { reset(); }
297
298 template <typename Stream>
299 void mangleItanium(Stream& os);
300 };
301
302public:
303 static bool parse(StringRef mangledName, AMDGPULibFunc &iInfo);
304
305 AMDGPULibFunc();
306 AMDGPULibFunc(EFuncId id, const AMDGPULibFunc& copyFrom);
307
308 ENamePrefix getPrefix() const { return FKind; }
309 EFuncId getId() const { return FuncId; }
310
311 std::string getName() const;
312 unsigned getNumArgs() const;
313
314 FunctionType* getFunctionType(Module& M) const;
315
316 std::string mangle() const;
317
318 void setPrefix(ENamePrefix pfx) { FKind = pfx; }
319 void setId(EFuncId id) { FuncId = id; }
320
321 static Function* getFunction(llvm::Module *M, const AMDGPULibFunc& fInfo);
322
323 static Function* getOrInsertFunction(llvm::Module *M,
324 const AMDGPULibFunc& fInfo);
325
326 static StringRef getUnmangledName(const StringRef& mangledName);
327
328 Param Leads[2];
329
330private:
331 EFuncId FuncId;
332 ENamePrefix FKind;
333 std::string Name;
334
335 void reset();
336
337 std::string mangleNameItanium() const;
338 bool parseItanuimName(StringRef& mangledName);
339
340 std::string mangleName(const StringRef& name) const;
341 bool parseName(const StringRef& mangledName);
342
343 template <typename Stream>
344 void writeName(Stream& OS) const;
345};
346
347}
348#endif // _AMDGPU_LIBFUNC_H_