1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-30 05:15: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

@ -9226,7 +9226,7 @@ bool BeMCContext::DoLegalization()
else
{
bool addCanBeLEA =
((inst->mKind == BeMCInstKind_Sub) || (inst->mKind == BeMCInstKind_Add)) &&
((inst->mKind == BeMCInstKind_Sub) || (inst->mKind == BeMCInstKind_Add)) && (!inst->mDisableShortForm) &&
(arg0Type->mSize >= 2) && // Int8s don't have an LEA
(GetFixedOperand(inst->mResult).IsNativeReg()) && (arg0.IsNativeReg()) && (arg1.IsImmediateInt());
@ -10209,7 +10209,7 @@ bool BeMCContext::DoLegalization()
handled = true;
}
if (handled)
if (!handled)
{
if (inst->mResult)
{
@ -14338,6 +14338,7 @@ void BeMCContext::DoCodeEmission()
{
if ((inst->mResult) && (inst->mResult != inst->mArg0))
{
BF_ASSERT(!inst->mDisableShortForm);
BF_ASSERT(inst->mResult.IsNativeReg());
BF_ASSERT(inst->mArg0.IsNativeReg());
BF_ASSERT(inst->mArg1.IsImmediate());
@ -14538,9 +14539,9 @@ void BeMCContext::DoCodeEmission()
if (result)
{
BF_ASSERT(inst->mArg1.IsImmediate());
if ((inst->mArg0.IsNativeReg()) &&
if ((inst->mArg0.IsNativeReg()) && (!inst->mDisableShortForm) &&
((inst->mArg1.mImmediate == 2) || (inst->mArg1.mImmediate == 4) || (inst->mArg1.mImmediate == 8)))
{
{
// LEA form
auto resultType = GetType(inst->mArg0);
if (resultType->mTypeCode != BeTypeCode_Int8)
@ -16030,6 +16031,7 @@ BeMCOperand BeMCContext::AllocBinaryOp(BeMCInstKind instKind, const BeMCOperand&
if (overflowCheckKind != BeMCOverflowCheckKind_None)
{
mcInst->mDisableShortForm = true;
AllocInst(BeMCInstKind_CondBr, BeMCOperand::FromImmediate(1), BeMCOperand::FromCmpKind((overflowCheckKind == BeMCOverflowCheckKind_B) ? BeCmpKind_NB : BeCmpKind_NO));
AllocInst(BeMCInstKind_DbgBreak);
}

View file

@ -564,6 +564,7 @@ class BeMCInst
{
public:
BeMCInstKind mKind;
bool mDisableShortForm;
BeMCOperand mResult;
BeMCOperand mArg0;

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