Add support for encoding a OCUVectorComponent into a single integer.

llvm-svn: 40768
This commit is contained in:
Chris Lattner 2007-08-02 23:36:59 +00:00
parent 30709dc432
commit 885b4959b6
3 changed files with 37 additions and 5 deletions

View File

@ -611,3 +611,20 @@ bool OCUVectorComponent::containsDuplicateComponents() const {
}
return false;
}
/// getEncodedElementAccess - We encode fields with two bits per component.
unsigned OCUVectorComponent::getEncodedElementAccess() const {
const char *compStr = Accessor.getName();
unsigned length = strlen(compStr);
unsigned Result = 0;
while (length--) {
Result <<= 2;
int Idx = OCUVectorType::getAccessorIdx(compStr[length]);
assert(Idx != -1 && "Invalid accessor letter");
Result |= Idx;
}
return Result;
}

View File

@ -494,6 +494,18 @@ public:
/// repeated.
bool containsDuplicateComponents() const;
/// getEncodedElementAccess - Encode the elements accessed into a bit vector.
/// The encoding currently uses 2-bit bitfields, but clients should use the
/// accessors below to access them.
///
unsigned getEncodedElementAccess() const;
/// getAccessedFieldNo - Given an encoded value and a result number, return
/// the input field number being accessed.
static unsigned getAccessedFieldNo(unsigned Idx, unsigned EncodedVal) {
return (EncodedVal >> (Idx*2)) & 3;
}
virtual SourceRange getSourceRange() const {
return SourceRange(getBase()->getLocStart(), AccessorLoc);
}

View File

@ -544,12 +544,15 @@ public:
case 'q': return 3;
}
};
static int getAccessorIdx(char c) {
if (int idx = getPointAccessorIdx(c)+1) return idx-1;
if (int idx = getColorAccessorIdx(c)+1) return idx-1;
return getTextureAccessorIdx(c);
}
bool isAccessorWithinNumElements(char c) const {
if (int idx = getPointAccessorIdx(c)+1)
return unsigned(idx-1) < NumElements;
if (int idx = getColorAccessorIdx(c)+1)
return unsigned(idx-1) < NumElements;
if (int idx = getTextureAccessorIdx(c)+1)
if (int idx = getAccessorIdx(c)+1)
return unsigned(idx-1) < NumElements;
return false;
}