Commit ff805cc3 by Olli Etuaho

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/249692Tested-by: 's avatarOlli Etuaho <oetuaho@nvidia.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarZhenyao Mo <zmo@chromium.org>
parent 23dcabad
...@@ -264,7 +264,7 @@ bool TIntermOperator::isAssignment() const ...@@ -264,7 +264,7 @@ bool TIntermOperator::isAssignment() const
case EOpMatrixTimesScalarAssign: case EOpMatrixTimesScalarAssign:
case EOpMatrixTimesMatrixAssign: case EOpMatrixTimesMatrixAssign:
case EOpDivAssign: case EOpDivAssign:
case EOpModAssign: case EOpIModAssign:
case EOpBitShiftLeftAssign: case EOpBitShiftLeftAssign:
case EOpBitShiftRightAssign: case EOpBitShiftRightAssign:
case EOpBitwiseAndAssign: case EOpBitwiseAndAssign:
...@@ -605,7 +605,7 @@ bool TIntermBinary::promote(TInfoSink &infoSink) ...@@ -605,7 +605,7 @@ bool TIntermBinary::promote(TInfoSink &infoSink)
case EOpAdd: case EOpAdd:
case EOpSub: case EOpSub:
case EOpDiv: case EOpDiv:
case EOpMod: case EOpIMod:
case EOpBitShiftLeft: case EOpBitShiftLeft:
case EOpBitShiftRight: case EOpBitShiftRight:
case EOpBitwiseAnd: case EOpBitwiseAnd:
...@@ -614,7 +614,7 @@ bool TIntermBinary::promote(TInfoSink &infoSink) ...@@ -614,7 +614,7 @@ bool TIntermBinary::promote(TInfoSink &infoSink)
case EOpAddAssign: case EOpAddAssign:
case EOpSubAssign: case EOpSubAssign:
case EOpDivAssign: case EOpDivAssign:
case EOpModAssign: case EOpIModAssign:
case EOpBitShiftLeftAssign: case EOpBitShiftLeftAssign:
case EOpBitShiftRightAssign: case EOpBitShiftRightAssign:
case EOpBitwiseAndAssign: case EOpBitwiseAndAssign:
...@@ -792,7 +792,7 @@ TIntermTyped *TIntermConstantUnion::fold( ...@@ -792,7 +792,7 @@ TIntermTyped *TIntermConstantUnion::fold(
break; break;
case EOpDiv: case EOpDiv:
case EOpMod: case EOpIMod:
{ {
tempConstArray = new ConstantUnion[objectSize]; tempConstArray = new ConstantUnion[objectSize];
for (size_t i = 0; i < objectSize; i++) for (size_t i = 0; i < objectSize; i++)
......
...@@ -80,7 +80,7 @@ TIntermTyped *TIntermediate::addBinaryMath( ...@@ -80,7 +80,7 @@ TIntermTyped *TIntermediate::addBinaryMath(
return NULL; return NULL;
} }
break; break;
case EOpMod: case EOpIMod:
// Note that this is only for the % operator, not for mod() // Note that this is only for the % operator, not for mod()
if (left->getBasicType() == EbtStruct || left->getBasicType() == EbtBool || left->getBasicType() == EbtFloat) if (left->getBasicType() == EbtStruct || left->getBasicType() == EbtBool || left->getBasicType() == EbtFloat)
{ {
......
...@@ -27,6 +27,7 @@ const char *GetOperatorString(TOperator op) ...@@ -27,6 +27,7 @@ const char *GetOperatorString(TOperator op)
case EOpSub: return "-"; case EOpSub: return "-";
case EOpMul: return "*"; case EOpMul: return "*";
case EOpDiv: return "/"; case EOpDiv: return "/";
case EOpIMod: return "%";
case EOpEqual: return "=="; case EOpEqual: return "==";
case EOpNotEqual: return "!="; case EOpNotEqual: return "!=";
case EOpVectorEqual: return "equal"; case EOpVectorEqual: return "equal";
...@@ -92,7 +93,7 @@ const char *GetOperatorString(TOperator op) ...@@ -92,7 +93,7 @@ const char *GetOperatorString(TOperator op)
case EOpFloor: return "floor"; case EOpFloor: return "floor";
case EOpCeil: return "ceil"; case EOpCeil: return "ceil";
case EOpFract: return "fract"; case EOpFract: return "fract";
case EOpMod: return "%"; // TODO: Separate % and mod() into different operators case EOpMod: return "mod";
case EOpMin: return "min"; case EOpMin: return "min";
case EOpMax: return "max"; case EOpMax: return "max";
case EOpClamp: return "clamp"; case EOpClamp: return "clamp";
...@@ -174,7 +175,7 @@ const char *GetOperatorString(TOperator op) ...@@ -174,7 +175,7 @@ const char *GetOperatorString(TOperator op)
case EOpMatrixTimesMatrixAssign: return "*="; case EOpMatrixTimesMatrixAssign: return "*=";
case EOpDivAssign: return "/="; case EOpDivAssign: return "/=";
case EOpModAssign: return "%="; case EOpIModAssign: return "%=";
case EOpBitShiftLeftAssign: return "<<="; case EOpBitShiftLeftAssign: return "<<=";
case EOpBitShiftRightAssign: return ">>="; case EOpBitShiftRightAssign: return ">>=";
case EOpBitwiseAndAssign: return "&="; case EOpBitwiseAndAssign: return "&=";
......
...@@ -46,6 +46,7 @@ enum TOperator ...@@ -46,6 +46,7 @@ enum TOperator
EOpSub, EOpSub,
EOpMul, EOpMul,
EOpDiv, EOpDiv,
EOpIMod,
EOpEqual, EOpEqual,
EOpNotEqual, EOpNotEqual,
EOpVectorEqual, EOpVectorEqual,
...@@ -205,7 +206,7 @@ enum TOperator ...@@ -205,7 +206,7 @@ enum TOperator
EOpMatrixTimesMatrixAssign, EOpMatrixTimesMatrixAssign,
EOpDivAssign, EOpDivAssign,
EOpModAssign, EOpIModAssign,
EOpBitShiftLeftAssign, EOpBitShiftLeftAssign,
EOpBitShiftRightAssign, EOpBitShiftRightAssign,
EOpBitwiseAndAssign, EOpBitwiseAndAssign,
......
...@@ -223,7 +223,7 @@ bool TOutputGLSLBase::visitBinary(Visit visit, TIntermBinary *node) ...@@ -223,7 +223,7 @@ bool TOutputGLSLBase::visitBinary(Visit visit, TIntermBinary *node)
case EOpDivAssign: case EOpDivAssign:
writeTriplet(visit, "(", " /= ", ")"); writeTriplet(visit, "(", " /= ", ")");
break; break;
case EOpModAssign: case EOpIModAssign:
writeTriplet(visit, "(", " %= ", ")"); writeTriplet(visit, "(", " %= ", ")");
break; break;
// Notice the fall-through. // Notice the fall-through.
...@@ -358,7 +358,7 @@ bool TOutputGLSLBase::visitBinary(Visit visit, TIntermBinary *node) ...@@ -358,7 +358,7 @@ bool TOutputGLSLBase::visitBinary(Visit visit, TIntermBinary *node)
case EOpDiv: case EOpDiv:
writeTriplet(visit, "(", " / ", ")"); writeTriplet(visit, "(", " / ", ")");
break; break;
case EOpMod: case EOpIMod:
writeTriplet(visit, "(", " % ", ")"); writeTriplet(visit, "(", " % ", ")");
break; break;
case EOpBitShiftLeft: case EOpBitShiftLeft:
......
...@@ -1430,7 +1430,7 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) ...@@ -1430,7 +1430,7 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
} }
break; break;
case EOpDivAssign: outputTriplet(visit, "(", " /= ", ")"); break; case EOpDivAssign: outputTriplet(visit, "(", " /= ", ")"); break;
case EOpModAssign: outputTriplet(visit, "(", " %= ", ")"); break; case EOpIModAssign: outputTriplet(visit, "(", " %= ", ")"); break;
case EOpBitShiftLeftAssign: outputTriplet(visit, "(", " <<= ", ")"); break; case EOpBitShiftLeftAssign: outputTriplet(visit, "(", " <<= ", ")"); break;
case EOpBitShiftRightAssign: outputTriplet(visit, "(", " >>= ", ")"); break; case EOpBitShiftRightAssign: outputTriplet(visit, "(", " >>= ", ")"); break;
case EOpBitwiseAndAssign: outputTriplet(visit, "(", " &= ", ")"); break; case EOpBitwiseAndAssign: outputTriplet(visit, "(", " &= ", ")"); break;
...@@ -1523,7 +1523,7 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node) ...@@ -1523,7 +1523,7 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
case EOpSub: outputTriplet(visit, "(", " - ", ")"); break; case EOpSub: outputTriplet(visit, "(", " - ", ")"); break;
case EOpMul: outputTriplet(visit, "(", " * ", ")"); break; case EOpMul: outputTriplet(visit, "(", " * ", ")"); break;
case EOpDiv: outputTriplet(visit, "(", " / ", ")"); break; case EOpDiv: outputTriplet(visit, "(", " / ", ")"); break;
case EOpMod: outputTriplet(visit, "(", " % ", ")"); break; case EOpIMod: outputTriplet(visit, "(", " % ", ")"); break;
case EOpBitShiftLeft: outputTriplet(visit, "(", " << ", ")"); break; case EOpBitShiftLeft: outputTriplet(visit, "(", " << ", ")"); break;
case EOpBitShiftRight: outputTriplet(visit, "(", " >> ", ")"); break; case EOpBitShiftRight: outputTriplet(visit, "(", " >> ", ")"); break;
case EOpBitwiseAnd: outputTriplet(visit, "(", " & ", ")"); break; case EOpBitwiseAnd: outputTriplet(visit, "(", " & ", ")"); break;
......
...@@ -511,7 +511,7 @@ multiplicative_expression ...@@ -511,7 +511,7 @@ multiplicative_expression
} }
| multiplicative_expression PERCENT unary_expression { | multiplicative_expression PERCENT unary_expression {
ES3_ONLY("%", @2, "integer modulus operator"); ES3_ONLY("%", @2, "integer modulus operator");
$$ = context->addBinaryMath(EOpMod, $1, $3, @2); $$ = context->addBinaryMath(EOpIMod, $1, $3, @2);
} }
; ;
...@@ -646,7 +646,7 @@ assignment_operator ...@@ -646,7 +646,7 @@ assignment_operator
| DIV_ASSIGN { $$.op = EOpDivAssign; } | DIV_ASSIGN { $$.op = EOpDivAssign; }
| MOD_ASSIGN { | MOD_ASSIGN {
ES3_ONLY("%=", @$, "integer modulus operator"); ES3_ONLY("%=", @$, "integer modulus operator");
$$.op = EOpModAssign; $$.op = EOpIModAssign;
} }
| ADD_ASSIGN { $$.op = EOpAddAssign; } | ADD_ASSIGN { $$.op = EOpAddAssign; }
| SUB_ASSIGN { $$.op = EOpSubAssign; } | SUB_ASSIGN { $$.op = EOpSubAssign; }
......
...@@ -2760,7 +2760,7 @@ yyreduce: ...@@ -2760,7 +2760,7 @@ yyreduce:
{ {
ES3_ONLY("%", (yylsp[-1]), "integer modulus operator"); 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; break;
...@@ -3026,7 +3026,7 @@ yyreduce: ...@@ -3026,7 +3026,7 @@ yyreduce:
{ {
ES3_ONLY("%=", (yyloc), "integer modulus operator"); ES3_ONLY("%=", (yyloc), "integer modulus operator");
(yyval.interm).op = EOpModAssign; (yyval.interm).op = EOpIModAssign;
} }
break; break;
......
...@@ -131,7 +131,7 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary *node) ...@@ -131,7 +131,7 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary *node)
case EOpDivAssign: case EOpDivAssign:
out << "divide second child into first child"; out << "divide second child into first child";
break; break;
case EOpModAssign: case EOpIModAssign:
out << "modulo second child into first child"; out << "modulo second child into first child";
break; break;
case EOpBitShiftLeftAssign: case EOpBitShiftLeftAssign:
...@@ -178,7 +178,7 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary *node) ...@@ -178,7 +178,7 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary *node)
case EOpDiv: case EOpDiv:
out << "divide"; out << "divide";
break; break;
case EOpMod: case EOpIMod:
out << "modulo"; out << "modulo";
break; break;
case EOpBitShiftLeft: case EOpBitShiftLeft:
......
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