blob: 86dc9bd9ea74a30b73d94ab139e6ba04b9d37c53 [file] [log] [blame]
Matt Arsenaultc791f392014-06-23 18:00:31 +00001//===- AMDGPUIntrinsicInfo.cpp - AMDGPU Intrinsic Information ---*- C++ -*-===//
Tom Stellard75aadc22012-12-11 21:25:42 +00002//
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 Arsenaultc791f392014-06-23 18:00:31 +000015#include "AMDGPUIntrinsicInfo.h"
Tom Stellard75aadc22012-12-11 21:25:42 +000016#include "AMDGPUSubtarget.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000017#include "llvm/IR/DerivedTypes.h"
18#include "llvm/IR/Intrinsics.h"
19#include "llvm/IR/Module.h"
Tom Stellard75aadc22012-12-11 21:25:42 +000020
21using namespace llvm;
22
Eric Christopherac4b69e2014-07-25 22:22:39 +000023AMDGPUIntrinsicInfo::AMDGPUIntrinsicInfo()
Matt Arsenaultc791f392014-06-23 18:00:31 +000024 : TargetIntrinsicInfo() {}
Tom Stellard75aadc22012-12-11 21:25:42 +000025
Reid Kleckner1c93b4c2016-01-26 23:01:21 +000026static const char *const IntrinsicNameTable[] = {
Tom Stellard75aadc22012-12-11 21:25:42 +000027#define GET_INTRINSIC_NAME_TABLE
28#include "AMDGPUGenIntrinsics.inc"
29#undef GET_INTRINSIC_NAME_TABLE
Reid Kleckner1c93b4c2016-01-26 23:01:21 +000030};
Tom Stellard75aadc22012-12-11 21:25:42 +000031
Matt Arsenaulta1fe17c2016-07-19 23:16:53 +000032namespace {
33#define GET_INTRINSIC_ATTRIBUTES
34#include "AMDGPUGenIntrinsics.inc"
35#undef GET_INTRINSIC_ATTRIBUTES
36}
37
38StringRef AMDGPUIntrinsicInfo::getName(unsigned IntrID,
39 ArrayRef<Type *> Tys) const {
40 if (IntrID < Intrinsic::num_intrinsics)
41 return StringRef();
42
Matt Arsenaultc791f392014-06-23 18:00:31 +000043 assert(IntrID < AMDGPUIntrinsic::num_AMDGPU_intrinsics &&
44 "Invalid intrinsic ID");
Tom Stellard75aadc22012-12-11 21:25:42 +000045
Matt Arsenaulta1fe17c2016-07-19 23:16:53 +000046 return IntrinsicNameTable[IntrID - Intrinsic::num_intrinsics];
47}
48
49std::string AMDGPUIntrinsicInfo::getName(unsigned IntrID, Type **Tys,
50 unsigned NumTys) const {
51 return getName(IntrID, makeArrayRef(Tys, NumTys)).str();
52}
53
54FunctionType *AMDGPUIntrinsicInfo::getType(LLVMContext &Context, unsigned ID,
55 ArrayRef<Type*> Tys) const {
56 // FIXME: Re-use Intrinsic::getType machinery
Simon Pilgrim5fa1b9a2017-03-19 16:39:04 +000057 llvm_unreachable("unhandled intrinsic");
Tom Stellard75aadc22012-12-11 21:25:42 +000058}
59
Reid Kleckner1c93b4c2016-01-26 23:01:21 +000060unsigned AMDGPUIntrinsicInfo::lookupName(const char *NameData,
Matt Arsenaultc791f392014-06-23 18:00:31 +000061 unsigned Len) const {
Reid Kleckner1c93b4c2016-01-26 23:01:21 +000062 StringRef Name(NameData, Len);
63 if (!Name.startswith("llvm."))
Rafael Espindolaebd8e382013-05-22 14:57:42 +000064 return 0; // All intrinsics start with 'llvm.'
65
Reid Kleckner1c93b4c2016-01-26 23:01:21 +000066 // 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 Stellard75aadc22012-12-11 21:25:42 +000075 }
Reid Kleckner1c93b4c2016-01-26 23:01:21 +000076
Reid Kleckner5b463712016-01-27 01:43:12 +000077 return 0;
Tom Stellard75aadc22012-12-11 21:25:42 +000078}
79
Matt Arsenaultc791f392014-06-23 18:00:31 +000080bool AMDGPUIntrinsicInfo::isOverloaded(unsigned id) const {
81// Overload Table
Tom Stellard75aadc22012-12-11 21:25:42 +000082#define GET_INTRINSIC_OVERLOAD_TABLE
83#include "AMDGPUGenIntrinsics.inc"
84#undef GET_INTRINSIC_OVERLOAD_TABLE
85}
86
Matt Arsenaultc791f392014-06-23 18:00:31 +000087Function *AMDGPUIntrinsicInfo::getDeclaration(Module *M, unsigned IntrID,
Matt Arsenaulta1fe17c2016-07-19 23:16:53 +000088 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 Klecknerb5180542017-03-21 16:57:19 +000093 AttributeList AS =
94 getAttributes(M->getContext(), static_cast<AMDGPUIntrinsic::ID>(IntrID));
Matt Arsenaulta1fe17c2016-07-19 23:16:53 +000095 F->setAttributes(AS);
96 return F;
97}
98
99Function *AMDGPUIntrinsicInfo::getDeclaration(Module *M, unsigned IntrID,
Matt Arsenaultc791f392014-06-23 18:00:31 +0000100 Type **Tys,
Matt Arsenaulta1fe17c2016-07-19 23:16:53 +0000101 unsigned NumTys) const {
102 return getDeclaration(M, IntrID, makeArrayRef(Tys, NumTys));
Tom Stellard75aadc22012-12-11 21:25:42 +0000103}