Separate integer and float modulus

Integer and float modulus are separated into Mod and IMod operator types
to make the code clearer and to make GetOperatorString return the correct
value for both.

Change-Id: Ibfbca2c558bf919b0eab6404d7349f87fe47a18c
Reviewed-on: https://chromium-review.googlesource.com/249692
Tested-by: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Zhenyao Mo <zmo@chromium.org>
diff --git a/src/compiler/translator/IntermNode.cpp b/src/compiler/translator/IntermNode.cpp
index c64c155..825056b 100644
--- a/src/compiler/translator/IntermNode.cpp
+++ b/src/compiler/translator/IntermNode.cpp
@@ -264,7 +264,7 @@
       case EOpMatrixTimesScalarAssign:
       case EOpMatrixTimesMatrixAssign:
       case EOpDivAssign:
-      case EOpModAssign:
+      case EOpIModAssign:
       case EOpBitShiftLeftAssign:
       case EOpBitShiftRightAssign:
       case EOpBitwiseAndAssign:
@@ -605,7 +605,7 @@
       case EOpAdd:
       case EOpSub:
       case EOpDiv:
-      case EOpMod:
+      case EOpIMod:
       case EOpBitShiftLeft:
       case EOpBitShiftRight:
       case EOpBitwiseAnd:
@@ -614,7 +614,7 @@
       case EOpAddAssign:
       case EOpSubAssign:
       case EOpDivAssign:
-      case EOpModAssign:
+      case EOpIModAssign:
       case EOpBitShiftLeftAssign:
       case EOpBitShiftRightAssign:
       case EOpBitwiseAndAssign:
@@ -792,7 +792,7 @@
             break;
 
           case EOpDiv:
-          case EOpMod:
+          case EOpIMod:
             {
                 tempConstArray = new ConstantUnion[objectSize];
                 for (size_t i = 0; i < objectSize; i++)
diff --git a/src/compiler/translator/Intermediate.cpp b/src/compiler/translator/Intermediate.cpp
index d33ef34..5e29cd2 100644
--- a/src/compiler/translator/Intermediate.cpp
+++ b/src/compiler/translator/Intermediate.cpp
@@ -80,7 +80,7 @@
             return NULL;
         }
         break;
-      case EOpMod:
+      case EOpIMod:
         // Note that this is only for the % operator, not for mod()
         if (left->getBasicType() == EbtStruct || left->getBasicType() == EbtBool || left->getBasicType() == EbtFloat)
         {
diff --git a/src/compiler/translator/Operator.cpp b/src/compiler/translator/Operator.cpp
index 88f20d5..b2fa7af 100644
--- a/src/compiler/translator/Operator.cpp
+++ b/src/compiler/translator/Operator.cpp
@@ -27,6 +27,7 @@
       case EOpSub: return "-";
       case EOpMul: return "*";
       case EOpDiv: return "/";
+      case EOpIMod: return "%";
       case EOpEqual: return "==";
       case EOpNotEqual: return "!=";
       case EOpVectorEqual: return "equal";
@@ -92,7 +93,7 @@
       case EOpFloor: return "floor";
       case EOpCeil: return "ceil";
       case EOpFract: return "fract";
-      case EOpMod: return "%"; // TODO: Separate % and mod() into different operators
+      case EOpMod: return "mod";
       case EOpMin: return "min";
       case EOpMax: return "max";
       case EOpClamp: return "clamp";
@@ -174,7 +175,7 @@
       case EOpMatrixTimesMatrixAssign: return "*=";
 
       case EOpDivAssign: return "/=";
-      case EOpModAssign: return "%=";
+      case EOpIModAssign: return "%=";
       case EOpBitShiftLeftAssign: return "<<=";
       case EOpBitShiftRightAssign: return ">>=";
       case EOpBitwiseAndAssign: return "&=";
diff --git a/src/compiler/translator/Operator.h b/src/compiler/translator/Operator.h
index 76857eb..f875799 100644
--- a/src/compiler/translator/Operator.h
+++ b/src/compiler/translator/Operator.h
@@ -46,6 +46,7 @@
     EOpSub,
     EOpMul,
     EOpDiv,
+    EOpIMod,
     EOpEqual,
     EOpNotEqual,
     EOpVectorEqual,
@@ -205,7 +206,7 @@
     EOpMatrixTimesMatrixAssign,
 
     EOpDivAssign,
-    EOpModAssign,
+    EOpIModAssign,
     EOpBitShiftLeftAssign,
     EOpBitShiftRightAssign,
     EOpBitwiseAndAssign,
diff --git a/src/compiler/translator/OutputGLSLBase.cpp b/src/compiler/translator/OutputGLSLBase.cpp
index 8d8830c..01fb2a3 100644
--- a/src/compiler/translator/OutputGLSLBase.cpp
+++ b/src/compiler/translator/OutputGLSLBase.cpp
@@ -223,7 +223,7 @@
       case EOpDivAssign:
         writeTriplet(visit, "(", " /= ", ")");
         break;
-      case EOpModAssign:
+      case EOpIModAssign:
         writeTriplet(visit, "(", " %= ", ")");
         break;
       // Notice the fall-through.
@@ -358,7 +358,7 @@
       case EOpDiv:
         writeTriplet(visit, "(", " / ", ")");
         break;
-      case EOpMod:
+      case EOpIMod:
         writeTriplet(visit, "(", " % ", ")");
         break;
       case EOpBitShiftLeft:
diff --git a/src/compiler/translator/OutputHLSL.cpp b/src/compiler/translator/OutputHLSL.cpp
index 3ee58ce..37e713b 100644
--- a/src/compiler/translator/OutputHLSL.cpp
+++ b/src/compiler/translator/OutputHLSL.cpp
@@ -1430,7 +1430,7 @@
         }
         break;
       case EOpDivAssign:               outputTriplet(visit, "(", " /= ", ")");          break;
