| Matt Arsenault | c791f39 | 2014-06-23 18:00:31 +0000 | [diff] [blame] | 1 | //===- AMDGPUIntrinsicInfo.cpp - AMDGPU Intrinsic Information ---*- C++ -*-===// | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 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 | /// \file | 
|  | 11 | /// \brief AMDGPU Implementation of the IntrinsicInfo class. | 
|  | 12 | // | 
|  | 13 | //===-----------------------------------------------------------------------===// | 
|  | 14 |  | 
| Matt Arsenault | c791f39 | 2014-06-23 18:00:31 +0000 | [diff] [blame] | 15 | #include "AMDGPUIntrinsicInfo.h" | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 16 | #include "AMDGPUSubtarget.h" | 
| Chandler Carruth | 9fb823b | 2013-01-02 11:36:10 +0000 | [diff] [blame] | 17 | #include "llvm/IR/DerivedTypes.h" | 
|  | 18 | #include "llvm/IR/Intrinsics.h" | 
|  | 19 | #include "llvm/IR/Module.h" | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 20 |  | 
|  | 21 | using namespace llvm; | 
|  | 22 |  | 
| Eric Christopher | ac4b69e | 2014-07-25 22:22:39 +0000 | [diff] [blame] | 23 | AMDGPUIntrinsicInfo::AMDGPUIntrinsicInfo() | 
| Matt Arsenault | c791f39 | 2014-06-23 18:00:31 +0000 | [diff] [blame] | 24 | : TargetIntrinsicInfo() {} | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 25 |  | 
| Reid Kleckner | 1c93b4c | 2016-01-26 23:01:21 +0000 | [diff] [blame] | 26 | static const char *const IntrinsicNameTable[] = { | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 27 | #define GET_INTRINSIC_NAME_TABLE | 
|  | 28 | #include "AMDGPUGenIntrinsics.inc" | 
|  | 29 | #undef GET_INTRINSIC_NAME_TABLE | 
| Reid Kleckner | 1c93b4c | 2016-01-26 23:01:21 +0000 | [diff] [blame] | 30 | }; | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 31 |  | 
| Matt Arsenault | a1fe17c | 2016-07-19 23:16:53 +0000 | [diff] [blame] | 32 | namespace { | 
|  | 33 | #define GET_INTRINSIC_ATTRIBUTES | 
|  | 34 | #include "AMDGPUGenIntrinsics.inc" | 
|  | 35 | #undef GET_INTRINSIC_ATTRIBUTES | 
|  | 36 | } | 
|  | 37 |  | 
|  | 38 | StringRef AMDGPUIntrinsicInfo::getName(unsigned IntrID, | 
|  | 39 | ArrayRef<Type *> Tys) const { | 
|  | 40 | if (IntrID < Intrinsic::num_intrinsics) | 
|  | 41 | return StringRef(); | 
|  | 42 |  | 
| Matt Arsenault | c791f39 | 2014-06-23 18:00:31 +0000 | [diff] [blame] | 43 | assert(IntrID < AMDGPUIntrinsic::num_AMDGPU_intrinsics && | 
|  | 44 | "Invalid intrinsic ID"); | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 45 |  | 
| Matt Arsenault | a1fe17c | 2016-07-19 23:16:53 +0000 | [diff] [blame] | 46 | return IntrinsicNameTable[IntrID - Intrinsic::num_intrinsics]; | 
|  | 47 | } | 
|  | 48 |  | 
|  | 49 | std::string AMDGPUIntrinsicInfo::getName(unsigned IntrID, Type **Tys, | 
|  | 50 | unsigned NumTys) const { | 
|  | 51 | return getName(IntrID, makeArrayRef(Tys, NumTys)).str(); | 
|  | 52 | } | 
|  | 53 |  | 
|  | 54 | FunctionType *AMDGPUIntrinsicInfo::getType(LLVMContext &Context, unsigned ID, | 
|  | 55 | ArrayRef<Type*> Tys) const { | 
|  | 56 | // FIXME: Re-use Intrinsic::getType machinery | 
| Simon Pilgrim | 5fa1b9a | 2017-03-19 16:39:04 +0000 | [diff] [blame] | 57 | llvm_unreachable("unhandled intrinsic"); | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 58 | } | 
|  | 59 |  | 
| Reid Kleckner | 1c93b4c | 2016-01-26 23:01:21 +0000 | [diff] [blame] | 60 | unsigned AMDGPUIntrinsicInfo::lookupName(const char *NameData, | 
| Matt Arsenault | c791f39 | 2014-06-23 18:00:31 +0000 | [diff] [blame] | 61 | unsigned Len) const { | 
| Reid Kleckner | 1c93b4c | 2016-01-26 23:01:21 +0000 | [diff] [blame] | 62 | StringRef Name(NameData, Len); | 
|  | 63 | if (!Name.startswith("llvm.")) | 
| Rafael Espindola | ebd8e38 | 2013-05-22 14:57:42 +0000 | [diff] [blame] | 64 | return 0; // All intrinsics start with 'llvm.' | 
|  | 65 |  | 
| Reid Kleckner | 1c93b4c | 2016-01-26 23:01:21 +0000 | [diff] [blame] | 66 | // Look for a name match in our table.  If the intrinsic is not overloaded, | 
|  | 67 | // require an exact match. If it is overloaded, require a prefix match. The | 
|  | 68 | // AMDGPU enum enum starts at Intrinsic::num_intrinsics. | 
|  | 69 | int Idx = Intrinsic::lookupLLVMIntrinsicByName(IntrinsicNameTable, Name); | 
|  | 70 | if (Idx >= 0) { | 
|  | 71 | bool IsPrefixMatch = Name.size() > strlen(IntrinsicNameTable[Idx]); | 
|  | 72 | return IsPrefixMatch == isOverloaded(Idx + 1) | 
|  | 73 | ? Intrinsic::num_intrinsics + Idx | 
|  | 74 | : 0; | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 75 | } | 
| Reid Kleckner | 1c93b4c | 2016-01-26 23:01:21 +0000 | [diff] [blame] | 76 |  | 
| Reid Kleckner | 5b46371 | 2016-01-27 01:43:12 +0000 | [diff] [blame] | 77 | return 0; | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 78 | } | 
|  | 79 |  | 
| Matt Arsenault | c791f39 | 2014-06-23 18:00:31 +0000 | [diff] [blame] | 80 | bool AMDGPUIntrinsicInfo::isOverloaded(unsigned id) const { | 
|  | 81 | // Overload Table | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 82 | #define GET_INTRINSIC_OVERLOAD_TABLE | 
|  | 83 | #include "AMDGPUGenIntrinsics.inc" | 
|  | 84 | #undef GET_INTRINSIC_OVERLOAD_TABLE | 
|  | 85 | } | 
|  | 86 |  | 
| Matt Arsenault | c791f39 | 2014-06-23 18:00:31 +0000 | [diff] [blame] | 87 | Function *AMDGPUIntrinsicInfo::getDeclaration(Module *M, unsigned IntrID, | 
| Matt Arsenault | a1fe17c | 2016-07-19 23:16:53 +0000 | [diff] [blame] | 88 | ArrayRef<Type *> Tys) const { | 
|  | 89 | FunctionType *FTy = getType(M->getContext(), IntrID, Tys); | 
|  | 90 | Function *F | 
|  | 91 | = cast<Function>(M->getOrInsertFunction(getName(IntrID, Tys), FTy)); | 
|  | 92 |  | 
| Reid Kleckner | b518054 | 2017-03-21 16:57:19 +0000 | [diff] [blame] | 93 | AttributeList AS = | 
|  | 94 | getAttributes(M->getContext(), static_cast<AMDGPUIntrinsic::ID>(IntrID)); | 
| Matt Arsenault | a1fe17c | 2016-07-19 23:16:53 +0000 | [diff] [blame] | 95 | F->setAttributes(AS); | 
|  | 96 | return F; | 
|  | 97 | } | 
|  | 98 |  | 
|  | 99 | Function *AMDGPUIntrinsicInfo::getDeclaration(Module *M, unsigned IntrID, | 
| Matt Arsenault | c791f39 | 2014-06-23 18:00:31 +0000 | [diff] [blame] | 100 | Type **Tys, | 
| Matt Arsenault | a1fe17c | 2016-07-19 23:16:53 +0000 | [diff] [blame] | 101 | unsigned NumTys) const { | 
|  | 102 | return getDeclaration(M, IntrID, makeArrayRef(Tys, NumTys)); | 
| Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 103 | } |