Index: src/IceIntrinsics.cpp |
diff --git a/src/IceIntrinsics.cpp b/src/IceIntrinsics.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..327fff8bc279e06f39913dac61fc3afc4f8738be |
--- /dev/null |
+++ b/src/IceIntrinsics.cpp |
@@ -0,0 +1,90 @@ |
+//===- subzero/src/IceIntrinsics.cpp - Functions related to intrinsics ----===// |
+// |
+// The Subzero Code Generator |
+// |
+// This file is distributed under the University of Illinois Open Source |
+// License. See LICENSE.TXT for details. |
+// |
+//===----------------------------------------------------------------------===// |
+// |
+// This file implements the Intrinsics utilities for matching and |
+// then dispatching by name. |
+// |
+//===----------------------------------------------------------------------===// |
+ |
+#include "IceCfg.h" |
+#include "IceCfgNode.h" |
+#include "IceIntrinsics.h" |
+#include "IceLiveness.h" |
+#include "IceOperand.h" |
+ |
+#include <utility> |
+ |
+namespace Ice { |
+ |
+const IntrinsicInfo UnknownIntrinsicInfo = { UnknownIntrinsic, false }; |
+ |
+bool operator==(const IntrinsicInfo &A, const IntrinsicInfo &B) { |
+ return A.ID == B.ID && A.HasSideEffects == B.HasSideEffects; |
+} |
+ |
+namespace { |
+ |
+// TODO(jvoung): vet and test the HasSideEffects attributes. |
+// Reduce the amount of duplication for overloaded intrinsics. |
+const struct IceIntrinsicsEntry_ { |
+ IntrinsicInfo Info; |
+ const char *IntrinsicName; |
+} IceIntrinsicsTable [] = { |
+ { {AtomicCmpxchg, true}, "nacl.atomic.cmpxchg.i8" }, |
+ { {AtomicCmpxchg, true}, "nacl.atomic.cmpxchg.i16" }, |
+ { {AtomicCmpxchg, true}, "nacl.atomic.cmpxchg.i32" }, |
+ { {AtomicCmpxchg, true}, "nacl.atomic.cmpxchg.i64" }, |
+ { {AtomicFence, true}, "nacl.atomic.fence"}, |
+ { {AtomicFenceAll, true}, "nacl.atomic.fence.all" }, |
+ { {AtomicIsLockFree, true}, "nacl.atomic.is.lock.free" }, |
+ { {AtomicLoad, true}, "nacl.atomic.load.i8" }, |
+ { {AtomicLoad, true}, "nacl.atomic.load.i16" }, |
+ { {AtomicLoad, true}, "nacl.atomic.load.i32" }, |
+ { {AtomicLoad, true}, "nacl.atomic.load.i64" }, |
+ { {AtomicRMW, true}, "nacl.atomic.rmw.i8" }, |
+ { {AtomicRMW, true}, "nacl.atomic.rmw.i16" }, |
+ { {AtomicRMW, true}, "nacl.atomic.rmw.i32" }, |
+ { {AtomicRMW, true}, "nacl.atomic.rmw.i64" }, |
+ { {AtomicStore, true}, "nacl.atomic.store.i8" }, |
+ { {AtomicStore, true}, "nacl.atomic.store.i16" }, |
+ { {AtomicStore, true}, "nacl.atomic.store.i32" }, |
+ { {AtomicStore, true}, "nacl.atomic.store.i64" }, |
+ { {Bswap, false}, "bswap.i16" }, |
+ { {Bswap, false}, "bswap.i32" }, |
+ { {Bswap, false}, "bswap.i64" }, |
+ { {Ctlz, false}, "ctlz.i32" }, |
+ { {Ctlz, false}, "ctlz.i64" }, |
+ { {Ctpop, false}, "ctpop.i32" }, |
+ { {Ctpop, false}, "ctpop.i64" }, |
+ { {Cttz, false}, "cttz.i32" }, |
+ { {Cttz, false}, "cttz.i64" }, |
+ { {Longjmp, true}, "nacl.longjmp" }, |
+ { {Memcpy, true}, "memcpy.p0i8.p0i8.i32" }, |
+ { {Memmove, true}, "memmove.p0i8.p0i8.i32" }, |
+ { {Memset, true}, "memset.p0i8.i32" }, |
+ { {NaClReadTP, false}, "nacl.read.tp" }, |
+ { {Setjmp, true}, "nacl.setjmp" }, |
+ { {Sqrt, false}, "sqrt.f32" }, |
+ { {Sqrt, false}, "sqrt.f64" }, |
+ { {Stacksave, true}, "stacksave" }, |
+ { {Stackrestore, true}, "stackrestore" }, |
+ { {Trap, true}, "trap" } |
+}; |
+const size_t IceIntrinsicsTableSize = llvm::array_lengthof(IceIntrinsicsTable); |
+ |
+} // end of namespace |
+ |
+void BuildIntrinsicMap(IntrinsicMap *OutMap) { |
+ for (size_t I = 0; I < IceIntrinsicsTableSize; ++I) { |
+ const struct IceIntrinsicsEntry_ &Entry = IceIntrinsicsTable[I]; |
+ OutMap->insert(std::make_pair(IceString(Entry.IntrinsicName), Entry.Info)); |
+ } |
+} |
+ |
+} // end of namespace Ice |