-      case EOpModAssign:               outputTriplet(visit, "(", " %= ", ")");          break;
+      case EOpIModAssign:              outputTriplet(visit, "(", " %= ", ")");          break;
       case EOpBitShiftLeftAssign:      outputTriplet(visit, "(", " <<= ", ")");         break;
       case EOpBitShiftRightAssign:     outputTriplet(visit, "(", " >>= ", ")");         break;
       case EOpBitwiseAndAssign:        outputTriplet(visit, "(", " &= ", ")");          break;
@@ -1523,7 +1523,7 @@
       case EOpSub:               outputTriplet(visit, "(", " - ", ")"); break;
       case EOpMul:               outputTriplet(visit, "(", " * ", ")"); break;
       case EOpDiv:               outputTriplet(visit, "(", " / ", ")"); break;
-      case EOpMod:               outputTriplet(visit, "(", " % ", ")"); break;
+      case EOpIMod:              outputTriplet(visit, "(", " % ", ")"); break;
       case EOpBitShiftLeft:      outputTriplet(visit, "(", " << ", ")"); break;
       case EOpBitShiftRight:     outputTriplet(visit, "(", " >> ", ")"); break;
       case EOpBitwiseAnd:        outputTriplet(visit, "(", " & ", ")"); break;
diff --git a/src/compiler/translator/glslang.y b/src/compiler/translator/glslang.y
index e66cccb..d21d28b 100644
--- a/src/compiler/translator/glslang.y
+++ b/src/compiler/translator/glslang.y
@@ -511,7 +511,7 @@
     }
     | multiplicative_expression PERCENT unary_expression {
         ES3_ONLY("%", @2, "integer modulus operator");
-        $$ = context->addBinaryMath(EOpMod, $1, $3, @2);
+        $$ = context->addBinaryMath(EOpIMod, $1, $3, @2);
     }
     ;
 
@@ -646,7 +646,7 @@
     | DIV_ASSIGN   { $$.op = EOpDivAssign; }
     | MOD_ASSIGN   {
         ES3_ONLY("%=", @$, "integer modulus operator");
-        $$.op = EOpModAssign;
+        $$.op = EOpIModAssign;
     }
     | ADD_ASSIGN   { $$.op = EOpAddAssign; }
     | SUB_ASSIGN   { $$.op = EOpSubAssign; }
diff --git a/src/compiler/translator/glslang_tab.cpp b/src/compiler/translator/glslang_tab.cpp
index 4792327..d1c8d28 100644
--- a/src/compiler/translator/glslang_tab.cpp
+++ b/src/compiler/translator/glslang_tab.cpp
@@ -2760,7 +2760,7 @@
 
     {
         ES3_ONLY("%", (yylsp[-1]), "integer modulus operator");
-        (yyval.interm.intermTypedNode) = context->addBinaryMath(EOpMod, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
+        (yyval.interm.intermTypedNode) = context->addBinaryMath(EOpIMod, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
     }
 
     break;
@@ -3026,7 +3026,7 @@
 
     {
         ES3_ONLY("%=", (yyloc), "integer modulus operator");
-        (yyval.interm).op = EOpModAssign;
+        (yyval.interm).op = EOpIModAssign;
     }
 
     break;
diff --git a/src/compiler/translator/intermOut.cpp b/src/compiler/translator/intermOut.cpp
index 65d8d51..44a5c03 100644
--- a/src/compiler/translator/intermOut.cpp
+++ b/src/compiler/translator/intermOut.cpp
@@ -131,7 +131,7 @@
       case EOpDivAssign:
         out << "divide second child into first child";
         break;
-      case EOpModAssign:
+      case EOpIModAssign:
         out << "modulo second child into first child";
         break;
       case EOpBitShiftLeftAssign:
@@ -178,7 +178,7 @@
       case EOpDiv:
         out << "divide";
         break;
-      case EOpMod:
+      case EOpIMod:
         out << "modulo";
         break;
       case EOpBitShiftLeft: