1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00

Did proper badOps handling for both arg0 and arg1 being immediates

This commit is contained in:
Brian Fiete 2021-12-30 06:56:00 -05:00
parent 60c19c4160
commit eb0cd3aefb
2 changed files with 17 additions and 4 deletions

View file

@ -9060,7 +9060,15 @@ bool BeMCContext::DoLegalization()
if (isMov_R64_IMM64)
doStdCheck = false;
bool is3FormMul = false;
if ((isIntMul) && (inst->mResult))
bool badOps = false;
// Two immediates are never allowed. This can happen in cases like '(a % 1) * 2'
if ((arg0.IsImmediate()) && (arg1.IsImmediate()))
{
badOps = true;
doStdCheck = true;
}
else if ((isIntMul) && (inst->mResult))
{
is3FormMul = true;
if (inst->mArg1.IsImmediateInt())
@ -9083,7 +9091,6 @@ bool BeMCContext::DoLegalization()
}
}
// Int 3-form mul does not follow these rules
if (doStdCheck)
{
@ -9091,7 +9098,6 @@ bool BeMCContext::DoLegalization()
isIncOrDec = (((inst->mKind == BeMCInstKind_Add) || (inst->mKind == BeMCInstKind_Sub)) &&
(arg1.IsImmediateInt()) && (arg1.mImmediate == 1));
bool badOps = false;
if ((!isIncOrDec) && (!isIntMul) && (!isIntDiv))
{
if ((arg0.MayBeMemory()) && (arg1.MayBeMemory()))

View file

@ -377,6 +377,8 @@ namespace Tests
}
}
public struct Vector2 : this(float x, float y);
[Test]
public static void TestBasics()
{
@ -492,6 +494,11 @@ namespace Tests
let oai2 = OuterOp2<float>.InnerOp<int>.Op(2.0f, 200);
Test.Assert(oai2 == 202.0f);*/
const int c0 = 1;
const int32 c1 = 1;
int i0 = 0;
var tVal = Vector2((i0 % c0) * (c1 + c1), 1);
}
struct IntStruct