1
0
Fork 0
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:
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) 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()))

View file

@ -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