aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Bocchino <bocchino@illinois.edu>2006-01-10 19:04:13 +0000
committerRobert Bocchino <bocchino@illinois.edu>2006-01-10 19:04:13 +0000
commit49b78a569609881811d905960baa7dd1ab801383 (patch)
tree7b70bc80f70d5e57c72c8ac49a81328b739ecfce
parenteb7116bb08a99897c69570a3789af97343bff9f2 (diff)
downloadexternal_llvm-49b78a569609881811d905960baa7dd1ab801383.zip
external_llvm-49b78a569609881811d905960baa7dd1ab801383.tar.gz
external_llvm-49b78a569609881811d905960baa7dd1ab801383.tar.bz2
Added an instruction and constant expression for the extractelement
operation. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25176 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Constants.h6
-rw-r--r--include/llvm/Instruction.def3
-rw-r--r--include/llvm/Instructions.h46
-rw-r--r--include/llvm/Support/InstVisitor.h1
4 files changed, 55 insertions, 1 deletions
diff --git a/include/llvm/Constants.h b/include/llvm/Constants.h
index 4a749ab..f5fcd4e 100644
--- a/include/llvm/Constants.h
+++ b/include/llvm/Constants.h
@@ -521,6 +521,8 @@ protected:
Constant *C1, Constant *C2, Constant *C3);
static Constant *getGetElementPtrTy(const Type *Ty, Constant *C,
const std::vector<Value*> &IdxList);
+ static Constant *getExtractElementTy(const Type *Ty, Constant *Val,
+ Constant *Idx);
public:
// Static methods to construct a ConstantExpr of different kinds. Note that
@@ -588,6 +590,10 @@ public:
static Constant *getGetElementPtr(Constant *C,
const std::vector<Value*> &IdxList);
+ /// Extractelement form.
+ ///
+ static Constant *getExtractElement(Constant *Val, Constant *Idx);
+
/// isNullValue - Return true if this is the value that would be returned by
/// getNullValue.
virtual bool isNullValue() const { return false; }
diff --git a/include/llvm/Instruction.def b/include/llvm/Instruction.def
index 48a458c..3c22a9b 100644
--- a/include/llvm/Instruction.def
+++ b/include/llvm/Instruction.def
@@ -135,7 +135,8 @@ HANDLE_OTHER_INST(34, Select , SelectInst ) // select instruction
HANDLE_OTHER_INST(35, UserOp1, Instruction) // May be used internally in a pass
HANDLE_OTHER_INST(36, UserOp2, Instruction)
HANDLE_OTHER_INST(37, VAArg , VAArgInst ) // vaarg instruction
- LAST_OTHER_INST(37)
+HANDLE_OTHER_INST(38, ExtractElement, ExtractElementInst) // extract packed element
+ LAST_OTHER_INST(38)
#undef FIRST_TERM_INST
#undef HANDLE_TERM_INST
diff --git a/include/llvm/Instructions.h b/include/llvm/Instructions.h
index 8c62d3d..703c41d 100644
--- a/include/llvm/Instructions.h
+++ b/include/llvm/Instructions.h
@@ -718,6 +718,52 @@ public:
};
//===----------------------------------------------------------------------===//
+// ExtractElementInst Class
+//===----------------------------------------------------------------------===//
+
+/// ExtractElementInst - This instruction extracts a single (scalar)
+/// element from a PackedType value
+///
+class ExtractElementInst : public Instruction {
+ Use Ops[2];
+ ExtractElementInst(const ExtractElementInst &EI) :
+ Instruction(EI.getType(), ExtractElement, Ops, 2) {
+ Ops[0].init(EI.Ops[0], this);
+ Ops[1].init(EI.Ops[1], this);
+ }
+
+public:
+ ExtractElementInst(Value *Val, Value *Index,
+ const std::string &Name = "", Instruction *InsertBefore = 0);
+ ExtractElementInst(Value *Val, Value *Index,
+ const std::string &Name, BasicBlock *InsertAtEnd);
+
+ virtual ExtractElementInst *clone() const;
+
+ virtual bool mayWriteToMemory() const { return false; }
+
+ /// Transparently provide more efficient getOperand methods.
+ Value *getOperand(unsigned i) const {
+ assert(i < 2 && "getOperand() out of range!");
+ return Ops[i];
+ }
+ void setOperand(unsigned i, Value *Val) {
+ assert(i < 2 && "setOperand() out of range!");
+ Ops[i] = Val;
+ }
+ unsigned getNumOperands() const { return 2; }
+
+ // Methods for support type inquiry through isa, cast, and dyn_cast:
+ static inline bool classof(const ExtractElementInst *) { return true; }
+ static inline bool classof(const Instruction *I) {
+ return I->getOpcode() == Instruction::ExtractElement;
+ }
+ static inline bool classof(const Value *V) {
+ return isa<Instruction>(V) && classof(cast<Instruction>(V));
+ }
+};
+
+//===----------------------------------------------------------------------===//
// PHINode Class
//===----------------------------------------------------------------------===//
diff --git a/include/llvm/Support/InstVisitor.h b/include/llvm/Support/InstVisitor.h
index a4b1f8b..9f888cb 100644
--- a/include/llvm/Support/InstVisitor.h
+++ b/include/llvm/Support/InstVisitor.h
@@ -175,6 +175,7 @@ public:
RetTy visitCallInst(CallInst &I) { DELEGATE(Instruction); }
RetTy visitShiftInst(ShiftInst &I) { DELEGATE(Instruction); }
RetTy visitVAArgInst(VAArgInst &I) { DELEGATE(Instruction); }
+ RetTy visitExtractElementInst(ExtractElementInst &I) { DELEGATE(Instruction); }
// Next level propagators... if the user does not overload a specific
// instruction type, they can overload one of these to get the whole class