1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-22 01:37:59 +02:00

Improvements to overflow arithmetic

This commit is contained in:
Brian Fiete 2022-01-11 10:36:22 -05:00
parent eb375362a1
commit bf97431cdb
12 changed files with 91 additions and 45 deletions

View file

@ -1513,6 +1513,12 @@ const char* Beefy::BfTokenToString(BfToken token)
return "&+";
case BfToken_AndStar:
return "&*";
case BfToken_AndMinusEquals:
return "&-=";
case BfToken_AndPlusEquals:
return "&+=";
case BfToken_AndStarEquals:
return "&*=";
case BfToken_OrEquals:
return "|=";
case BfToken_XorEquals:
@ -1620,6 +1626,12 @@ BfBinaryOp Beefy::BfAssignOpToBinaryOp(BfAssignmentOp assignmentOp)
return BfBinaryOp_Multiply;
case BfAssignmentOp_Divide:
return BfBinaryOp_Divide;
case BfAssignmentOp_OverflowAdd:
return BfBinaryOp_OverflowAdd;
case BfAssignmentOp_OverflowSubtract:
return BfBinaryOp_OverflowSubtract;
case BfAssignmentOp_OverflowMultiply:
return BfBinaryOp_OverflowMultiply;
case BfAssignmentOp_Modulus:
return BfBinaryOp_Modulus;
case BfAssignmentOp_ShiftLeft:
@ -1898,7 +1910,13 @@ BfAssignmentOp Beefy::BfTokenToAssignmentOp(BfToken token)
case BfToken_MinusEquals:
return BfAssignmentOp_Subtract;
case BfToken_MultiplyEquals:
return BfAssignmentOp_Multiply;
return BfAssignmentOp_Multiply;
case BfToken_AndPlusEquals:
return BfAssignmentOp_OverflowAdd;
case BfToken_AndMinusEquals:
return BfAssignmentOp_OverflowSubtract;
case BfToken_AndStarEquals:
return BfAssignmentOp_OverflowMultiply;
case BfToken_DivideEquals:
return BfAssignmentOp_Divide;
case BfToken_ModulusEquals:

View file

@ -205,7 +205,6 @@ enum BfToken : uint8
BfToken_PlusEquals,
BfToken_MinusEquals,
BfToken_MultiplyEquals,
BfToken_DivideEquals,
BfToken_ModulusEquals,
BfToken_ShiftLeftEquals,
@ -214,6 +213,9 @@ enum BfToken : uint8
BfToken_AndMinus,
BfToken_AndPlus,
BfToken_AndStar,
BfToken_AndMinusEquals,
BfToken_AndPlusEquals,
BfToken_AndStarEquals,
BfToken_OrEquals,
BfToken_XorEquals,
BfToken_NullCoalsceEquals,
@ -1843,6 +1845,9 @@ enum BfAssignmentOp
BfAssignmentOp_Add,
BfAssignmentOp_Subtract,
BfAssignmentOp_Multiply,
BfAssignmentOp_OverflowAdd,
BfAssignmentOp_OverflowSubtract,
BfAssignmentOp_OverflowMultiply,
BfAssignmentOp_Divide,
BfAssignmentOp_Modulus,
BfAssignmentOp_ShiftLeft,

View file

@ -22667,6 +22667,8 @@ void BfExprEvaluator::PerformBinaryOperation(BfType* resultType, BfIRValue convL
auto _GetOverflowKind = [&](bool wantOverflow)
{
if (resultType->IsFloat())
return BfOverflowCheckKind_None;
if (!wantOverflow)
return BfOverflowCheckKind_None;
if (mModule->GetDefaultCheckedKind() != BfCheckedKind_Checked)

View file

@ -1559,17 +1559,35 @@ void BfParser::NextToken(int endIdx, bool outerIsInterpolate)
}
else if (mSrc[mSrcIdx] == '+')
{
mToken = BfToken_AndPlus;
if (mSrc[mSrcIdx + 1] == '=')
{
mToken = BfToken_AndPlusEquals;
++mSrcIdx;
}
else
mToken = BfToken_AndPlus;
mTokenEnd = ++mSrcIdx;
}
else if (mSrc[mSrcIdx] == '-')
{
mToken = BfToken_AndMinus;
if (mSrc[mSrcIdx + 1] == '=')
{
mToken = BfToken_AndMinusEquals;
++mSrcIdx;
}
else
mToken = BfToken_AndMinus;
mTokenEnd = ++mSrcIdx;
}
else if (mSrc[mSrcIdx] == '*')
{
mToken = BfToken_AndStar;
if (mSrc[mSrcIdx + 1] == '=')
{
mToken = BfToken_AndStarEquals;
++mSrcIdx;
}
else
mToken = BfToken_AndStar;
mTokenEnd = ++mSrcIdx;
}
else