Byte code size optimizations

This commit is contained in:
drmortalwombat 2021-11-16 12:59:16 +01:00
parent 0c3e19741c
commit 92b2c34293
5 changed files with 44 additions and 0 deletions

View File

@ -1274,6 +1274,25 @@ __asm inp_load_local_8
#pragma bytecode(BC_LOAD_LOCAL_8, inp_load_local_8) #pragma bytecode(BC_LOAD_LOCAL_8, inp_load_local_8)
__asm inp_load_local_u8
{
lda (ip), y
tax
iny
lda (ip), y
iny
sty tmpy
tay
lda (fp), y
sta $00, x
lda #0
sta $01, x
ldy tmpy
jmp startup.exec
}
#pragma bytecode(BC_LOAD_LOCAL_U8, inp_load_local_u8)
__asm inp_store_local_8 __asm inp_store_local_8
{ {
lda (ip), y lda (ip), y

View File

@ -37,6 +37,7 @@ enum ByteCode
BC_LEA_ACCU_INDEX, BC_LEA_ACCU_INDEX,
BC_LOAD_LOCAL_8, BC_LOAD_LOCAL_8,
BC_LOAD_LOCAL_U8,
BC_LOAD_LOCAL_16, BC_LOAD_LOCAL_16,
BC_LOAD_LOCAL_32, BC_LOAD_LOCAL_32,

View File

@ -577,6 +577,7 @@ void ByteCodeInstruction::Assemble(ByteCodeGenerator* generator, ByteCodeBasicBl
break; break;
case BC_LOAD_LOCAL_8: case BC_LOAD_LOCAL_8:
case BC_LOAD_LOCAL_U8:
case BC_LOAD_LOCAL_16: case BC_LOAD_LOCAL_16:
case BC_LOAD_LOCAL_32: case BC_LOAD_LOCAL_32:
case BC_STORE_LOCAL_8: case BC_STORE_LOCAL_8:
@ -4539,6 +4540,24 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase)
progress = true; progress = true;
} }
#endif #endif
else if (
mIns[i + 0].mCode == BC_LOAD_LOCAL_8 &&
mIns[i + 1].mCode == BC_LOAD_REG_8 && mIns[i + 1].mRegister == mIns[i + 0].mRegister && mIns[i + 1].mRegisterFinal)
{
mIns[i + 0].mCode = BC_LOAD_LOCAL_U8;
mIns[i + 0].mRegister = BC_REG_ACCU;
mIns[i + 0].mLive |= LIVE_ACCU;
mIns[i + 1].mCode = BC_NOP;
progress = true;
}
else if (
mIns[i + 0].mCode == BC_LOAD_LOCAL_U8 && mIns[i + 0].mRegister == BC_REG_ACCU &&
mIns[i + 1].mCode == BC_STORE_REG_16 && !(mIns[i + 1].mLive & LIVE_ACCU))
{
mIns[i + 0].mRegister = mIns[i + 1].mRegister;
mIns[i + 1].mCode = BC_NOP;
progress = true;
}
#if 0 #if 0
else if ((mIns[i].mCode == BC_LOAD_LOCAL_16 || mIns[i].mCode == BC_LOAD_ABS_16) && mIns[i + 1].mCode == BC_ADDR_REG && mIns[i].mRegister == mIns[i + 1].mRegister && mIns[i + 1].mRegisterFinal) else if ((mIns[i].mCode == BC_LOAD_LOCAL_16 || mIns[i].mCode == BC_LOAD_ABS_16) && mIns[i + 1].mCode == BC_ADDR_REG && mIns[i].mRegister == mIns[i + 1].mRegister && mIns[i + 1].mRegisterFinal)

View File

@ -38,6 +38,7 @@ enum ByteCode
BC_LEA_ACCU_INDEX, BC_LEA_ACCU_INDEX,
BC_LOAD_LOCAL_8, BC_LOAD_LOCAL_8,
BC_LOAD_LOCAL_U8,
BC_LOAD_LOCAL_16, BC_LOAD_LOCAL_16,
BC_LOAD_LOCAL_32, BC_LOAD_LOCAL_32,

View File

@ -193,6 +193,10 @@ void ByteCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int star
fprintf(file, "MOVB\t%s, %d(FP)", TempName(memory[start + i + 0], tbuffer, proc), memory[start + i + 1]); fprintf(file, "MOVB\t%s, %d(FP)", TempName(memory[start + i + 0], tbuffer, proc), memory[start + i + 1]);
i += 2; i += 2;
break; break;
case BC_LOAD_LOCAL_U8:
fprintf(file, "MOVUB\t%s, %d(FP)", TempName(memory[start + i + 0], tbuffer, proc), memory[start + i + 1]);
i += 2;
break;
case BC_LOAD_LOCAL_16: case BC_LOAD_LOCAL_16:
fprintf(file, "MOV\t%s, %d(FP)", TempName(memory[start + i + 0], tbuffer, proc), memory[start + i + 1]); fprintf(file, "MOV\t%s, %d(FP)", TempName(memory[start + i + 0], tbuffer, proc), memory[start + i + 1]);
i += 2; i += 2;