Add support for bitwise operations in ESSL3

Add support for <<, >>, &, |, ^, and their compound assignment variants
<<=, >>=, &=, |=, ^=. Also add support for bitwise not (~).

BUG=angle:870

Change-Id: I5e6a835409589556d5d58d58078fdf505cfd8da5
Reviewed-on: https://chromium-review.googlesource.com/241850
Tested-by: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/compiler/translator/OutputHLSL.cpp b/src/compiler/translator/OutputHLSL.cpp
index 8ff8907..de1d4af 100644
--- a/src/compiler/translator/OutputHLSL.cpp
+++ b/src/compiler/translator/OutputHLSL.cpp
@@ -1396,6 +1396,11 @@
         break;
       case EOpDivAssign:               outputTriplet(visit, "(", " /= ", ")");          break;
       case EOpModAssign:               outputTriplet(visit, "(", " %= ", ")");          break;
+      case EOpBitShiftLeftAssign:      outputTriplet(visit, "(", " <<= ", ")");         break;
+      case EOpBitShiftRightAssign:     outputTriplet(visit, "(", " >>= ", ")");         break;
+      case EOpBitwiseAndAssign:        outputTriplet(visit, "(", " &= ", ")");          break;
+      case EOpBitwiseXorAssign:        outputTriplet(visit, "(", " ^= ", ")");          break;
+      case EOpBitwiseOrAssign:         outputTriplet(visit, "(", " |= ", ")");          break;
       case EOpIndexDirect:
         {
             const TType& leftType = node->getLeft()->getType();
@@ -1484,6 +1489,11 @@
       case EOpMul:               outputTriplet(visit, "(", " * ", ")"); break;
       case EOpDiv:               outputTriplet(visit, "(", " / ", ")"); break;
       case EOpMod:               outputTriplet(visit, "(", " % ", ")"); break;
+      case EOpBitShiftLeft:      outputTriplet(visit, "(", " << ", ")"); break;
+      case EOpBitShiftRight:     outputTriplet(visit, "(", " >> ", ")"); break;
+      case EOpBitwiseAnd:        outputTriplet(visit, "(", " & ", ")"); break;
+      case EOpBitwiseXor:        outputTriplet(visit, "(", " ^ ", ")"); break;
+      case EOpBitwiseOr:         outputTriplet(visit, "(", " | ", ")"); break;
       case EOpEqual:
       case EOpNotEqual:
         if (node->getLeft()->isScalar())
@@ -1593,6 +1603,7 @@
       case EOpPositive:         outputTriplet(visit, "(+", "", ")");         break;
       case EOpVectorLogicalNot: outputTriplet(visit, "(!", "", ")");         break;
       case EOpLogicalNot:       outputTriplet(visit, "(!", "", ")");         break;
+      case EOpBitwiseNot:       outputTriplet(visit, "(~", "", ")");         break;
       case EOpPostIncrement:    outputTriplet(visit, "(", "", "++)");        break;
       case EOpPostDecrement:    outputTriplet(visit, "(", "", "--)");        break;
       case EOpPreIncrement:     outputTriplet(visit, "(++", "", ")");        break;