File: GenIntrinsics.h

package info (click to toggle)
intel-graphics-compiler 1.0.12504.6-1%2Bdeb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 83,912 kB
  • sloc: cpp: 910,147; lisp: 202,655; ansic: 15,197; python: 4,025; yacc: 2,241; lex: 1,570; pascal: 244; sh: 104; makefile: 25
file content (81 lines) | stat: -rw-r--r-- 2,703 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*========================== begin_copyright_notice ============================

Copyright (C) 2017-2021 Intel Corporation

SPDX-License-Identifier: MIT

============================= end_copyright_notice ===========================*/

#ifndef GENINTRINSICS_H
#define GENINTRINSICS_H

#include "common/LLVMWarningsPush.hpp"

#include "llvmWrapper/IR/Module.h"

#include "llvm/IR/Attributes.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Function.h"
#include "common/LLVMWarningsPop.hpp"

namespace llvm {

namespace GenISAIntrinsic {
  enum ID : unsigned {
    no_intrinsic = Intrinsic::num_intrinsics,
#define GET_INTRINSIC_ENUM_VALUES
#include "IntrinsicGenISA.gen"
#undef GET_INTRINSIC_ENUM_VALUES
    num_genisa_intrinsics
  };


  /// Intrinsic::getName(ID) - Return the LLVM name for an intrinsic, such as
  /// "llvm.ppc.altivec.lvx".
  std::string getName(ID id, ArrayRef<Type*> Tys = None);


  struct IntrinsicComments
  {
      const char* funcDescription;
      std::vector<const char*> outputs;
      std::vector<const char*> inputs;
  };

  IntrinsicComments getIntrinsicComments(ID id);

  /// Intrinsic::getDeclaration(M, ID) - Create or insert an LLVM Function
  /// declaration for an intrinsic, and return it.
  ///
  /// The OverloadedTys parameter is for intrinsics with overloaded types
  /// (i.e., those using iAny, fAny, vAny, or iPTRAny).  For a declaration of
  /// an overloaded intrinsic, Tys must provide exactly one type for each
  /// overloaded type in the intrinsic in order of dst then srcs.
  ///
  /// For instance, consider the following overloaded function.
  ///    uint2 foo(size_t offset, int bar, const __global uint2 *p);
  ///    uint4 foo(size_t offset, int bar, const __global uint4 *p);
  /// Such a function has two overloaded type parameters: dst and src2.
  /// Thus the type array should two elements:
  ///    Type Ts[2]{int2, int2}: to resolve to the first instance.
  ///    Type Ts[2]{int4, int4}: to resolve to the second.
#if defined(ANDROID) || defined(__linux__)
  __attribute__ ((visibility ("default"))) Function *getDeclaration(Module *M, ID id, ArrayRef<Type*> OverloadedTys = None);
#else
  Function *getDeclaration(Module *M, ID id, ArrayRef<Type*> OverloadedTys = None);
#endif
  AttributeList getGenIntrinsicAttributes(LLVMContext& C, GenISAIntrinsic::ID id);

  //Override of isIntrinsic method defined in Function.h
  inline const char * getGenIntrinsicPrefix() { return "llvm.genx."; }
  inline bool isIntrinsic(const Function *CF)
  {
      return (CF->getName().startswith(getGenIntrinsicPrefix()));
  }
  ID getIntrinsicID(const Function *F);

} // namespace GenISAIntrinsic

} // namespace llvm

#endif //GENINTRINSICS_H