mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 11:38:21 +02:00
Did proper badOps handling for both arg0 and arg1 being immediates
This commit is contained in:
parent
60c19c4160
commit
eb0cd3aefb
2 changed files with 17 additions and 4 deletions
|
@ -9060,7 +9060,15 @@ bool BeMCContext::DoLegalization()
|
||||||
if (isMov_R64_IMM64)
|
if (isMov_R64_IMM64)
|
||||||
doStdCheck = false;
|
doStdCheck = false;
|
||||||
bool is3FormMul = 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;
|
is3FormMul = true;
|
||||||
if (inst->mArg1.IsImmediateInt())
|
if (inst->mArg1.IsImmediateInt())
|
||||||
|
@ -9083,15 +9091,13 @@ bool BeMCContext::DoLegalization()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Int 3-form mul does not follow these rules
|
// Int 3-form mul does not follow these rules
|
||||||
if (doStdCheck)
|
if (doStdCheck)
|
||||||
{
|
{
|
||||||
bool isIncOrDec = false;
|
bool isIncOrDec = false;
|
||||||
isIncOrDec = (((inst->mKind == BeMCInstKind_Add) || (inst->mKind == BeMCInstKind_Sub)) &&
|
isIncOrDec = (((inst->mKind == BeMCInstKind_Add) || (inst->mKind == BeMCInstKind_Sub)) &&
|
||||||
(arg1.IsImmediateInt()) && (arg1.mImmediate == 1));
|
(arg1.IsImmediateInt()) && (arg1.mImmediate == 1));
|
||||||
|
|
||||||
bool badOps = false;
|
|
||||||
if ((!isIncOrDec) && (!isIntMul) && (!isIntDiv))
|
if ((!isIncOrDec) && (!isIntMul) && (!isIntDiv))
|
||||||
{
|
{
|
||||||
if ((arg0.MayBeMemory()) && (arg1.MayBeMemory()))
|
if ((arg0.MayBeMemory()) && (arg1.MayBeMemory()))
|
||||||
|
|
|
@ -377,6 +377,8 @@ namespace Tests
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public struct Vector2 : this(float x, float y);
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public static void TestBasics()
|
public static void TestBasics()
|
||||||
{
|
{
|
||||||
|
@ -492,6 +494,11 @@ namespace Tests
|
||||||
|
|
||||||
let oai2 = OuterOp2<float>.InnerOp<int>.Op(2.0f, 200);
|
let oai2 = OuterOp2<float>.InnerOp<int>.Op(2.0f, 200);
|
||||||
Test.Assert(oai2 == 202.0f);*/
|
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
|
struct IntStruct
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue