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
case EOpMatrixTimesScalarAssign:
case EOpMatrixTimesMatrixAssign:
case EOpDivAssign:
case EOpModAssign:
case EOpIModAssign:
case EOpBitShiftLeftAssign:
case EOpBitShiftRightAssign:
case EOpBitwiseAndAssign:
......@@ -605,7 +605,7 @@ bool TIntermBinary::promote(TInfoSink &infoSink)
case EOpAdd:
case EOpSub:
case EOpDiv:
case EOpMod:
case EOpIMod:
case EOpBitShiftLeft:
case EOpBitShiftRight:
case EOpBitwiseAnd:
......@@ -614,7 +614,7 @@ bool TIntermBinary::promote(TInfoSink &infoSink)
case EOpAddAssign:
case EOpSubAssign:
case EOpDivAssign:
case EOpModAssign:
case EOpIModAssign:
case EOpBitShiftLeftAssign:
case EOpBitShiftRightAssign:
case EOpBitwiseAndAssign:
......@@ -792,7 +792,7 @@ TIntermTyped *TIntermConstantUnion::fold(
break;
case EOpDiv:
case EOpMod:
case EOpIMod:
{
tempConstArray = new ConstantUnion[objectSize];
for (size_t i = 0; i < objectSize; i++)
......
......@@ -80,7 +80,7 @@ TIntermTyped *TIntermediate::addBinaryMath(
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)
{
......
......@@ -27,6 +27,7 @@ const char *GetOperatorString(TOperator op)
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 @@ const char *GetOperatorString(TOperator op)
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 @@ const char *GetOperatorString(TOperator op)
case EOpMatrixTimesMatrixAssign: return "*=";
case EOpDivAssign: return "/=";
case EOpModAssign: return "%=";
case EOpIModAssign: return "%=";
case EOpBitShiftLeftAssign: return "<<=";
case EOpBitShiftRightAssign: return ">>=";
case EOpBitwiseAndAssign: return "&=";
......
......@@ -46,6 +46,7 @@ enum TOperator
EOpSub,
EOpMul,
EOpDiv,
EOpIMod,
EOpEqual,
EOpNotEqual,
EOpVectorEqual,
......@@ -205,7 +206,7 @@ enum TOperator
EOpMatrixTimesMatrixAssign,
EOpDivAssign,
EOpModAssign,
EOpIModAssign,
EOpBitShiftLeftAssign,
EOpBitShiftRightAssign,
EOpBitwiseAndAssign,
......
......@@ -223,7 +223,7 @@ bool TOutputGLSLBase::visitBinary(Visit visit, TIntermBinary *node)
case EOpDivAssign:
writeTriplet(visit, "(", " /= ", ")");
break;
case EOpModAssign:
case EOpIModAssign:
writeTriplet(visit, "(", " %= ", ")");
break;
// Notice the fall-through.
......@@ -358,7 +358,7 @@ bool TOutputGLSLBase::visitBinary(Visit visit, TIntermBinary *node)
case EOpDiv:
writeTriplet(visit, "(", " / ", ")");
break;
case EOpMod:
case EOpIMod:
writeTriplet(visit, "(", " % ", ")");
break;
case EOpBitShiftLeft:
......
......@@ -1430,7 +1430,7 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
}
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 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
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;
......
......@@ -511,7 +511,7 @@ multiplicative_expression
}
| 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 @@ assignment_operator
| DIV_ASSIGN { $$.op = EOpDivAssign; }
| MOD_ASSIGN {
ES3_ONLY("%=", @$, "integer modulus operator");
$$.op = EOpModAssign;
$$.op = EOpIModAssign;
}
| ADD_ASSIGN { $$.op = EOpAddAssign; }
| SUB_ASSIGN { $$.op = EOpSubAssign; }
......
......@@ -2760,7 +2760,7 @@ yyreduce:
{
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 @@ yyreduce:
{
ES3_ONLY("%=", (yyloc), "integer modulus operator");
(yyval.interm).op = EOpModAssign;
(yyval.interm).op = EOpIModAssign;
}
break;
......
......@@ -131,7 +131,7 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary *node)
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 @@ bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary *node)
case EOpDiv:
out << "divide";
break;
case EOpMod:
case EOpIMod:
out << "modulo";
break;
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