blob: 791872a9db40e566d5024b2eb3c0f0535e2d70f6 [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
Reid Kleckner1c93b4c2016-01-26 23:01:21 +000032std::string AMDGPUIntrinsicInfo::getName(unsigned IntrID, Type **Tys,
33 unsigned numTys) const {
Tom Stellard75aadc22012-12-11 21:25:42 +000034 if (IntrID < Intrinsic::num_intrinsics) {
Craig Topper062a2ba2014-04-25 05:30:21 +000035 return nullptr;
Tom Stellard75aadc22012-12-11 21:25:42 +000036 }
Matt Arsenaultc791f392014-06-23 18:00:31 +000037 assert(IntrID < AMDGPUIntrinsic::num_AMDGPU_intrinsics &&
38 "Invalid intrinsic ID");
Tom Stellard75aadc22012-12-11 21:25:42 +000039
Reid Kleckner1c93b4c2016-01-26 23:01:21 +000040 std::string Result(IntrinsicNameTable[IntrID - Intrinsic::num_intrinsics]);
Tom Stellard75aadc22012-12-11 21:25:42 +000041 return Result;
42}
43
Reid Kleckner1c93b4c2016-01-26 23:01:21 +000044unsigned AMDGPUIntrinsicInfo::lookupName(const char *NameData,
Matt Arsenaultc791f392014-06-23 18:00:31 +000045 unsigned Len) const {
Reid Kleckner1c93b4c2016-01-26 23:01:21 +000046 StringRef Name(NameData, Len);
47 if (!Name.startswith("llvm."))
Rafael Espindolaebd8e382013-05-22 14:57:42 +000048 return 0; // All intrinsics start with 'llvm.'
49
Reid Kleckner1c93b4c2016-01-26 23:01:21 +000050 // Look for a name match in our table. If the intrinsic is not overloaded,
51 // require an exact match. If it is overloaded, require a prefix match. The
52 // AMDGPU enum enum starts at Intrinsic::num_intrinsics.
53 int Idx = Intrinsic::lookupLLVMIntrinsicByName(IntrinsicNameTable, Name);
54 if (Idx >= 0) {
55 bool IsPrefixMatch = Name.size() > strlen(IntrinsicNameTable[Idx]);
56 return IsPrefixMatch == isOverloaded(Idx + 1)
57 ? Intrinsic::num_intrinsics + Idx
58 : 0;
Tom Stellard75aadc22012-12-11 21:25:42 +000059 }
Reid Kleckner1c93b4c2016-01-26 23:01:21 +000060
Reid Kleckner5b463712016-01-27 01:43:12 +000061 return 0;
Tom Stellard75aadc22012-12-11 21:25:42 +000062}
63
Matt Arsenaultc791f392014-06-23 18:00:31 +000064bool AMDGPUIntrinsicInfo::isOverloaded(unsigned id) const {
65// Overload Table
Tom Stellard75aadc22012-12-11 21:25:42 +000066#define GET_INTRINSIC_OVERLOAD_TABLE
67#include "AMDGPUGenIntrinsics.inc"
68#undef GET_INTRINSIC_OVERLOAD_TABLE
69}
70
Matt Arsenaultc791f392014-06-23 18:00:31 +000071Function *AMDGPUIntrinsicInfo::getDeclaration(Module *M, unsigned IntrID,
72 Type **Tys,
73 unsigned numTys) const {
Tom Stellard6975d352012-12-13 19:38:52 +000074 llvm_unreachable("Not implemented");
Tom Stellard75aadc22012-12-11 21:25:42 +000075}