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:
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 returnValue;
......
......@@ -1539,38 +1539,29 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, TIntermTyped* constantNod
break;
case EOpLessThan:
assert(objectSize == 1);
tempConstArray = new ConstantUnion[1];
tempConstArray->setBConst(*unionArray < *rightUnionArray);
returnType = TType(EbtBool, EbpUndefined, EvqConstExpr);
tempConstArray = new ConstantUnion[objectSize];
for(int i = 0; i < objectSize; i++)
tempConstArray[i].setBConst(unionArray[i] < rightUnionArray[i]);
returnType = TType(EbtBool, EbpUndefined, EvqConstExpr, objectSize);
break;
case EOpGreaterThan:
assert(objectSize == 1);
tempConstArray = new ConstantUnion[1];
tempConstArray->setBConst(*unionArray > *rightUnionArray);
returnType = TType(EbtBool, EbpUndefined, EvqConstExpr);
tempConstArray = new ConstantUnion[objectSize];
for(int i = 0; i < objectSize; i++)
tempConstArray[i].setBConst(unionArray[i] > rightUnionArray[i]);
returnType = TType(EbtBool, EbpUndefined, EvqConstExpr, objectSize);
break;
case EOpLessThanEqual:
{
assert(objectSize == 1);
ConstantUnion constant;
constant.setBConst(*unionArray > *rightUnionArray);
tempConstArray = new ConstantUnion[1];
tempConstArray->setBConst(!constant.getBConst());
returnType = TType(EbtBool, EbpUndefined, EvqConstExpr);
tempConstArray = new ConstantUnion[objectSize];
for(int i = 0; i < objectSize; i++)
tempConstArray[i].setBConst(unionArray[i] <= rightUnionArray[i]);
returnType = TType(EbtBool, EbpUndefined, EvqConstExpr, objectSize);
break;
}
case EOpGreaterThanEqual:
{
assert(objectSize == 1);
ConstantUnion constant;
constant.setBConst(*unionArray < *rightUnionArray);
tempConstArray = new ConstantUnion[1];
tempConstArray->setBConst(!constant.getBConst());
returnType = TType(EbtBool, EbpUndefined, EvqConstExpr);
tempConstArray = new ConstantUnion[objectSize];
for(int i = 0; i < objectSize; i++)
tempConstArray[i].setBConst(unionArray[i] >= rightUnionArray[i]);
returnType = TType(EbtBool, EbpUndefined, EvqConstExpr, objectSize);
break;
}
case EOpEqual:
if (getType().getBasicType() == EbtStruct) {
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