Commit 596018ce by Jamie Madill Committed by Commit Bot

translator: Refactor Constant Union shift ops.

In preparation for making them robust. BUG=chromium:648135 Change-Id: I88fc87d8887064fda04087c56de05d8725a6fe5f Reviewed-on: https://chromium-review.googlesource.com/387469Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent d2f195b5
......@@ -154,8 +154,7 @@ bool DebugAnnotationsActive();
// A macro for code which is not expected to be reached under valid assumptions
#if !defined(NDEBUG)
#define UNREACHABLE() \
ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__), \
assert(false)
ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__), assert(false)
#else
#define UNREACHABLE() ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__)
#endif
......
......@@ -369,17 +369,21 @@ TConstantUnion TConstantUnion::operator%(const TConstantUnion &constant) const
return returnValue;
}
TConstantUnion TConstantUnion::operator>>(const TConstantUnion &constant) const
// static
TConstantUnion TConstantUnion::rshift(const TConstantUnion &lhs,
const TConstantUnion &rhs,
TDiagnostics *diag,
const TSourceLoc &line)
{
TConstantUnion returnValue;
ASSERT(type == constant.type);
switch (type)
ASSERT((lhs.type == rhs.type) && (lhs.type == EbtInt || lhs.type == EbtUInt));
switch (lhs.type)
{
case EbtInt:
returnValue.setIConst(iConst >> constant.iConst);
returnValue.setIConst(lhs.iConst >> rhs.iConst);
break;
case EbtUInt:
returnValue.setUConst(uConst >> constant.uConst);
returnValue.setUConst(lhs.uConst >> rhs.uConst);
break;
default:
UNREACHABLE();
......@@ -388,20 +392,24 @@ TConstantUnion TConstantUnion::operator>>(const TConstantUnion &constant) const
return returnValue;
}
TConstantUnion TConstantUnion::operator<<(const TConstantUnion &constant) const
// static
TConstantUnion TConstantUnion::lshift(const TConstantUnion &lhs,
const TConstantUnion &rhs,
TDiagnostics *diag,
const TSourceLoc &line)
{
TConstantUnion returnValue;
// The signedness of the second parameter might be different, but we
// don't care, since the result is undefined if the second parameter is
// negative, and aliasing should not be a problem with unions.
ASSERT(constant.type == EbtInt || constant.type == EbtUInt);
switch (type)
ASSERT((lhs.type == rhs.type) && (lhs.type == EbtInt || lhs.type == EbtUInt));
switch (lhs.type)
{
case EbtInt:
returnValue.setIConst(iConst << constant.iConst);
returnValue.setIConst(lhs.iConst << rhs.iConst);
break;
case EbtUInt:
returnValue.setUConst(uConst << constant.uConst);
returnValue.setUConst(lhs.uConst << rhs.uConst);
break;
default:
UNREACHABLE();
......
......@@ -57,8 +57,14 @@ class TConstantUnion
TDiagnostics *diag,
const TSourceLoc &line);
TConstantUnion operator%(const TConstantUnion &constant) const;
TConstantUnion operator>>(const TConstantUnion &constant) const;
TConstantUnion operator<<(const TConstantUnion &constant) const;
static TConstantUnion rshift(const TConstantUnion &lhs,
const TConstantUnion &rhs,
TDiagnostics *diag,
const TSourceLoc &line);
static TConstantUnion lshift(const TConstantUnion &lhs,
const TConstantUnion &rhs,
TDiagnostics *diag,
const TSourceLoc &line);
TConstantUnion operator&(const TConstantUnion &constant) const;
TConstantUnion operator|(const TConstantUnion &constant) const;
TConstantUnion operator^(const TConstantUnion &constant) const;
......
......@@ -1340,12 +1340,12 @@ TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op,
case EOpBitShiftLeft:
resultArray = new TConstantUnion[objectSize];
for (size_t i = 0; i < objectSize; i++)
resultArray[i] = leftArray[i] << rightArray[i];
resultArray[i] = TConstantUnion::lshift(leftArray[i], rightArray[i], diagnostics, line);
break;
case EOpBitShiftRight:
resultArray = new TConstantUnion[objectSize];
for (size_t i = 0; i < objectSize; i++)
resultArray[i] = leftArray[i] >> rightArray[i];
resultArray[i] = TConstantUnion::rshift(leftArray[i], rightArray[i], diagnostics, line);
break;
case EOpLessThan:
......
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