summaryrefslogtreecommitdiff
path: root/lib/VMCore
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2001-07-08 21:10:27 +0000
committerChris Lattner <sabre@nondot.org>2001-07-08 21:10:27 +0000
commit027dcc5b2249bc260f8bbf3fe5f6ce774054e671 (patch)
tree14f209003a2776cd602dbbb9eeeee56ab29b642c /lib/VMCore
parent71496b3b50cfcba84eb4acd988ce88a4463e4515 (diff)
downloadllvm-027dcc5b2249bc260f8bbf3fe5f6ce774054e671.tar.gz
llvm-027dcc5b2249bc260f8bbf3fe5f6ce774054e671.tar.bz2
llvm-027dcc5b2249bc260f8bbf3fe5f6ce774054e671.tar.xz
Implemented shl, shl, & load instructions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore')
-rw-r--r--lib/VMCore/iMemory.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/VMCore/iMemory.cpp b/lib/VMCore/iMemory.cpp
new file mode 100644
index 0000000000..41c14b04d5
--- /dev/null
+++ b/lib/VMCore/iMemory.cpp
@@ -0,0 +1,47 @@
+//===-- iMemory.cpp - Implement Memory instructions --------------*- C++ -*--=//
+//
+// This file implements the various memory related classes defined in iMemory.h
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/iMemory.h"
+#include "llvm/ConstPoolVals.h"
+
+const Type *LoadInst::getIndexedType(const Type *Ptr,
+ const vector<ConstPoolVal*> &Idx) {
+ if (!Ptr->isPointerType()) return 0; // Type isn't a pointer type!
+
+ // Get the type pointed to...
+ Ptr = ((const PointerType*)Ptr)->getValueType();
+
+ if (Ptr->isStructType()) {
+ unsigned CurIDX = 0;
+ while (Ptr->isStructType()) {
+ if (Idx.size() == CurIDX) return 0; // Can't load a whole structure!
+ if (Idx[CurIDX]->getType() != Type::UByteTy) return 0; // Illegal idx
+ unsigned NextIdx = ((ConstPoolUInt*)Idx[CurIDX++])->getValue();
+
+ const StructType *ST = (const StructType *)Ptr;
+ Ptr = ST->getElementTypes()[NextIdx];
+ }
+ return Ptr;
+ } else if (Ptr->isArrayType()) {
+ assert(0 && "Loading from arrays not implemented yet!");
+ } else {
+ return (Idx.size() == 0) ? Ptr : 0; // Load directly through ptr
+ }
+}
+
+
+LoadInst::LoadInst(Value *Ptr, const vector<ConstPoolVal*> &Idx,
+ const string &Name = "")
+ : Instruction(getIndexedType(Ptr->getType(), Idx), Load, Name) {
+ assert(getIndexedType(Ptr->getType(), Idx) && "Load operands invalid!");
+ assert(Ptr->getType()->isPointerType() && "Can't free nonpointer!");
+ Operands.reserve(1+Idx.size());
+ Operands.push_back(Use(Ptr, this));
+
+ for (unsigned i = 0, E = Idx.size(); i != E; ++i)
+ Operands.push_back(Use(Idx[i], this));
+}
+