blob: 91aaf940e6269ed46d22ee11c18d1f70519bee0e [file] [log] [blame]
Jia Liu31d157a2012-02-18 12:03:15 +00001//===-- MBlazeIntrinsicInfo.cpp - Intrinsic Information -------------------===//
Wesley Pecka70f28c2010-02-23 19:15:24 +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// This file contains the MBlaze implementation of TargetIntrinsicInfo.
11//
12//===----------------------------------------------------------------------===//
13
14#include "MBlazeIntrinsicInfo.h"
15#include "llvm/DerivedTypes.h"
16#include "llvm/Function.h"
17#include "llvm/Intrinsics.h"
18#include "llvm/Module.h"
19#include "llvm/Type.h"
20#include "llvm/Support/raw_ostream.h"
Craig Topper655b8de2012-02-05 07:21:30 +000021#include "llvm/Support/ErrorHandling.h"
Wesley Pecka70f28c2010-02-23 19:15:24 +000022#include <cstring>
23
24using namespace llvm;
25
26namespace mblazeIntrinsic {
27
28 enum ID {
29 last_non_mblaze_intrinsic = Intrinsic::num_intrinsics-1,
30#define GET_INTRINSIC_ENUM_VALUES
31#include "MBlazeGenIntrinsics.inc"
32#undef GET_INTRINSIC_ENUM_VALUES
33 , num_mblaze_intrinsics
34 };
35
Wesley Peck173c5c42010-02-24 20:16:27 +000036#define GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
37#include "MBlazeGenIntrinsics.inc"
38#undef GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
Wesley Pecka70f28c2010-02-23 19:15:24 +000039}
40
Chris Lattnerdb125cf2011-07-18 04:54:35 +000041std::string MBlazeIntrinsicInfo::getName(unsigned IntrID, Type **Tys,
Wesley Pecka70f28c2010-02-23 19:15:24 +000042 unsigned numTys) const {
43 static const char *const names[] = {
44#define GET_INTRINSIC_NAME_TABLE
45#include "MBlazeGenIntrinsics.inc"
46#undef GET_INTRINSIC_NAME_TABLE
47 };
48
49 assert(!isOverloaded(IntrID) && "MBlaze intrinsics are not overloaded");
50 if (IntrID < Intrinsic::num_intrinsics)
51 return 0;
Wesley Peck0a67d922010-11-08 19:40:01 +000052 assert(IntrID < mblazeIntrinsic::num_mblaze_intrinsics &&
Wesley Pecka70f28c2010-02-23 19:15:24 +000053 "Invalid intrinsic ID");
54
55 std::string Result(names[IntrID - Intrinsic::num_intrinsics]);
56 return Result;
57}
58
59unsigned MBlazeIntrinsicInfo::
60lookupName(const char *Name, unsigned Len) const {
Bob Wilson35ee7d62010-03-18 16:52:15 +000061 if (Len < 5 || Name[4] != '.' || Name[0] != 'l' || Name[1] != 'l'
62 || Name[2] != 'v' || Name[3] != 'm')
63 return 0; // All intrinsics start with 'llvm.'
64
Wesley Pecka70f28c2010-02-23 19:15:24 +000065#define GET_FUNCTION_RECOGNIZER
66#include "MBlazeGenIntrinsics.inc"
67#undef GET_FUNCTION_RECOGNIZER
68 return 0;
69}
70
Wesley Peck173c5c42010-02-24 20:16:27 +000071unsigned MBlazeIntrinsicInfo::
72lookupGCCName(const char *Name) const {
73 return mblazeIntrinsic::getIntrinsicForGCCBuiltin("mblaze",Name);
74}
75
Wesley Pecka70f28c2010-02-23 19:15:24 +000076bool MBlazeIntrinsicInfo::isOverloaded(unsigned IntrID) const {
Benjamin Kramer36a21382012-03-01 02:16:57 +000077 if (IntrID == 0)
78 return false;
79
80 unsigned id = IntrID - Intrinsic::num_intrinsics + 1;
Wesley Pecka70f28c2010-02-23 19:15:24 +000081#define GET_INTRINSIC_OVERLOAD_TABLE
82#include "MBlazeGenIntrinsics.inc"
83#undef GET_INTRINSIC_OVERLOAD_TABLE
Wesley Pecka70f28c2010-02-23 19:15:24 +000084}
85
86/// This defines the "getAttributes(ID id)" method.
87#define GET_INTRINSIC_ATTRIBUTES
88#include "MBlazeGenIntrinsics.inc"
89#undef GET_INTRINSIC_ATTRIBUTES
90
Chris Lattnerdb125cf2011-07-18 04:54:35 +000091static FunctionType *getType(LLVMContext &Context, unsigned id) {
92 Type *ResultTy = NULL;
Benjamin Kramerd2c6ff12011-10-17 21:33:26 +000093 SmallVector<Type*, 8> ArgTys;
Wesley Pecka70f28c2010-02-23 19:15:24 +000094 bool IsVarArg = false;
Wesley Peck0a67d922010-11-08 19:40:01 +000095
Wesley Pecka70f28c2010-02-23 19:15:24 +000096#define GET_INTRINSIC_GENERATOR
97#include "MBlazeGenIntrinsics.inc"
98#undef GET_INTRINSIC_GENERATOR
99
Wesley Peck0a67d922010-11-08 19:40:01 +0000100 return FunctionType::get(ResultTy, ArgTys, IsVarArg);
Wesley Pecka70f28c2010-02-23 19:15:24 +0000101}
102
103Function *MBlazeIntrinsicInfo::getDeclaration(Module *M, unsigned IntrID,
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000104 Type **Tys,
Wesley Pecka70f28c2010-02-23 19:15:24 +0000105 unsigned numTy) const {
106 assert(!isOverloaded(IntrID) && "MBlaze intrinsics are not overloaded");
107 AttrListPtr AList = getAttributes((mblazeIntrinsic::ID) IntrID);
108 return cast<Function>(M->getOrInsertFunction(getName(IntrID),
109 getType(M->getContext(), IntrID),
110 AList));
111}