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(); ...@@ -154,8 +154,7 @@ bool DebugAnnotationsActive();
// A macro for code which is not expected to be reached under valid assumptions // A macro for code which is not expected to be reached under valid assumptions
#if !defined(NDEBUG) #if !defined(NDEBUG)
#define UNREACHABLE() \ #define UNREACHABLE() \
ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__), \ ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__), assert(false)
assert(false)
#else #else
#define UNREACHABLE() ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__) #define UNREACHABLE() ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__)
#endif #endif
......
...@@ -369,17 +369,21 @@ TConstantUnion TConstantUnion::operator%(const TConstantUnion &constant) const ...@@ -369,17 +369,21 @@ TConstantUnion TConstantUnion::operator%(const TConstantUnion &constant) const
return returnValue; 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; TConstantUnion returnValue;
ASSERT(type == constant.type); ASSERT((lhs.type == rhs.type) && (lhs.type == EbtInt || lhs.type == EbtUInt));
switch (type) switch (lhs.type)
{ {
case EbtInt: case EbtInt:
returnValue.setIConst(iConst >> constant.iConst); returnValue.setIConst(lhs.iConst >> rhs.iConst);
break; break;
case EbtUInt: case EbtUInt:
returnValue.setUConst(uConst >> constant.uConst); returnValue.setUConst(lhs.uConst >> rhs.uConst);
break; break;
default: default:
UNREACHABLE(); UNREACHABLE();
...@@ -388,20 +392,24 @@ TConstantUnion TConstantUnion::operator>>(const TConstantUnion &constant) const ...@@ -388,20 +392,24 @@ TConstantUnion TConstantUnion::operator>>(const TConstantUnion &constant) const
return returnValue; 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; TConstantUnion returnValue;
// The signedness of the second parameter might be different, but we // The signedness of the second parameter might be different, but we
// don't care, since the result is undefined if the second parameter is // don't care, since the result is undefined if the second parameter is
// negative, and aliasing should not be a problem with unions. // negative, and aliasing should not be a problem with unions.
ASSERT(constant.type == EbtInt || constant.type == EbtUInt); ASSERT((lhs.type == rhs.type) && (lhs.type == EbtInt || lhs.type == EbtUInt));
switch (type) switch (lhs.type)
{ {
case EbtInt: case EbtInt:
returnValue.setIConst(iConst << constant.iConst); returnValue.setIConst(lhs.iConst << rhs.iConst);
break; break;
case EbtUInt: case EbtUInt:
returnValue.setUConst(uConst << constant.uConst); returnValue.setUConst(lhs.uConst << rhs.uConst);
break; break;
default: default:
UNREACHABLE(); UNREACHABLE();
......
...@@ -57,8 +57,14 @@ class TConstantUnion ...@@ -57,8 +57,14 @@ class TConstantUnion
TDiagnostics *diag, TDiagnostics *diag,
const TSourceLoc &line); 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,
TConstantUnion operator<<(const TConstantUnion &constant) const; 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; 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, ...@@ -1340,12 +1340,12 @@ TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op,
case EOpBitShiftLeft: case EOpBitShiftLeft:
resultArray = new TConstantUnion[objectSize]; resultArray = new TConstantUnion[objectSize];
for (size_t i = 0; i < objectSize; i++) 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; break;
case EOpBitShiftRight: case EOpBitShiftRight:
resultArray = new TConstantUnion[objectSize]; resultArray = new TConstantUnion[objectSize];
for (size_t i = 0; i < objectSize; i++) 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; break;
case EOpLessThan: 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