OLD | NEW |
---|---|
(Empty) | |
1 //===-- llvm/IR/NaClIntrinsics.cpp - NaCl Intrinsics ------------*- C++ -*-===// | |
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 // This file describes intrinsic functions that are specific to NaCl. | |
11 // | |
12 //===----------------------------------------------------------------------===// | |
13 | |
14 #include "llvm/IR/DerivedTypes.h" | |
15 #include "llvm/IR/NaClIntrinsics.h" | |
16 #include "llvm/IR/Type.h" | |
17 | |
18 namespace llvm { | |
19 | |
20 namespace NaCl { | |
21 | |
22 AtomicIntrinsics::AtomicIntrinsics(LLVMContext &C) { | |
23 Type *IT[NumAtomicIntrinsicTypes] = { Type::getInt8Ty(C), Type::getInt16Ty(C), | |
24 Type::getInt32Ty(C), | |
25 Type::getInt64Ty(C) }; | |
26 size_t CurIntrin = 0; | |
27 | |
28 #define INIT(P0, P1, P2, P3, P4, INTRIN) \ | |
eliben
2013/07/03 16:06:05
Comment to explain what's going on
JF
2013/07/03 20:58:35
Done.
| |
29 do { \ | |
30 for (size_t CurType = 0; CurType != NumAtomicIntrinsicTypes; ++CurType) { \ | |
31 size_t Param = 0; \ | |
32 I[CurIntrin][CurType].OverloadedType = IT[CurType]; \ | |
33 I[CurIntrin][CurType].ID = Intrinsic::nacl_atomic_##INTRIN; \ | |
34 I[CurIntrin][CurType].Overloaded = \ | |
35 P0 == Int || P0 == Ptr || P1 == Int || P1 == Ptr || P2 == Int || \ | |
36 P2 == Ptr || P3 == Int || P3 == Ptr || P4 == Int || P4 == Ptr; \ | |
37 I[CurIntrin][CurType].NumParams = \ | |
38 (P0 != NoP) + (P1 != NoP) + (P2 != NoP) + (P3 != NoP) + (P4 != NoP); \ | |
39 I[CurIntrin][CurType].ParamType[Param++] = P0; \ | |
40 I[CurIntrin][CurType].ParamType[Param++] = P1; \ | |
41 I[CurIntrin][CurType].ParamType[Param++] = P2; \ | |
42 I[CurIntrin][CurType].ParamType[Param++] = P3; \ | |
43 I[CurIntrin][CurType].ParamType[Param++] = P4; \ | |
44 } \ | |
45 ++CurIntrin; \ | |
46 } while (0) | |
47 | |
48 INIT(Ptr, Mem, NoP, NoP, NoP, load); | |
49 INIT(Ptr, Int, Mem, NoP, NoP, store); | |
50 INIT(RMW, Ptr, Int, Mem, NoP, rmw); | |
51 INIT(Ptr, Int, Int, Mem, Mem, cmpxchg); | |
52 INIT(Mem, NoP, NoP, NoP, NoP, fence); | |
53 } | |
54 | |
55 AtomicIntrinsics::const_iterator AtomicIntrinsics::begin() const { | |
56 return &I[0][0]; | |
57 } | |
58 | |
59 AtomicIntrinsics::const_iterator AtomicIntrinsics::end() const { | |
60 return begin().I + NumAtomicIntrinsics * NumAtomicIntrinsicTypes; | |
61 } | |
62 | |
63 AtomicIntrinsics::const_iterator | |
64 AtomicIntrinsics::begin(Intrinsic::ID ID) const { | |
65 for (const AtomicIntrinsic *AI = begin().I; AI != end().I; ++AI) | |
66 if (AI->ID == ID) | |
67 return const_iterator(AI); | |
68 llvm_unreachable("unhandled atomic intrinsic"); | |
69 } | |
70 | |
71 AtomicIntrinsics::const_iterator AtomicIntrinsics::end(Intrinsic::ID ID) const { | |
72 for (const AtomicIntrinsic *AI = end().I; AI != begin().I; --AI) | |
73 if ((AI - 1)->ID == ID) | |
74 return const_iterator(AI); | |
75 llvm_unreachable("unhandled atomic intrinsic"); | |
76 } | |
77 | |
78 AtomicIntrinsics::const_iterator | |
79 AtomicIntrinsics::find(Intrinsic::ID ID, Type *OverloadedType) const { | |
80 for (const AtomicIntrinsic *AI = begin().I; AI != end().I; ++AI) | |
81 if (AI->ID == ID && AI->OverloadedType == OverloadedType) | |
82 return const_iterator(AI); | |
83 llvm_unreachable("unhandled atomic intrinsic"); | |
84 } | |
85 | |
86 } // End NaCl namespace | |
87 | |
88 } // End llvm namespace | |
OLD | NEW |