diff options
author | Chris Lattner <sabre@nondot.org> | 2007-08-02 23:37:31 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-08-02 23:37:31 +0000 |
commit | 349aaec106b459206479f7600990230b9d799c61 (patch) | |
tree | fd64cbaf747d14665290687a8c32c86ad07df3b0 /CodeGen/CodeGenFunction.h | |
parent | b8f849da3cedee2f61ad98389115ddd04e439d60 (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.h | 26 |
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 |