diff options
author | Nadav Rotem <nrotem@apple.com> | 2013-04-01 15:53:30 +0000 |
---|---|---|
committer | Nadav Rotem <nrotem@apple.com> | 2013-04-01 15:53:30 +0000 |
commit | be79a7ac7abd3f7d346876b0c413579264408f00 (patch) | |
tree | 3a53dbb2329758c5acebd02d649d2c707e3f2632 /llvm/lib/ExecutionEngine/Interpreter/Execution.cpp | |
parent | 60c75107114cd2d770bf1c5aebc81c42f3f045cc (diff) | |
download | llvm-be79a7ac7abd3f7d346876b0c413579264408f00.zip llvm-be79a7ac7abd3f7d346876b0c413579264408f00.tar.gz llvm-be79a7ac7abd3f7d346876b0c413579264408f00.tar.bz2 |
Add support for vector data types in the LLVM interpreter.
Patch by:
Veselov, Yuri <Yuri.Veselov@intel.com>
llvm-svn: 178469
Diffstat (limited to 'llvm/lib/ExecutionEngine/Interpreter/Execution.cpp')
-rw-r--r-- | llvm/lib/ExecutionEngine/Interpreter/Execution.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/llvm/lib/ExecutionEngine/Interpreter/Execution.cpp b/llvm/lib/ExecutionEngine/Interpreter/Execution.cpp index ec4f7f6..526c04e 100644 --- a/llvm/lib/ExecutionEngine/Interpreter/Execution.cpp +++ b/llvm/lib/ExecutionEngine/Interpreter/Execution.cpp @@ -1187,6 +1187,39 @@ void Interpreter::visitVAArgInst(VAArgInst &I) { ++VAList.UIntPairVal.second; } +void Interpreter::visitExtractElementInst(ExtractElementInst &I) { + ExecutionContext &SF = ECStack.back(); + GenericValue Src1 = getOperandValue(I.getOperand(0), SF); + GenericValue Src2 = getOperandValue(I.getOperand(1), SF); + GenericValue Dest; + + Type *Ty = I.getType(); + const unsigned indx = unsigned(Src2.IntVal.getZExtValue()); + + if(Src1.AggregateVal.size() > indx) { + switch (Ty->getTypeID()) { + default: + dbgs() << "Unhandled destination type for extractelement instruction: " + << *Ty << "\n"; + llvm_unreachable(0); + break; + case Type::IntegerTyID: + Dest.IntVal = Src1.AggregateVal[indx].IntVal; + break; + case Type::FloatTyID: + Dest.FloatVal = Src1.AggregateVal[indx].FloatVal; + break; + case Type::DoubleTyID: + Dest.DoubleVal = Src1.AggregateVal[indx].DoubleVal; + break; + } + } else { + dbgs() << "Invalid index in extractelement instruction\n"; + } + + SetValue(&I, Dest, SF); +} + GenericValue Interpreter::getConstantExprValue (ConstantExpr *CE, ExecutionContext &SF) { switch (CE->getOpcode()) { |