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:
parent
eb375362a1
commit
bf97431cdb
12 changed files with 91 additions and 45 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -564,6 +564,7 @@ class BeMCInst
|
|||
{
|
||||
public:
|
||||
BeMCInstKind mKind;
|
||||
bool mDisableShortForm;
|
||||
|
||||
BeMCOperand mResult;
|
||||
BeMCOperand mArg0;
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue