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_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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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,
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue