| OLD | NEW |
| 1 //===- subzero/src/IceIntrinsics.h - List of Ice Intrinsics -----*- C++ -*-===// | 1 //===- subzero/src/IceIntrinsics.h - List of Ice Intrinsics -----*- C++ -*-===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 // This file declares the kinds of intrinsics supported by PNaCl. | 10 // This file declares the kinds of intrinsics supported by PNaCl. |
| 11 // | 11 // |
| 12 //===----------------------------------------------------------------------===// | 12 //===----------------------------------------------------------------------===// |
| 13 | 13 |
| 14 #ifndef SUBZERO_SRC_ICEINTRINSICS_H | 14 #ifndef SUBZERO_SRC_ICEINTRINSICS_H |
| 15 #define SUBZERO_SRC_ICEINTRINSICS_H | 15 #define SUBZERO_SRC_ICEINTRINSICS_H |
| 16 | 16 |
| 17 #include "IceDefs.h" | 17 #include "IceDefs.h" |
| 18 #include "IceTypes.h" | 18 #include "IceTypes.h" |
| 19 | 19 |
| 20 namespace Ice { | 20 namespace Ice { |
| 21 | 21 |
| 22 class InstCall; |
| 23 |
| 22 static const size_t kMaxIntrinsicParameters = 6; | 24 static const size_t kMaxIntrinsicParameters = 6; |
| 23 | 25 |
| 24 class Intrinsics { | 26 class Intrinsics { |
| 25 public: | 27 public: |
| 26 Intrinsics(); | 28 Intrinsics(); |
| 27 ~Intrinsics(); | 29 ~Intrinsics(); |
| 28 | 30 |
| 29 // Some intrinsics allow overloading by type. This enum collapses all | 31 // Some intrinsics allow overloading by type. This enum collapses all |
| 30 // overloads into a single ID, but the type can still be recovered by the | 32 // overloads into a single ID, but the type can still be recovered by the |
| 31 // type of the intrinsic function call's return value and parameters. | 33 // type of the intrinsic function call's return value and parameters. |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 // Basic attributes related to each intrinsic, that are relevant to | 103 // Basic attributes related to each intrinsic, that are relevant to |
| 102 // code generation. Perhaps the attributes representation can be shared | 104 // code generation. Perhaps the attributes representation can be shared |
| 103 // with general function calls, but PNaCl currently strips all | 105 // with general function calls, but PNaCl currently strips all |
| 104 // attributes from functions. | 106 // attributes from functions. |
| 105 struct IntrinsicInfo { | 107 struct IntrinsicInfo { |
| 106 enum IntrinsicID ID : 30; | 108 enum IntrinsicID ID : 30; |
| 107 enum SideEffects HasSideEffects : 1; | 109 enum SideEffects HasSideEffects : 1; |
| 108 enum ReturnsTwice ReturnsTwice : 1; | 110 enum ReturnsTwice ReturnsTwice : 1; |
| 109 }; | 111 }; |
| 110 | 112 |
| 113 // The types of validation values for FullIntrinsicInfo.validateCall. |
| 114 enum ValidateCallValue { |
| 115 IsValidCall, // Valid use of instrinsic call. |
| 116 BadReturnType, // Return type invalid for intrinsic. |
| 117 WrongNumOfArgs, // Wrong number of arguments for intrinsic. |
| 118 WrongCallArgType, // Argument of wrong type. |
| 119 }; |
| 120 |
| 111 // The complete set of information about an intrinsic. | 121 // The complete set of information about an intrinsic. |
| 112 struct FullIntrinsicInfo { | 122 struct FullIntrinsicInfo { |
| 113 struct IntrinsicInfo Info; // Information that CodeGen would care about. | 123 struct IntrinsicInfo Info; // Information that CodeGen would care about. |
| 114 | 124 |
| 115 // Sanity check during parsing. | 125 // Sanity check during parsing. |
| 116 Type Signature[kMaxIntrinsicParameters]; | 126 Type Signature[kMaxIntrinsicParameters]; |
| 117 uint8_t NumTypes; | 127 uint8_t NumTypes; |
| 128 |
| 129 // Validates that type signature of call matches intrinsic. |
| 130 // If WrongArgumentType is returned, ArgIndex is set to corresponding |
| 131 // argument index. |
| 132 ValidateCallValue validateCall(const Ice::InstCall *Call, |
| 133 SizeT &ArgIndex) const; |
| 134 |
| 135 // Validates that type signature of call matches intrinsic. |
| 136 ValidateCallValue validateCall(const Ice::InstCall *Call) const { |
| 137 SizeT ArgIndexIgnore; |
| 138 return validateCall(Call, ArgIndexIgnore); |
| 139 } |
| 140 |
| 141 // Returns the return type of the intrinsic. |
| 142 Type getReturnType() const { |
| 143 assert(NumTypes > 1); |
| 144 return Signature[0]; |
| 145 } |
| 146 |
| 147 // Returns number of arguments expected. |
| 148 SizeT getNumArgs() const { |
| 149 assert(NumTypes > 1); |
| 150 return NumTypes - 1; |
| 151 } |
| 152 |
| 153 // Returns type of Index-th argument. |
| 154 Type getArgType(SizeT Index) const; |
| 118 }; | 155 }; |
| 119 | 156 |
| 120 // Find the information about a given intrinsic, based on function name. | 157 // Find the information about a given intrinsic, based on function name. |
| 121 // The function name is expected to have the common "llvm." prefix | 158 // The function name is expected to have the common "llvm." prefix |
| 122 // stripped. If found, returns a reference to a FullIntrinsicInfo entry | 159 // stripped. If found, returns a reference to a FullIntrinsicInfo entry |
| 123 // (valid for the lifetime of the map). Otherwise returns null. | 160 // (valid for the lifetime of the map). Otherwise returns null. |
| 124 const FullIntrinsicInfo *find(const IceString &Name) const; | 161 const FullIntrinsicInfo *find(const IceString &Name) const; |
| 125 | 162 |
| 126 private: | 163 private: |
| 127 // TODO(jvoung): May want to switch to something like LLVM's StringMap. | 164 // TODO(jvoung): May want to switch to something like LLVM's StringMap. |
| 128 typedef std::map<IceString, FullIntrinsicInfo> IntrinsicMap; | 165 typedef std::map<IceString, FullIntrinsicInfo> IntrinsicMap; |
| 129 IntrinsicMap map; | 166 IntrinsicMap map; |
| 130 | 167 |
| 131 Intrinsics(const Intrinsics &) LLVM_DELETED_FUNCTION; | 168 Intrinsics(const Intrinsics &) LLVM_DELETED_FUNCTION; |
| 132 Intrinsics &operator=(const Intrinsics &) LLVM_DELETED_FUNCTION; | 169 Intrinsics &operator=(const Intrinsics &) LLVM_DELETED_FUNCTION; |
| 133 }; | 170 }; |
| 134 | 171 |
| 135 } // end of namespace Ice | 172 } // end of namespace Ice |
| 136 | 173 |
| 137 #endif // SUBZERO_SRC_ICEINTRINSICS_H | 174 #endif // SUBZERO_SRC_ICEINTRINSICS_H |
| OLD | NEW |