Optimize signed byte comparisons
This commit is contained in:
parent
40f82ba6ec
commit
f16edb1c57
|
@ -1853,7 +1853,7 @@ W1: jmp startup.exec
|
|||
#pragma bytecode(BC_BINOP_SHRI_I16, inp_binop_shri_s16)
|
||||
#pragma bytecode(BC_BINOP_SHRR_I16, inp_binop_shri_s16.inp_binop_shrr_s16)
|
||||
|
||||
__asm cmp
|
||||
__asm cmp16
|
||||
{
|
||||
inp_binop_cmpr_s16:
|
||||
lda (ip), y
|
||||
|
@ -1926,10 +1926,76 @@ inp_binop_cmpi_s16:
|
|||
beq cmp_eq
|
||||
}
|
||||
|
||||
#pragma bytecode(BC_BINOP_CMPSR_16, cmp.inp_binop_cmpr_s16)
|
||||
#pragma bytecode(BC_BINOP_CMPSI_16, cmp.inp_binop_cmpi_s16)
|
||||
#pragma bytecode(BC_BINOP_CMPUR_16, cmp.inp_binop_cmpr_u16)
|
||||
#pragma bytecode(BC_BINOP_CMPUI_16, cmp.inp_binop_cmpi_u16)
|
||||
#pragma bytecode(BC_BINOP_CMPSR_16, cmp16.inp_binop_cmpr_s16)
|
||||
#pragma bytecode(BC_BINOP_CMPSI_16, cmp16.inp_binop_cmpi_s16)
|
||||
#pragma bytecode(BC_BINOP_CMPUR_16, cmp16.inp_binop_cmpr_u16)
|
||||
#pragma bytecode(BC_BINOP_CMPUI_16, cmp16.inp_binop_cmpi_u16)
|
||||
|
||||
|
||||
__asm cmp8
|
||||
{
|
||||
inp_binop_cmpr_s8:
|
||||
lda (ip), y
|
||||
tax
|
||||
iny
|
||||
|
||||
sec
|
||||
lda $00, x
|
||||
sbc accu
|
||||
beq cmp_eq
|
||||
cmpnes:
|
||||
bvc cmpsv
|
||||
eor #$80
|
||||
cmpsv: bmi cmp_lt
|
||||
bpl cmp_gt
|
||||
|
||||
inp_binop_cmpr_u8:
|
||||
lda (ip), y
|
||||
tax
|
||||
iny
|
||||
lda $00, x
|
||||
cmp accu
|
||||
bne cmpne
|
||||
beq cmp_eq
|
||||
|
||||
inp_binop_cmpi_u8:
|
||||
lda (ip), y
|
||||
iny
|
||||
cmp accu
|
||||
bne cmpne
|
||||
cmp_eq:
|
||||
lda #0
|
||||
sta accu
|
||||
sta accu + 1
|
||||
jmp startup.exec
|
||||
cmp_lt:
|
||||
lda #$ff
|
||||
sta accu
|
||||
sta accu +1
|
||||
jmp startup.exec
|
||||
cmpne:
|
||||
bcc cmp_lt
|
||||
cmp_gt:
|
||||
lda #1
|
||||
sta accu
|
||||
lda #0
|
||||
sta accu + 1
|
||||
jmp startup.exec
|
||||
|
||||
inp_binop_cmpi_s8:
|
||||
lda (ip), y
|
||||
iny
|
||||
sec
|
||||
sbc accu
|
||||
bne cmpnes
|
||||
beq cmp_eq
|
||||
}
|
||||
|
||||
|
||||
#pragma bytecode(BC_BINOP_CMPSR_8, cmp8.inp_binop_cmpr_s8)
|
||||
#pragma bytecode(BC_BINOP_CMPSI_8, cmp8.inp_binop_cmpi_s8)
|
||||
#pragma bytecode(BC_BINOP_CMPUR_8, cmp8.inp_binop_cmpr_u8)
|
||||
#pragma bytecode(BC_BINOP_CMPUI_8, cmp8.inp_binop_cmpi_u8)
|
||||
|
||||
__asm bra
|
||||
{
|
||||
|
|
|
@ -91,6 +91,12 @@ enum ByteCode
|
|||
BC_BINOP_CMPUI_16,
|
||||
BC_BINOP_CMPSI_16,
|
||||
|
||||
BC_BINOP_CMPUR_8,
|
||||
BC_BINOP_CMPSR_8,
|
||||
|
||||
BC_BINOP_CMPUI_8,
|
||||
BC_BINOP_CMPSI_8,
|
||||
|
||||
BC_OP_NEGATE_16,
|
||||
BC_OP_INVERT_16,
|
||||
|
||||
|
@ -134,6 +140,8 @@ enum ByteCode
|
|||
BC_SET_LT,
|
||||
BC_SET_LE,
|
||||
|
||||
BC_NATIVE = 0x75,
|
||||
|
||||
BC_ENTER,
|
||||
BC_RETURN,
|
||||
BC_CALL,
|
||||
|
@ -148,8 +156,6 @@ enum ByteCode
|
|||
|
||||
BC_EXTRT,
|
||||
|
||||
BC_NATIVE = 0x75,
|
||||
|
||||
BC_CONV_I16_I32 = 0x80,
|
||||
BC_CONV_U16_U32,
|
||||
|
||||
|
|
|
@ -196,6 +196,8 @@ bool ByteCodeInstruction::ChangesRegister(uint32 reg) const
|
|||
return true;
|
||||
if (mCode >= BC_BINOP_CMPUR_16 && mCode <= BC_BINOP_CMPSI_16)
|
||||
return true;
|
||||
if (mCode >= BC_BINOP_CMPUR_8 && mCode <= BC_BINOP_CMPSI_8)
|
||||
return true;
|
||||
if (mCode >= BC_OP_NEGATE_16 && mCode <= BC_OP_INVERT_16)
|
||||
return true;
|
||||
if (mCode >= BC_BINOP_ADD_F32 && mCode <= BC_OP_CEIL_F32)
|
||||
|
@ -388,6 +390,8 @@ void ByteCodeInstruction::Assemble(ByteCodeGenerator* generator, ByteCodeBasicBl
|
|||
|
||||
case BC_BINOP_CMPUR_16:
|
||||
case BC_BINOP_CMPSR_16:
|
||||
case BC_BINOP_CMPUR_8:
|
||||
case BC_BINOP_CMPSR_8:
|
||||
block->PutCode(generator, mCode);
|
||||
block->PutByte(mRegister);
|
||||
break;
|
||||
|
@ -398,6 +402,12 @@ void ByteCodeInstruction::Assemble(ByteCodeGenerator* generator, ByteCodeBasicBl
|
|||
block->PutWord(uint16(mValue));
|
||||
break;
|
||||
|
||||
case BC_BINOP_CMPUI_8:
|
||||
case BC_BINOP_CMPSI_8:
|
||||
block->PutCode(generator, mCode);
|
||||
block->PutByte(uint8(mValue));
|
||||
break;
|
||||
|
||||
case BC_OP_NEGATE_16:
|
||||
case BC_OP_INVERT_16:
|
||||
block->PutCode(generator, mCode);
|
||||
|
@ -2416,6 +2426,69 @@ ByteCode ByteCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const
|
|||
cins.mRegisterFinal = ins->mSrc[1].mFinal;
|
||||
mIns.Push(cins);
|
||||
}
|
||||
else if (ins->mSrc[0].mType == IT_INT8)
|
||||
{
|
||||
if (ins->mSrc[1].mTemp < 0)
|
||||
{
|
||||
ByteCodeInstruction lins(BC_LOAD_REG_8);
|
||||
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_8);
|
||||
cins.mValue = ins->mSrc[1].mIntConst;
|
||||
mIns.Push(cins);
|
||||
}
|
||||
else
|
||||
{
|
||||
ByteCodeInstruction cins(BC_BINOP_CMPUI_8);
|
||||
cins.mValue = ins->mSrc[1].mIntConst;
|
||||
mIns.Push(cins);
|
||||
}
|
||||
}
|
||||
else if (ins->mSrc[0].mTemp < 0)
|
||||
{
|
||||
ByteCodeInstruction lins(BC_LOAD_REG_8);
|
||||
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
|
||||
lins.mRegisterFinal = ins->mSrc[1].mFinal;
|
||||
mIns.Push(lins);
|
||||
if (csigned)
|
||||
{
|
||||
ByteCodeInstruction cins(BC_BINOP_CMPSI_8);
|
||||
cins.mValue = ins->mSrc[0].mIntConst;
|
||||
mIns.Push(cins);
|
||||
}
|
||||
else
|
||||
{
|
||||
ByteCodeInstruction cins(BC_BINOP_CMPUI_8);
|
||||
cins.mValue = ins->mSrc[0].mIntConst;
|
||||
mIns.Push(cins);
|
||||
}
|
||||
code = TransposeBranchCondition(code);
|
||||
}
|
||||
else
|
||||
{
|
||||
ByteCodeInstruction lins(BC_LOAD_REG_8);
|
||||
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_CMPSR_8);
|
||||
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_8);
|
||||
cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
|
||||
cins.mRegisterFinal = ins->mSrc[1].mFinal;
|
||||
mIns.Push(cins);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ins->mSrc[1].mTemp < 0)
|
||||
|
|
|
@ -92,6 +92,12 @@ enum ByteCode
|
|||
BC_BINOP_CMPUI_16,
|
||||
BC_BINOP_CMPSI_16,
|
||||
|
||||
BC_BINOP_CMPUR_8,
|
||||
BC_BINOP_CMPSR_8,
|
||||
|
||||
BC_BINOP_CMPUI_8,
|
||||
BC_BINOP_CMPSI_8,
|
||||
|
||||
BC_OP_NEGATE_16,
|
||||
BC_OP_INVERT_16,
|
||||
|
||||
|
@ -135,6 +141,8 @@ enum ByteCode
|
|||
BC_SET_LT,
|
||||
BC_SET_LE,
|
||||
|
||||
BC_NATIVE = 0x75,
|
||||
|
||||
BC_ENTER,
|
||||
BC_RETURN,
|
||||
BC_CALL,
|
||||
|
@ -149,8 +157,6 @@ enum ByteCode
|
|||
|
||||
BC_EXTRT,
|
||||
|
||||
BC_NATIVE = 0x75,
|
||||
|
||||
BC_CONV_I16_I32 = 0x80,
|
||||
BC_CONV_U16_U32,
|
||||
|
||||
|
|
|
@ -343,10 +343,28 @@ void ByteCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int star
|
|||
i += 2;
|
||||
break;
|
||||
case BC_BINOP_CMPSI_16:
|
||||
fprintf(file, "CMPS\tACCU, #$%04X", uint16(memory[start + i + 0] + 256 * memory[start + i + 1]));
|
||||
fprintf(file, "CMPS\tACCU, #$%04X", int16(memory[start + i + 0] + 256 * memory[start + i + 1]));
|
||||
i += 2;
|
||||
break;
|
||||
|
||||
case BC_BINOP_CMPUR_8:
|
||||
fprintf(file, "CMPUB\tACCU, %s", TempName(memory[start + i + 0], tbuffer, proc));
|
||||
i += 1;
|
||||
break;
|
||||
case BC_BINOP_CMPSR_8:
|
||||
fprintf(file, "CMPSB\tACCU, %s", TempName(memory[start + i + 0], tbuffer, proc));
|
||||
i += 1;
|
||||
break;
|
||||
|
||||
case BC_BINOP_CMPUI_8:
|
||||
fprintf(file, "CMPUB\tACCU, #$%04X", uint8(memory[start + i + 0] + 256 * memory[start + i + 1]));
|
||||
i += 1;
|
||||
break;
|
||||
case BC_BINOP_CMPSI_8:
|
||||
fprintf(file, "CMPSB\tACCU, #$%04X", int8(memory[start + i + 0]));
|
||||
i += 1;
|
||||
break;
|
||||
|
||||
case BC_BINOP_ADD_F32:
|
||||
fprintf(file, "ADDF\tACCU, %s", TempName(memory[start + i + 0], tbuffer, proc));
|
||||
i += 1;
|
||||
|
|
|
@ -1111,6 +1111,38 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
|
|||
|
||||
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars);
|
||||
}
|
||||
else if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONVERSION_OPERATOR &&
|
||||
ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONVERSION_OPERATOR &&
|
||||
tvalue[ins->mSrc[1].mTemp]->mOperator != IA_FLOAT2INT && tvalue[ins->mSrc[1].mTemp]->mOperator != IA_INT2FLOAT &&
|
||||
tvalue[ins->mSrc[0].mTemp]->mOperator == tvalue[ins->mSrc[1].mTemp]->mOperator)
|
||||
{
|
||||
ins->mSrc[0].mType = tvalue[ins->mSrc[0].mTemp]->mSrc[0].mType;
|
||||
ins->mSrc[0].mTemp = tvalue[ins->mSrc[0].mTemp]->mSrc[0].mTemp;
|
||||
ins->mSrc[1].mType = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mType;
|
||||
ins->mSrc[1].mTemp = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mTemp;
|
||||
|
||||
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars);
|
||||
}
|
||||
else if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONVERSION_OPERATOR &&
|
||||
ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT &&
|
||||
tvalue[ins->mSrc[1].mTemp]->mOperator != IA_FLOAT2INT && tvalue[ins->mSrc[1].mTemp]->mOperator != IA_INT2FLOAT)
|
||||
{
|
||||
ins->mSrc[0].mType = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mType;
|
||||
ins->mSrc[1].mType = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mType;
|
||||
ins->mSrc[1].mTemp = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mTemp;
|
||||
|
||||
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars);
|
||||
}
|
||||
else if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONVERSION_OPERATOR &&
|
||||
ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT &&
|
||||
tvalue[ins->mSrc[0].mTemp]->mOperator != IA_FLOAT2INT && tvalue[ins->mSrc[0].mTemp]->mOperator != IA_INT2FLOAT)
|
||||
{
|
||||
ins->mSrc[1].mType = tvalue[ins->mSrc[0].mTemp]->mSrc[0].mType;
|
||||
ins->mSrc[0].mType = tvalue[ins->mSrc[0].mTemp]->mSrc[0].mType;
|
||||
ins->mSrc[0].mTemp = tvalue[ins->mSrc[0].mTemp]->mSrc[0].mTemp;
|
||||
|
||||
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars);
|
||||
}
|
||||
else if (ins->mSrc[1].mTemp == ins->mSrc[0].mTemp)
|
||||
{
|
||||
ins->mCode = IC_CONSTANT;
|
||||
|
|
|
@ -6370,13 +6370,15 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In
|
|||
case IA_CMPEQ:
|
||||
case IA_CMPLEU:
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 0));
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1));
|
||||
if (ins->mSrc[0].mType != IT_INT8)
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1));
|
||||
this->Close(trueJump, falseJump, ASMIT_BEQ);
|
||||
break;
|
||||
case IA_CMPNE:
|
||||
case IA_CMPGU:
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 0));
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1));
|
||||
if (ins->mSrc[0].mType != IT_INT8)
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1));
|
||||
this->Close(trueJump, falseJump, ASMIT_BNE);
|
||||
break;
|
||||
case IA_CMPGEU:
|
||||
|
@ -6386,34 +6388,142 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In
|
|||
this->Close(falseJump, nullptr, ASMIT_JMP);
|
||||
break;
|
||||
case IA_CMPGES:
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1));
|
||||
if (ins->mSrc[0].mType == IT_INT8)
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt]));
|
||||
else
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1));
|
||||
this->Close(trueJump, falseJump, ASMIT_BPL);
|
||||
break;
|
||||
case IA_CMPLS:
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1));
|
||||
if (ins->mSrc[0].mType == IT_INT8)
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt]));
|
||||
else
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1));
|
||||
this->Close(trueJump, falseJump, ASMIT_BMI);
|
||||
break;
|
||||
case IA_CMPGS:
|
||||
{
|
||||
NativeCodeBasicBlock* eblock = nproc->AllocateBlock();
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1));
|
||||
if (ins->mSrc[0].mType == IT_INT8)
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt]));
|
||||
else
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1));
|
||||
this->Close(eblock, falseJump, ASMIT_BPL);
|
||||
eblock->mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 0));
|
||||
if (ins->mSrc[0].mType != IT_INT8)
|
||||
eblock->mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 0));
|
||||
eblock->Close(trueJump, falseJump, ASMIT_BNE);
|
||||
break;
|
||||
}
|
||||
case IA_CMPLES:
|
||||
{
|
||||
NativeCodeBasicBlock* eblock = nproc->AllocateBlock();
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1));
|
||||
if (ins->mSrc[0].mType == IT_INT8)
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt]));
|
||||
else
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1));
|
||||
this->Close(eblock, trueJump, ASMIT_BPL);
|
||||
eblock->mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 0));
|
||||
if (ins->mSrc[0].mType != IT_INT8)
|
||||
eblock->mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 0));
|
||||
eblock->Close(trueJump, falseJump, ASMIT_BEQ);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else if (ins->mSrc[0].mType == IT_INT8)
|
||||
{
|
||||
NativeCodeBasicBlock* eblock = nproc->AllocateBlock();
|
||||
NativeCodeBasicBlock* nblock = nproc->AllocateBlock();
|
||||
|
||||
int li = 1, ri = 0;
|
||||
if (op == IA_CMPLEU || op == IA_CMPGU || op == IA_CMPLES || op == IA_CMPGS)
|
||||
{
|
||||
li = 0; ri = 1;
|
||||
}
|
||||
|
||||
int iconst = 0;
|
||||
bool rconst = false;
|
||||
|
||||
if (ins->mSrc[li].mTemp < 0 && (op == IA_CMPGES || op == IA_CMPLS) && int16(ins->mSrc[li].mIntConst) > - 128)
|
||||
{
|
||||
iconst = ins->mSrc[li].mIntConst - 1;
|
||||
rconst = true;
|
||||
li = ri; ri = 1 - li;
|
||||
|
||||
NativeCodeBasicBlock* t = trueJump; trueJump = falseJump; falseJump = t;
|
||||
}
|
||||
else if (ins->mSrc[li].mTemp < 0 && (op == IA_CMPLES || op == IA_CMPGS) && int16(ins->mSrc[li].mIntConst) < 127)
|
||||
{
|
||||
iconst = ins->mSrc[li].mIntConst + 1;
|
||||
rconst = true;
|
||||
li = ri; ri = 1 - li;
|
||||
|
||||
NativeCodeBasicBlock* t = trueJump; trueJump = falseJump; falseJump = t;
|
||||
}
|
||||
else if (ins->mSrc[ri].mTemp < 0)
|
||||
{
|
||||
iconst = ins->mSrc[ri].mIntConst;
|
||||
rconst = true;
|
||||
}
|
||||
|
||||
if (op >= IA_CMPGES && ins->mOperator <= IA_CMPLS)
|
||||
{
|
||||
if (!rconst)
|
||||
{
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp]));
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_IMMEDIATE, 0x80));
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK));
|
||||
}
|
||||
|
||||
if (ins->mSrc[li].mTemp < 0)
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[li].mIntConst & 0xff) ^ 0x80));
|
||||
else
|
||||
{
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp]));
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_IMMEDIATE, 0x80));
|
||||
}
|
||||
|
||||
if (rconst)
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, (iconst & 0xff) ^ 0x80));
|
||||
else
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_WORK));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ins->mSrc[li].mTemp < 0)
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[li].mIntConst & 0xff));
|
||||
else
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp]));
|
||||
if (rconst)
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, iconst & 0xff));
|
||||
else
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp]));
|
||||
}
|
||||
|
||||
switch (op)
|
||||
{
|
||||
case IA_CMPEQ:
|
||||
this->Close(trueJump, falseJump, ASMIT_BEQ);
|
||||
break;
|
||||
case IA_CMPNE:
|
||||
this->Close(falseJump, trueJump, ASMIT_BEQ);
|
||||
break;
|
||||
case IA_CMPLU:
|
||||
case IA_CMPLS:
|
||||
case IA_CMPGU:
|
||||
case IA_CMPGS:
|
||||
this->Close(trueJump, falseJump, ASMIT_BCC);
|
||||
break;
|
||||
case IA_CMPLEU:
|
||||
case IA_CMPLES:
|
||||
case IA_CMPGEU:
|
||||
case IA_CMPGES:
|
||||
this->Close(falseJump, trueJump, ASMIT_BCC);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
#if 1
|
||||
else if (ins->mSrc[1].mTemp < 0 && ins->mSrc[1].mIntConst < 256 && ins->mSrc[1].mIntConst > 0 || ins->mSrc[0].mTemp < 0 && ins->mSrc[0].mIntConst < 256 && ins->mSrc[0].mIntConst > 0)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue