Commit 5e0c3546 by Nicolas Capens

Fix constant folding of vector compares.

Change-Id: If17c2429d38158663c2436e374691a460e3d588c Reviewed-on: https://swiftshader-review.googlesource.com/5064Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 0863f0df
...@@ -207,6 +207,40 @@ public: ...@@ -207,6 +207,40 @@ public:
return false; return false;
} }
bool operator<=(const ConstantUnion& constant) const
{
assert(type == constant.type);
switch (type) {
case EbtInt:
return iConst <= constant.iConst;
case EbtUInt:
return uConst <= constant.uConst;
case EbtFloat:
return fConst <= constant.fConst;
default:
return false; // Invalid operation, handled at semantic analysis
}
return false;
}
bool operator>=(const ConstantUnion& constant) const
{
assert(type == constant.type);
switch (type) {
case EbtInt:
return iConst >= constant.iConst;
case EbtUInt:
return uConst >= constant.uConst;
case EbtFloat:
return fConst >= constant.fConst;
default:
return false; // Invalid operation, handled at semantic analysis
}
return false;
}
ConstantUnion operator+(const ConstantUnion& constant) const ConstantUnion operator+(const ConstantUnion& constant) const
{ {
ConstantUnion returnValue; ConstantUnion returnValue;
......
...@@ -1539,38 +1539,29 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, TIntermTyped* constantNod ...@@ -1539,38 +1539,29 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, TIntermTyped* constantNod
break; break;
case EOpLessThan: case EOpLessThan:
assert(objectSize == 1); tempConstArray = new ConstantUnion[objectSize];
tempConstArray = new ConstantUnion[1]; for(int i = 0; i < objectSize; i++)
tempConstArray->setBConst(*unionArray < *rightUnionArray); tempConstArray[i].setBConst(unionArray[i] < rightUnionArray[i]);
returnType = TType(EbtBool, EbpUndefined, EvqConstExpr); returnType = TType(EbtBool, EbpUndefined, EvqConstExpr, objectSize);
break; break;
case EOpGreaterThan: case EOpGreaterThan:
assert(objectSize == 1); tempConstArray = new ConstantUnion[objectSize];
tempConstArray = new ConstantUnion[1]; for(int i = 0; i < objectSize; i++)
tempConstArray->setBConst(*unionArray > *rightUnionArray); tempConstArray[i].setBConst(unionArray[i] > rightUnionArray[i]);
returnType = TType(EbtBool, EbpUndefined, EvqConstExpr); returnType = TType(EbtBool, EbpUndefined, EvqConstExpr, objectSize);
break; break;
case EOpLessThanEqual: case EOpLessThanEqual:
{ tempConstArray = new ConstantUnion[objectSize];
assert(objectSize == 1); for(int i = 0; i < objectSize; i++)
ConstantUnion constant; tempConstArray[i].setBConst(unionArray[i] <= rightUnionArray[i]);
constant.setBConst(*unionArray > *rightUnionArray); returnType = TType(EbtBool, EbpUndefined, EvqConstExpr, objectSize);
tempConstArray = new ConstantUnion[1];
tempConstArray->setBConst(!constant.getBConst());
returnType = TType(EbtBool, EbpUndefined, EvqConstExpr);
break; break;
}
case EOpGreaterThanEqual: case EOpGreaterThanEqual:
{ tempConstArray = new ConstantUnion[objectSize];
assert(objectSize == 1); for(int i = 0; i < objectSize; i++)
ConstantUnion constant; tempConstArray[i].setBConst(unionArray[i] >= rightUnionArray[i]);
constant.setBConst(*unionArray < *rightUnionArray); returnType = TType(EbtBool, EbpUndefined, EvqConstExpr, objectSize);
tempConstArray = new ConstantUnion[1];
tempConstArray->setBConst(!constant.getBConst());
returnType = TType(EbtBool, EbpUndefined, EvqConstExpr);
break; break;
}
case EOpEqual: case EOpEqual:
if (getType().getBasicType() == EbtStruct) { if (getType().getBasicType() == EbtStruct) {
if (!CompareStructure(node->getType(), node->getUnionArrayPointer(), unionArray)) if (!CompareStructure(node->getType(), node->getUnionArrayPointer(), unionArray))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment