Improve pointer compare constant folding
This commit is contained in:
parent
fd7e68573c
commit
f16c24363c
|
@ -3462,94 +3462,151 @@ ByteCode ByteCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const
|
||||||
{
|
{
|
||||||
if (ins->mSrc[1].mTemp < 0)
|
if (ins->mSrc[1].mTemp < 0)
|
||||||
{
|
{
|
||||||
ByteCodeInstruction lins(BC_LOAD_REG_16);
|
if (ins->mSrc[1].mType == IT_INT16 || ins->mSrc[1].mMemory == IM_ABSOLUTE)
|
||||||
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
|
|
||||||
lins.mRegisterFinal = ins->mSrc[0].mFinal;
|
|
||||||
mIns.Push(lins);
|
|
||||||
if (csigned)
|
|
||||||
{
|
{
|
||||||
ByteCodeInstruction cins(BC_BINOP_CMPSI_16);
|
ByteCodeInstruction lins(BC_LOAD_REG_16);
|
||||||
cins.mValue = int(ins->mSrc[1].mIntConst);
|
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
|
||||||
mIns.Push(cins);
|
lins.mRegisterFinal = ins->mSrc[0].mFinal;
|
||||||
}
|
mIns.Push(lins);
|
||||||
else
|
|
||||||
{
|
if (csigned)
|
||||||
ByteCodeInstruction cins(BC_BINOP_CMPUI_16);
|
|
||||||
cins.mValue = int(ins->mSrc[1].mIntConst);
|
|
||||||
mIns.Push(cins);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (ins->mSrc[0].mTemp < 0)
|
|
||||||
{
|
|
||||||
ByteCodeInstruction lins(BC_LOAD_REG_16);
|
|
||||||
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
|
|
||||||
lins.mRegisterFinal = ins->mSrc[1].mFinal;
|
|
||||||
mIns.Push(lins);
|
|
||||||
if (csigned)
|
|
||||||
{
|
|
||||||
if (optzero && ins->mSrc[0].mIntConst == 0)
|
|
||||||
{
|
|
||||||
switch (ins->mOperator)
|
|
||||||
{
|
|
||||||
case IA_CMPEQ:
|
|
||||||
return BC_BRANCHS_EQ;
|
|
||||||
case IA_CMPNE:
|
|
||||||
return BC_BRANCHS_NE;
|
|
||||||
case IA_CMPLES:
|
|
||||||
return BC_BRANCHS_LE;
|
|
||||||
case IA_CMPGS:
|
|
||||||
return BC_BRANCHS_GT;
|
|
||||||
case IA_CMPGES:
|
|
||||||
return BC_BRANCHS_GE;
|
|
||||||
case IA_CMPLS:
|
|
||||||
return BC_BRANCHS_LT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (ins->mSrc[1].IsUByte())
|
|
||||||
{
|
|
||||||
ByteCodeInstruction cins(BC_BINOP_CMPUI_8);
|
|
||||||
cins.mValue = int(ins->mSrc[0].mIntConst);
|
|
||||||
mIns.Push(cins);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
ByteCodeInstruction cins(BC_BINOP_CMPSI_16);
|
ByteCodeInstruction cins(BC_BINOP_CMPSI_16);
|
||||||
cins.mValue = int(ins->mSrc[0].mIntConst);
|
cins.mValue = int(ins->mSrc[1].mIntConst);
|
||||||
mIns.Push(cins);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (optzero && ins->mSrc[0].mIntConst == 0)
|
|
||||||
{
|
|
||||||
switch (ins->mOperator)
|
|
||||||
{
|
|
||||||
case IA_CMPEQ:
|
|
||||||
case IA_CMPLEU:
|
|
||||||
return BC_BRANCHS_EQ;
|
|
||||||
case IA_CMPNE:
|
|
||||||
case IA_CMPGU:
|
|
||||||
return BC_BRANCHS_NE;
|
|
||||||
case IA_CMPGEU:
|
|
||||||
return BC_JUMPS;
|
|
||||||
case IA_CMPLU:
|
|
||||||
return BC_NOP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (ins->mSrc[1].IsUByte())
|
|
||||||
{
|
|
||||||
ByteCodeInstruction cins(BC_BINOP_CMPUI_8);
|
|
||||||
cins.mValue = int(ins->mSrc[0].mIntConst);
|
|
||||||
mIns.Push(cins);
|
mIns.Push(cins);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ByteCodeInstruction cins(BC_BINOP_CMPUI_16);
|
ByteCodeInstruction cins(BC_BINOP_CMPUI_16);
|
||||||
cins.mValue = int(ins->mSrc[0].mIntConst);
|
cins.mValue = int(ins->mSrc[1].mIntConst);
|
||||||
|
mIns.Push(cins);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ByteCodeInstruction bins(BC_LEA_ABS);
|
||||||
|
bins.mRegister = BC_REG_ACCU;
|
||||||
|
bins.mLinkerObject = ins->mSrc[1].mLinkerObject;
|
||||||
|
bins.mValue = int(ins->mSrc[1].mIntConst);
|
||||||
|
bins.mRelocate = true;
|
||||||
|
mIns.Push(bins);
|
||||||
|
|
||||||
|
if (csigned)
|
||||||
|
{
|
||||||
|
ByteCodeInstruction cins(BC_BINOP_CMPSR_16);
|
||||||
|
cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
|
||||||
|
cins.mRegisterFinal = ins->mSrc[0].mFinal;
|
||||||
|
mIns.Push(cins);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ByteCodeInstruction cins(BC_BINOP_CMPUR_16);
|
||||||
|
cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
|
||||||
|
cins.mRegisterFinal = ins->mSrc[0].mFinal;
|
||||||
|
mIns.Push(cins);
|
||||||
|
}
|
||||||
|
|
||||||
|
code = TransposeBranchCondition(code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ins->mSrc[0].mTemp < 0)
|
||||||
|
{
|
||||||
|
if (ins->mSrc[0].mType == IT_INT16 || ins->mSrc[0].mMemory == IM_ABSOLUTE)
|
||||||
|
{
|
||||||
|
ByteCodeInstruction lins(BC_LOAD_REG_16);
|
||||||
|
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
|
||||||
|
lins.mRegisterFinal = ins->mSrc[1].mFinal;
|
||||||
|
mIns.Push(lins);
|
||||||
|
if (csigned)
|
||||||
|
{
|
||||||
|
if (optzero && ins->mSrc[0].mIntConst == 0)
|
||||||
|
{
|
||||||
|
switch (ins->mOperator)
|
||||||
|
{
|
||||||
|
case IA_CMPEQ:
|
||||||
|
return BC_BRANCHS_EQ;
|
||||||
|
case IA_CMPNE:
|
||||||
|
return BC_BRANCHS_NE;
|
||||||
|
case IA_CMPLES:
|
||||||
|
return BC_BRANCHS_LE;
|
||||||
|
case IA_CMPGS:
|
||||||
|
return BC_BRANCHS_GT;
|
||||||
|
case IA_CMPGES:
|
||||||
|
return BC_BRANCHS_GE;
|
||||||
|
case IA_CMPLS:
|
||||||
|
return BC_BRANCHS_LT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ins->mSrc[1].IsUByte())
|
||||||
|
{
|
||||||
|
ByteCodeInstruction cins(BC_BINOP_CMPUI_8);
|
||||||
|
cins.mValue = int(ins->mSrc[0].mIntConst);
|
||||||
|
mIns.Push(cins);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ByteCodeInstruction cins(BC_BINOP_CMPSI_16);
|
||||||
|
cins.mValue = int(ins->mSrc[0].mIntConst);
|
||||||
|
mIns.Push(cins);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (optzero && ins->mSrc[0].mIntConst == 0)
|
||||||
|
{
|
||||||
|
switch (ins->mOperator)
|
||||||
|
{
|
||||||
|
case IA_CMPEQ:
|
||||||
|
case IA_CMPLEU:
|
||||||
|
return BC_BRANCHS_EQ;
|
||||||
|
case IA_CMPNE:
|
||||||
|
case IA_CMPGU:
|
||||||
|
return BC_BRANCHS_NE;
|
||||||
|
case IA_CMPGEU:
|
||||||
|
return BC_JUMPS;
|
||||||
|
case IA_CMPLU:
|
||||||
|
return BC_NOP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ins->mSrc[1].IsUByte())
|
||||||
|
{
|
||||||
|
ByteCodeInstruction cins(BC_BINOP_CMPUI_8);
|
||||||
|
cins.mValue = int(ins->mSrc[0].mIntConst);
|
||||||
|
mIns.Push(cins);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ByteCodeInstruction cins(BC_BINOP_CMPUI_16);
|
||||||
|
cins.mValue = int(ins->mSrc[0].mIntConst);
|
||||||
|
mIns.Push(cins);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
code = TransposeBranchCondition(code);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ByteCodeInstruction bins(BC_LEA_ABS);
|
||||||
|
bins.mRegister = BC_REG_ACCU;
|
||||||
|
bins.mLinkerObject = ins->mSrc[0].mLinkerObject;
|
||||||
|
bins.mValue = int(ins->mSrc[0].mIntConst);
|
||||||
|
bins.mRelocate = true;
|
||||||
|
mIns.Push(bins);
|
||||||
|
|
||||||
|
if (csigned)
|
||||||
|
{
|
||||||
|
ByteCodeInstruction cins(BC_BINOP_CMPSR_16);
|
||||||
|
cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
|
||||||
|
cins.mRegisterFinal = ins->mSrc[1].mFinal;
|
||||||
|
mIns.Push(cins);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ByteCodeInstruction cins(BC_BINOP_CMPUR_16);
|
||||||
|
cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
|
||||||
|
cins.mRegisterFinal = ins->mSrc[1].mFinal;
|
||||||
mIns.Push(cins);
|
mIns.Push(cins);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
code = TransposeBranchCondition(code);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -4616,7 +4616,7 @@ bool InterInstruction::PropagateConstTemps(const GrowingInstructionPtrArray& cte
|
||||||
InterType t = mSrc[i].mType;
|
InterType t = mSrc[i].mType;
|
||||||
InterInstruction* ains = ctemps[mSrc[i].mTemp];
|
InterInstruction* ains = ctemps[mSrc[i].mTemp];
|
||||||
|
|
||||||
if (t != IT_POINTER || ains->mConst.mMemory == IM_ABSOLUTE)
|
if (t != IT_POINTER || ains->mConst.mMemory == IM_ABSOLUTE || ains->mConst.mMemory == IM_GLOBAL)
|
||||||
{
|
{
|
||||||
mSrc[i] = ains->mConst;
|
mSrc[i] = ains->mConst;
|
||||||
mSrc[i].mType = t;
|
mSrc[i].mType = t;
|
||||||
|
@ -24631,7 +24631,7 @@ void InterCodeProcedure::Close(void)
|
||||||
{
|
{
|
||||||
GrowingTypeArray tstack(IT_NONE);
|
GrowingTypeArray tstack(IT_NONE);
|
||||||
|
|
||||||
CheckFunc = !strcmp(mIdent->mString, "edit_line");
|
CheckFunc = !strcmp(mIdent->mString, "test_copy_ainit");
|
||||||
CheckCase = false;
|
CheckCase = false;
|
||||||
|
|
||||||
mEntryBlock = mBlocks[0];
|
mEntryBlock = mBlocks[0];
|
||||||
|
|
Loading…
Reference in New Issue