aboutsummaryrefslogtreecommitdiff
path: root/CodeGen/CodeGenFunction.h
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-08-02 23:37:31 +0000
committerChris Lattner <sabre@nondot.org>2007-08-02 23:37:31 +0000
commit349aaec106b459206479f7600990230b9d799c61 (patch)
treefd64cbaf747d14665290687a8c32c86ad07df3b0 /CodeGen/CodeGenFunction.h
parentb8f849da3cedee2f61ad98389115ddd04e439d60 (diff)
add support for codegen of an OCUVectorComponent as an lvalue.
We can now codegen: vec4.xy; as nothing! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40769 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'CodeGen/CodeGenFunction.h')
-rw-r--r--CodeGen/CodeGenFunction.h26
1 files changed, 22 insertions, 4 deletions
diff --git a/CodeGen/CodeGenFunction.h b/CodeGen/CodeGenFunction.h
index d82c787eae..37614e95f0 100644
--- a/CodeGen/CodeGenFunction.h
+++ b/CodeGen/CodeGenFunction.h
@@ -54,6 +54,7 @@ namespace clang {
class BinaryOperator;
class CompoundAssignOperator;
class ArraySubscriptExpr;
+ class OCUVectorComponent;
class ConditionalOperator;
class PreDefinedExpr;
@@ -116,26 +117,35 @@ class LValue {
// alignment?
enum {
- Simple, // This is a normal l-value, use getAddress().
- VectorElt, // This is a vector element l-value (V[i]), use getVector*
- BitField // This is a bitfield l-value, use getBitfield*.
+ Simple, // This is a normal l-value, use getAddress().
+ VectorElt, // This is a vector element l-value (V[i]), use getVector*
+ BitField, // This is a bitfield l-value, use getBitfield*.
+ OCUVectorComp // This is an ocu vector subset, use getOCUVectorComp
} LVType;
llvm::Value *V;
union {
- llvm::Value *VectorIdx;
+ llvm::Value *VectorIdx; // Index into a vector subscript: V[i]
+ unsigned VectorComp; // Encoded OCUVector element subset: V.xyx
};
public:
bool isSimple() const { return LVType == Simple; }
bool isVectorElt() const { return LVType == VectorElt; }
bool isBitfield() const { return LVType == BitField; }
+ bool isOCUVectorComp() const { return LVType == OCUVectorComp; }
// simple lvalue
llvm::Value *getAddress() const { assert(isSimple()); return V; }
// vector elt lvalue
llvm::Value *getVectorAddr() const { assert(isVectorElt()); return V; }
llvm::Value *getVectorIdx() const { assert(isVectorElt()); return VectorIdx; }
+ // ocu vector components.
+ unsigned getOCUVectorComp() const {
+ assert(isOCUVectorComp());
+ return VectorComp;
+ }
+
static LValue MakeAddr(llvm::Value *V) {
LValue R;
@@ -152,6 +162,13 @@ public:
return R;
}
+ static LValue MakeOCUVectorComp(llvm::Value *Vec, unsigned Components) {
+ LValue R;
+ R.LVType = VectorElt;
+ R.V = Vec;
+ R.VectorComp = Components;
+ return R;
+ }
};
/// CodeGenFunction - This class organizes the per-function state that is used
@@ -309,6 +326,7 @@ public:
LValue EmitPreDefinedLValue(const PreDefinedExpr *E);
LValue EmitUnaryOpLValue(const UnaryOperator *E);
LValue EmitArraySubscriptExpr(const ArraySubscriptExpr *E);
+ LValue EmitOCUVectorComponentExpr(const OCUVectorComponent *E);
//===--------------------------------------------------------------------===//
// Expression Emission