Optimize signed byte comparisons

This commit is contained in:
drmortalwombat 2021-11-01 22:33:02 +01:00
parent 40f82ba6ec
commit f16edb1c57
7 changed files with 329 additions and 18 deletions

View File

@ -1853,7 +1853,7 @@ W1: jmp startup.exec
#pragma bytecode(BC_BINOP_SHRI_I16, inp_binop_shri_s16) #pragma bytecode(BC_BINOP_SHRI_I16, inp_binop_shri_s16)
#pragma bytecode(BC_BINOP_SHRR_I16, inp_binop_shri_s16.inp_binop_shrr_s16) #pragma bytecode(BC_BINOP_SHRR_I16, inp_binop_shri_s16.inp_binop_shrr_s16)
__asm cmp __asm cmp16
{ {
inp_binop_cmpr_s16: inp_binop_cmpr_s16:
lda (ip), y lda (ip), y
@ -1926,10 +1926,76 @@ inp_binop_cmpi_s16:
beq cmp_eq beq cmp_eq
} }
#pragma bytecode(BC_BINOP_CMPSR_16, cmp.inp_binop_cmpr_s16) #pragma bytecode(BC_BINOP_CMPSR_16, cmp16.inp_binop_cmpr_s16)
#pragma bytecode(BC_BINOP_CMPSI_16, cmp.inp_binop_cmpi_s16) #pragma bytecode(BC_BINOP_CMPSI_16, cmp16.inp_binop_cmpi_s16)
#pragma bytecode(BC_BINOP_CMPUR_16, cmp.inp_binop_cmpr_u16) #pragma bytecode(BC_BINOP_CMPUR_16, cmp16.inp_binop_cmpr_u16)
#pragma bytecode(BC_BINOP_CMPUI_16, cmp.inp_binop_cmpi_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 __asm bra
{ {

View File

@ -91,6 +91,12 @@ enum ByteCode
BC_BINOP_CMPUI_16, BC_BINOP_CMPUI_16,
BC_BINOP_CMPSI_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_NEGATE_16,
BC_OP_INVERT_16, BC_OP_INVERT_16,
@ -134,6 +140,8 @@ enum ByteCode
BC_SET_LT, BC_SET_LT,
BC_SET_LE, BC_SET_LE,
BC_NATIVE = 0x75,
BC_ENTER, BC_ENTER,
BC_RETURN, BC_RETURN,
BC_CALL, BC_CALL,
@ -148,8 +156,6 @@ enum ByteCode
BC_EXTRT, BC_EXTRT,
BC_NATIVE = 0x75,
BC_CONV_I16_I32 = 0x80, BC_CONV_I16_I32 = 0x80,
BC_CONV_U16_U32, BC_CONV_U16_U32,

View File

@ -196,6 +196,8 @@ bool ByteCodeInstruction::ChangesRegister(uint32 reg) const
return true; return true;
if (mCode >= BC_BINOP_CMPUR_16 && mCode <= BC_BINOP_CMPSI_16) if (mCode >= BC_BINOP_CMPUR_16 && mCode <= BC_BINOP_CMPSI_16)
return true; 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) if (mCode >= BC_OP_NEGATE_16 && mCode <= BC_OP_INVERT_16)
return true; return true;
if (mCode >= BC_BINOP_ADD_F32 && mCode <= BC_OP_CEIL_F32) 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_CMPUR_16:
case BC_BINOP_CMPSR_16: case BC_BINOP_CMPSR_16:
case BC_BINOP_CMPUR_8:
case BC_BINOP_CMPSR_8:
block->PutCode(generator, mCode); block->PutCode(generator, mCode);
block->PutByte(mRegister); block->PutByte(mRegister);
break; break;
@ -398,6 +402,12 @@ void ByteCodeInstruction::Assemble(ByteCodeGenerator* generator, ByteCodeBasicBl
block->PutWord(uint16(mValue)); block->PutWord(uint16(mValue));
break; 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_NEGATE_16:
case BC_OP_INVERT_16: case BC_OP_INVERT_16:
block->PutCode(generator, mCode); block->PutCode(generator, mCode);
@ -2416,6 +2426,69 @@ ByteCode ByteCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const
cins.mRegisterFinal = ins->mSrc[1].mFinal; cins.mRegisterFinal = ins->mSrc[1].mFinal;
mIns.Push(cins); 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 else
{ {
if (ins->mSrc[1].mTemp < 0) if (ins->mSrc[1].mTemp < 0)

View File

@ -92,6 +92,12 @@ enum ByteCode
BC_BINOP_CMPUI_16, BC_BINOP_CMPUI_16,
BC_BINOP_CMPSI_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_NEGATE_16,
BC_OP_INVERT_16, BC_OP_INVERT_16,
@ -135,6 +141,8 @@ enum ByteCode
BC_SET_LT, BC_SET_LT,
BC_SET_LE, BC_SET_LE,
BC_NATIVE = 0x75,
BC_ENTER, BC_ENTER,
BC_RETURN, BC_RETURN,
BC_CALL, BC_CALL,
@ -149,8 +157,6 @@ enum ByteCode
BC_EXTRT, BC_EXTRT,
BC_NATIVE = 0x75,
BC_CONV_I16_I32 = 0x80, BC_CONV_I16_I32 = 0x80,
BC_CONV_U16_U32, BC_CONV_U16_U32,

View File

@ -343,10 +343,28 @@ void ByteCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int star
i += 2; i += 2;
break; break;
case BC_BINOP_CMPSI_16: 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; i += 2;
break; 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: case BC_BINOP_ADD_F32:
fprintf(file, "ADDF\tACCU, %s", TempName(memory[start + i + 0], tbuffer, proc)); fprintf(file, "ADDF\tACCU, %s", TempName(memory[start + i + 0], tbuffer, proc));
i += 1; i += 1;

View File

@ -1111,6 +1111,38 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); 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) else if (ins->mSrc[1].mTemp == ins->mSrc[0].mTemp)
{ {
ins->mCode = IC_CONSTANT; ins->mCode = IC_CONSTANT;

View File

@ -6370,13 +6370,15 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In
case IA_CMPEQ: case IA_CMPEQ:
case IA_CMPLEU: case IA_CMPLEU:
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 0)); 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); this->Close(trueJump, falseJump, ASMIT_BEQ);
break; break;
case IA_CMPNE: case IA_CMPNE:
case IA_CMPGU: case IA_CMPGU:
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 0)); 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); this->Close(trueJump, falseJump, ASMIT_BNE);
break; break;
case IA_CMPGEU: case IA_CMPGEU:
@ -6386,34 +6388,142 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In
this->Close(falseJump, nullptr, ASMIT_JMP); this->Close(falseJump, nullptr, ASMIT_JMP);
break; break;
case IA_CMPGES: 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); this->Close(trueJump, falseJump, ASMIT_BPL);
break; break;
case IA_CMPLS: 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); this->Close(trueJump, falseJump, ASMIT_BMI);
break; break;
case IA_CMPGS: case IA_CMPGS:
{ {
NativeCodeBasicBlock* eblock = nproc->AllocateBlock(); 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); 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); eblock->Close(trueJump, falseJump, ASMIT_BNE);
break; break;
} }
case IA_CMPLES: case IA_CMPLES:
{ {
NativeCodeBasicBlock* eblock = nproc->AllocateBlock(); 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); 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); eblock->Close(trueJump, falseJump, ASMIT_BEQ);
break; 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 #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) 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)
{ {