Fix double condition propagation
This commit is contained in:
parent
100608e0ac
commit
4633631d7e
|
@ -16135,40 +16135,99 @@ bool InterCodeBasicBlock::ShortcutDuplicateBranches(void)
|
|||
if (sz >= 2 && mInstructions[sz - 1]->mCode == IC_BRANCH && mInstructions[sz - 2]->mCode == IC_RELATIONAL_OPERATOR && mInstructions[sz - 1]->mSrc[0].mTemp == mInstructions[sz - 2]->mDst.mTemp)
|
||||
{
|
||||
InterInstruction* cins = mInstructions[sz - 2];
|
||||
InterInstruction* bins = mInstructions[sz - 1];
|
||||
|
||||
if (mTrueJump->mInstructions.Size() == 2 && mTrueJump->mInstructions[0]->mCode == IC_RELATIONAL_OPERATOR && mTrueJump->mInstructions[1]->mCode == IC_BRANCH && mTrueJump->mInstructions[0]->mDst.mTemp == mTrueJump->mInstructions[1]->mSrc[0].mTemp)
|
||||
{
|
||||
InterInstruction* tcins = mTrueJump->mInstructions[0];
|
||||
InterInstruction* tbins = mTrueJump->mInstructions[1];
|
||||
|
||||
if (cins->mSrc[0].IsEqual(tcins->mSrc[0]) && cins->mSrc[1].IsEqual(tcins->mSrc[1]))
|
||||
{
|
||||
if (cins->mOperator == tcins->mOperator)
|
||||
if (tbins->mSrc[0].mFinal)
|
||||
{
|
||||
if (ChangeTrueJump(mTrueJump->mTrueJump))
|
||||
changed = true;
|
||||
if (cins->mOperator == tcins->mOperator)
|
||||
{
|
||||
if (ChangeTrueJump(mTrueJump->mTrueJump))
|
||||
changed = true;
|
||||
}
|
||||
else if (cins->mOperator == InvertRelational(tcins->mOperator))
|
||||
{
|
||||
if (ChangeTrueJump(mTrueJump->mFalseJump))
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
else if (cins->mOperator == InvertRelational(tcins->mOperator))
|
||||
else if (bins->mSrc[0].mFinal)
|
||||
{
|
||||
if (ChangeTrueJump(mTrueJump->mFalseJump))
|
||||
changed = true;
|
||||
if (cins->mOperator == tcins->mOperator)
|
||||
{
|
||||
if (ChangeTrueJump(mTrueJump->mTrueJump))
|
||||
{
|
||||
bins->mSrc[0].mTemp = cins->mDst.mTemp = tcins->mDst.mTemp;
|
||||
bins->mSrc[0].mFinal = false;
|
||||
mExitRequiredTemps += bins->mSrc[0].mTemp;
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
else if (cins->mOperator == InvertRelational(tcins->mOperator))
|
||||
{
|
||||
if (ChangeTrueJump(mTrueJump->mFalseJump))
|
||||
{
|
||||
bins->mSrc[0].mTemp = cins->mDst.mTemp = tcins->mDst.mTemp;
|
||||
bins->mSrc[0].mFinal = false;
|
||||
cins->mOperator = tcins->mOperator;
|
||||
mExitRequiredTemps += bins->mSrc[0].mTemp;
|
||||
InterCodeBasicBlock* t = mTrueJump; mTrueJump = mFalseJump; mFalseJump = t;
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mFalseJump->mInstructions.Size() == 2 && mFalseJump->mInstructions[0]->mCode == IC_RELATIONAL_OPERATOR && mFalseJump->mInstructions[1]->mCode == IC_BRANCH && mFalseJump->mInstructions[0]->mDst.mTemp == mFalseJump->mInstructions[1]->mSrc[0].mTemp)
|
||||
{
|
||||
InterInstruction* tcins = mFalseJump->mInstructions[0];
|
||||
InterInstruction* tbins = mFalseJump->mInstructions[1];
|
||||
|
||||
if (cins->mSrc[0].IsEqual(tcins->mSrc[0]) && cins->mSrc[1].IsEqual(tcins->mSrc[1]))
|
||||
{
|
||||
if (cins->mOperator == tcins->mOperator)
|
||||
if (tbins->mSrc[0].mFinal)
|
||||
{
|
||||
if (ChangeFalseJump(mFalseJump->mFalseJump))
|
||||
changed = true;
|
||||
if (cins->mOperator == tcins->mOperator)
|
||||
{
|
||||
if (ChangeFalseJump(mFalseJump->mFalseJump))
|
||||
changed = true;
|
||||
}
|
||||
else if (cins->mOperator == InvertRelational(tcins->mOperator))
|
||||
{
|
||||
if (ChangeFalseJump(mFalseJump->mTrueJump))
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
else if (cins->mOperator == InvertRelational(tcins->mOperator))
|
||||
else if (bins->mSrc[0].mFinal)
|
||||
{
|
||||
if (ChangeFalseJump(mFalseJump->mTrueJump))
|
||||
changed = true;
|
||||
if (cins->mOperator == tcins->mOperator)
|
||||
{
|
||||
if (ChangeFalseJump(mFalseJump->mFalseJump))
|
||||
{
|
||||
bins->mSrc[0].mTemp = cins->mDst.mTemp = tcins->mDst.mTemp;
|
||||
bins->mSrc[0].mFinal = false;
|
||||
mExitRequiredTemps += bins->mSrc[0].mTemp;
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
else if (cins->mOperator == InvertRelational(tcins->mOperator))
|
||||
{
|
||||
if (ChangeFalseJump(mFalseJump->mTrueJump))
|
||||
{
|
||||
bins->mSrc[0].mTemp = cins->mDst.mTemp = tcins->mDst.mTemp;
|
||||
bins->mSrc[0].mFinal = false;
|
||||
cins->mOperator = tcins->mOperator;
|
||||
mExitRequiredTemps += bins->mSrc[0].mTemp;
|
||||
InterCodeBasicBlock* t = mTrueJump; mTrueJump = mFalseJump; mFalseJump = t;
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -24572,7 +24631,7 @@ void InterCodeProcedure::Close(void)
|
|||
{
|
||||
GrowingTypeArray tstack(IT_NONE);
|
||||
|
||||
CheckFunc = !strcmp(mIdent->mString, "main");
|
||||
CheckFunc = !strcmp(mIdent->mString, "edit_line");
|
||||
CheckCase = false;
|
||||
|
||||
mEntryBlock = mBlocks[0];
|
||||
|
|
|
@ -29,7 +29,7 @@ const char MissileChars[] = {
|
|||
#define Charset ((char *)0xd800)
|
||||
|
||||
// Joystick and crosshair control
|
||||
int CrossX = 160, CrossY = 100;
|
||||
volatile int CrossX = 160, CrossY = 100;
|
||||
bool CrossP = false;
|
||||
char CrossDelay = 0;
|
||||
|
||||
|
@ -553,20 +553,22 @@ __interrupt void joy_interrupt()
|
|||
joy_poll(0);
|
||||
|
||||
// Move crosshair coordinates
|
||||
CrossX += 2 * joyx[0]; CrossY += 2 * joyy[0];
|
||||
int cx = CrossX + 2 * joyx[0], cy = CrossY + 2 * joyy[0];
|
||||
|
||||
// Stop at edges of screen
|
||||
if (CrossX < 8)
|
||||
CrossX = 8;
|
||||
else if (CrossX > 312)
|
||||
CrossX = 312;
|
||||
if (CrossY < 20)
|
||||
CrossY = 20;
|
||||
else if (CrossY > 172)
|
||||
CrossY = 172;
|
||||
if (cx < 8)
|
||||
cx = 8;
|
||||
else if (cx > 312)
|
||||
cx = 312;
|
||||
if (cy < 20)
|
||||
cy = 20;
|
||||
else if (cy > 172)
|
||||
cy = 172;
|
||||
|
||||
// Move crosshair sprite
|
||||
spr_move(0, CrossX + 14, CrossY + 40);
|
||||
spr_move(0, cx + 14, cy + 40);
|
||||
CrossX = cx;
|
||||
CrossY = cy;
|
||||
|
||||
// Check button
|
||||
if (joyb[0])
|
||||
|
@ -697,15 +699,17 @@ void game_play(void)
|
|||
// Check if fire request
|
||||
if (CrossP)
|
||||
{
|
||||
int cx = CrossX, cy = CrossY;
|
||||
|
||||
// Find launch site
|
||||
int sx = 160;
|
||||
if (CrossX < 120)
|
||||
if (cx < 120)
|
||||
sx = 24;
|
||||
else if (CrossX > 200)
|
||||
else if (cx > 200)
|
||||
sx = 296;
|
||||
|
||||
// Fire missile
|
||||
missile_start(sx, 184, CrossX, CrossY);
|
||||
missile_start(sx, 184, cx, cy);
|
||||
|
||||
// Reset request
|
||||
CrossP = false;
|
||||
|
|
Loading…
Reference in New Issue