Some bytecode optimizations
This commit is contained in:
parent
ccd6a50043
commit
0ca6ef8894
|
@ -199,14 +199,12 @@ void cwin_write_string(CharWin * win, const char * buffer)
|
|||
{
|
||||
for(char x=0; x<win->wx; x++)
|
||||
{
|
||||
char c = *buffer;
|
||||
if (c)
|
||||
char ch = *buffer;
|
||||
if (ch)
|
||||
{
|
||||
c &= 0xbf;
|
||||
if (c & 0x80)
|
||||
c ^= 0xc0;
|
||||
ch = (ch & 0x3f) | ((ch & 0x80) >> 1);
|
||||
|
||||
dp[x] = c;
|
||||
dp[x] = ch;
|
||||
buffer++;
|
||||
}
|
||||
else
|
||||
|
@ -254,9 +252,7 @@ void cwin_putat_char(CharWin * win, char x, char y, char ch, char color)
|
|||
{
|
||||
int offset = mul40[y] + x;
|
||||
|
||||
ch &= 0xbf;
|
||||
if (ch & 0x80)
|
||||
ch ^= 0xc0;
|
||||
ch = (ch & 0x3f) | ((ch & 0x80) >> 1);
|
||||
|
||||
win->sp[offset] = ch;
|
||||
win->cp[offset] = color;
|
||||
|
@ -275,9 +271,7 @@ void cwin_putat_chars(CharWin * win, char x, char y, const char * chars, char nu
|
|||
{
|
||||
char ch = chars[i];
|
||||
|
||||
ch &= 0xbf;
|
||||
if (ch & 0x80)
|
||||
ch ^= 0xc0;
|
||||
ch = (ch & 0x3f) | ((ch & 0x80) >> 1);
|
||||
|
||||
sp[i] = ch;
|
||||
cp[i] = color;
|
||||
|
@ -296,9 +290,7 @@ char cwin_putat_string(CharWin * win, char x, char y, const char * str, char col
|
|||
char i = 0;
|
||||
while (char ch = str[i])
|
||||
{
|
||||
ch &= 0xbf;
|
||||
if (ch & 0x80)
|
||||
ch ^= 0xc0;
|
||||
ch = (ch & 0x3f) | ((ch & 0x80) >> 1);
|
||||
|
||||
sp[i] = ch;
|
||||
cp[i] = color;
|
||||
|
|
|
@ -131,6 +131,7 @@ w2:
|
|||
// All native code
|
||||
jsr main
|
||||
pexec:
|
||||
tyexec:
|
||||
yexec:
|
||||
zexec:
|
||||
exec:
|
||||
|
@ -146,19 +147,13 @@ exec:
|
|||
sta ip + 1
|
||||
|
||||
pexec:
|
||||
ldy #$ff
|
||||
ldy #0
|
||||
beq exec
|
||||
tyexec:
|
||||
ldy tmpy
|
||||
yexec:
|
||||
iny
|
||||
exec:
|
||||
#if 0
|
||||
tya
|
||||
clc
|
||||
adc ip
|
||||
sta ip
|
||||
bcc W1
|
||||
inc ip + 1
|
||||
W1: ldy #0
|
||||
#endif
|
||||
lda (ip), y
|
||||
sta execjmp + 1
|
||||
iny
|
||||
|
@ -166,12 +161,13 @@ execjmp:
|
|||
jmp (0x0900)
|
||||
zexec:
|
||||
tya
|
||||
ldy #0
|
||||
clc
|
||||
adc ip
|
||||
sta ip
|
||||
bcc pexec
|
||||
bcc exec
|
||||
inc ip + 1
|
||||
bne pexec
|
||||
bne exec
|
||||
bcode:
|
||||
byt BC_CALL_ABS * 2
|
||||
byt <main
|
||||
|
@ -902,8 +898,7 @@ __asm inp_load_abs_8
|
|||
L0:
|
||||
lda (addr), y
|
||||
sta $00, x
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
inp_load_addr_8:
|
||||
lda (ip), y
|
||||
tax
|
||||
|
@ -934,8 +929,7 @@ L0:
|
|||
sta $00, x
|
||||
lda #0
|
||||
sta $01, x
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
inp_load_addr_u8:
|
||||
lda (ip), y
|
||||
tax
|
||||
|
@ -967,8 +961,7 @@ L0:
|
|||
iny
|
||||
lda (addr), y
|
||||
sta $01, x
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
|
||||
inp_load_addr_16:
|
||||
lda (ip), y
|
||||
|
@ -983,6 +976,28 @@ inp_load_addr_16:
|
|||
#pragma bytecode(BC_LOAD_ABS_16, inp_load_abs_16)
|
||||
#pragma bytecode(BC_LOAD_ADDR_16, inp_load_abs_16.inp_load_addr_16)
|
||||
|
||||
__asm inp_load_abs_addr
|
||||
{
|
||||
lda (ip), y
|
||||
sta addr
|
||||
iny
|
||||
lda (ip), y
|
||||
sta addr + 1
|
||||
sty tmpy
|
||||
|
||||
ldy #0
|
||||
lda (addr), y
|
||||
tax
|
||||
iny
|
||||
lda (addr), y
|
||||
sta addr + 1
|
||||
stx addr
|
||||
jmp startup.tyexec
|
||||
}
|
||||
|
||||
#pragma bytecode(BC_LOAD_ABS_ADDR, inp_load_abs_addr)
|
||||
|
||||
|
||||
__asm inp_load_abs_32
|
||||
{
|
||||
lda (ip), y
|
||||
|
@ -1008,8 +1023,7 @@ L0:
|
|||
iny
|
||||
lda (addr), y
|
||||
sta $03, x
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
|
||||
inp_load_addr_32:
|
||||
lda (ip), y
|
||||
|
@ -1040,8 +1054,7 @@ L0:
|
|||
|
||||
lda $00, x
|
||||
sta (addr), y
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
|
||||
inp_store_addr_8:
|
||||
lda (ip), y
|
||||
|
@ -1074,8 +1087,7 @@ L0:
|
|||
iny
|
||||
lda $01, x
|
||||
sta (addr), y
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
|
||||
inp_store_addr_16:
|
||||
lda (ip), y
|
||||
|
@ -1114,8 +1126,7 @@ L0:
|
|||
iny
|
||||
lda $03, x
|
||||
sta (addr), y
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
|
||||
inp_store_addr_32:
|
||||
lda (ip), y
|
||||
|
@ -1210,8 +1221,7 @@ __asm inp_load_local_16
|
|||
iny
|
||||
lda (fp), y
|
||||
sta $01, x
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
}
|
||||
|
||||
#pragma bytecode(BC_LOAD_LOCAL_16, inp_load_local_16)
|
||||
|
@ -1235,8 +1245,7 @@ __asm inp_load_local_32
|
|||
iny
|
||||
lda (fp), y
|
||||
sta $03, x
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
}
|
||||
|
||||
#pragma bytecode(BC_LOAD_LOCAL_32, inp_load_local_32)
|
||||
|
@ -1251,8 +1260,7 @@ __asm inp_load_local_8
|
|||
tay
|
||||
lda (fp), y
|
||||
sta $00, x
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
}
|
||||
|
||||
#pragma bytecode(BC_LOAD_LOCAL_8, inp_load_local_8)
|
||||
|
@ -1269,8 +1277,7 @@ __asm inp_load_local_u8
|
|||
sta $00, x
|
||||
lda #0
|
||||
sta $01, x
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
}
|
||||
|
||||
#pragma bytecode(BC_LOAD_LOCAL_U8, inp_load_local_u8)
|
||||
|
@ -1285,8 +1292,7 @@ __asm inp_store_local_8
|
|||
tay
|
||||
lda $00, x
|
||||
sta (fp), y
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
}
|
||||
|
||||
#pragma bytecode(BC_STORE_LOCAL_8, inp_store_local_8)
|
||||
|
@ -1304,8 +1310,7 @@ __asm inp_store_local_16
|
|||
iny
|
||||
lda $01, x
|
||||
sta (fp), y
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
}
|
||||
|
||||
#pragma bytecode(BC_STORE_LOCAL_16, inp_store_local_16)
|
||||
|
@ -1329,8 +1334,7 @@ __asm inp_store_local_32
|
|||
iny
|
||||
lda $03, x
|
||||
sta (fp), y
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
}
|
||||
|
||||
#pragma bytecode(BC_STORE_LOCAL_32, inp_store_local_32)
|
||||
|
@ -1363,8 +1367,7 @@ __asm inp_store_frame_8
|
|||
tay
|
||||
lda $00, x
|
||||
sta (sp), y
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
}
|
||||
|
||||
#pragma bytecode(BC_STORE_FRAME_8, inp_store_frame_8)
|
||||
|
@ -1382,8 +1385,7 @@ __asm inp_store_frame_16
|
|||
iny
|
||||
lda $01, x
|
||||
sta (sp), y
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
}
|
||||
|
||||
#pragma bytecode(BC_STORE_FRAME_16, inp_store_frame_16)
|
||||
|
@ -1407,8 +1409,7 @@ __asm inp_store_frame_32
|
|||
iny
|
||||
lda $03, x
|
||||
sta (sp), y
|
||||
ldy tmpy
|
||||
jmp startup.yexec
|
||||
jmp startup.tyexec
|
||||
}
|
||||
|
||||
#pragma bytecode(BC_STORE_FRAME_32, inp_store_frame_32)
|
||||
|
|
|
@ -26,6 +26,7 @@ enum ByteCode
|
|||
BC_LOAD_ABS_U8,
|
||||
BC_LOAD_ABS_16,
|
||||
BC_LOAD_ABS_32,
|
||||
BC_LOAD_ABS_ADDR,
|
||||
|
||||
BC_STORE_ABS_8,
|
||||
BC_STORE_ABS_16,
|
||||
|
|
|
@ -26,6 +26,7 @@ static const char* ByteCodeNames[] = {
|
|||
"LOAD_ABS_U8",
|
||||
"LOAD_ABS_16",
|
||||
"LOAD_ABS_32",
|
||||
"LOAD_ABS_ADDR",
|
||||
|
||||
"STORE_ABS_8",
|
||||
"STORE_ABS_16",
|
||||
|
@ -147,9 +148,8 @@ static const char* ByteCodeNames[] = {
|
|||
"SET_LT",
|
||||
"SET_LE",
|
||||
|
||||
"JSR", //113
|
||||
"JSR", //114
|
||||
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
|
||||
|
@ -434,6 +434,9 @@ bool ByteCodeInstruction::CheckAccuSize(uint32 & used)
|
|||
}
|
||||
break;
|
||||
|
||||
case BC_LOAD_ABS_ADDR:
|
||||
break;
|
||||
|
||||
case BC_LEA_ABS:
|
||||
case BC_LEA_LOCAL:
|
||||
case BC_LEA_FRAME:
|
||||
|
@ -954,6 +957,22 @@ void ByteCodeInstruction::Assemble(ByteCodeGenerator* generator, ByteCodeBasicBl
|
|||
block->PutByte(mRegister);
|
||||
break;
|
||||
|
||||
case BC_LOAD_ABS_ADDR:
|
||||
block->PutCode(generator, mCode);
|
||||
if (mRelocate)
|
||||
{
|
||||
LinkerReference rl;
|
||||
rl.mOffset = block->mCode.Size();
|
||||
rl.mFlags = LREF_HIGHBYTE | LREF_LOWBYTE;
|
||||
rl.mRefObject = mLinkerObject;
|
||||
rl.mRefOffset = mValue;
|
||||
block->mRelocations.Push(rl);
|
||||
block->PutWord(0);
|
||||
}
|
||||
else
|
||||
block->PutWord(mValue);
|
||||
break;
|
||||
|
||||
case BC_LEA_ABS:
|
||||
case BC_LEA_ABS_INDEX:
|
||||
case BC_LEA_ABS_INDEX_U8:
|
||||
|
@ -4913,6 +4932,16 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase)
|
|||
mIns[i + 2].mCode = BC_BINOP_ADDA_16;
|
||||
progress = true;
|
||||
}
|
||||
else if (
|
||||
mIns[i + 0].mCode == BC_LOAD_REG_16 &&
|
||||
mIns[i + 1].mCode == BC_BINOP_SHLI_16 && mIns[i + 1].mValue == 1 &&
|
||||
mIns[i + 2].mCode == BC_STORE_REG_16 && mIns[i + 0].mRegister == mIns[i + 2].mRegister && !(mIns[i + 2].mLive & LIVE_ACCU))
|
||||
{
|
||||
mIns[i + 0].mRegisterFinal = false;
|
||||
mIns[i + 1].mCode = BC_NOP;
|
||||
mIns[i + 2].mCode = BC_BINOP_ADDA_16;
|
||||
progress = true;
|
||||
}
|
||||
else if (
|
||||
(mIns[i + 0].mCode == BC_LOAD_LOCAL_16 || mIns[i + 0].mCode == BC_LOAD_ABS_16 || mIns[i + 0].mCode == BC_LOAD_ADDR_16 ||
|
||||
mIns[i + 0].mCode == BC_LOAD_LOCAL_U8 || mIns[i + 0].mCode == BC_LOAD_ABS_U8 || mIns[i + 0].mCode == BC_LOAD_ADDR_U8) &&
|
||||
|
@ -4936,6 +4965,18 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase)
|
|||
mIns[i + 1].mLive |= LIVE_ACCU;
|
||||
progress = true;
|
||||
}
|
||||
|
||||
else if (
|
||||
mIns[i + 0].mCode == BC_LEA_ABS &&
|
||||
mIns[i + 1].mCode == BC_BINOP_ADDA_16 && mIns[i + 0].mRegister == mIns[i + 1].mRegister &&
|
||||
mIns[i + 2].mCode == BC_ADDR_REG && mIns[i + 0].mRegister == mIns[i + 2].mRegister && mIns[i + 2].mRegisterFinal)
|
||||
{
|
||||
mIns[i + 0].mCode = BC_LEA_ABS_INDEX;
|
||||
mIns[i + 0].mRegister = BC_REG_ACCU;
|
||||
mIns[i + 1].mCode = BC_NOP;
|
||||
mIns[i + 2].mCode = BC_NOP;
|
||||
progress = true;
|
||||
}
|
||||
#if 1
|
||||
else if (
|
||||
i + 3 == mIns.Size() && mFalseJump &&
|
||||
|
@ -5283,7 +5324,26 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase)
|
|||
mIns[i + 0].mCode = BC_NOP;
|
||||
progress = true;
|
||||
}
|
||||
else if (
|
||||
mIns[i + 0].mCode == BC_BINOP_ADDA_16 &&
|
||||
mIns[i + 1].mCode == BC_ADDR_REG && mIns[i + 0].mRegister == mIns[i + 1].mRegister && mIns[i + 1].mRegisterFinal)
|
||||
{
|
||||
mIns[i + 1].mCode = BC_LEA_ACCU_INDEX;
|
||||
mIns[i + 0].mCode = BC_NOP;
|
||||
progress = true;
|
||||
}
|
||||
#endif
|
||||
#if 1
|
||||
else if (
|
||||
mIns[i + 0].mCode == BC_LOAD_ABS_16 &&
|
||||
mIns[i + 1].mCode == BC_ADDR_REG && mIns[i + 0].mRegister == mIns[i + 1].mRegister && mIns[i + 1].mRegisterFinal)
|
||||
{
|
||||
mIns[i + 0].mCode = BC_LOAD_ABS_ADDR;
|
||||
mIns[i + 1].mCode = BC_NOP;
|
||||
progress = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
else if (
|
||||
i + 2 == mIns.Size() && mFalseJump &&
|
||||
|
|
|
@ -27,6 +27,7 @@ enum ByteCode
|
|||
BC_LOAD_ABS_U8,
|
||||
BC_LOAD_ABS_16,
|
||||
BC_LOAD_ABS_32,
|
||||
BC_LOAD_ABS_ADDR,
|
||||
|
||||
BC_STORE_ABS_8,
|
||||
BC_STORE_ABS_16,
|
||||
|
|
|
@ -155,6 +155,10 @@ void ByteCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int star
|
|||
fprintf(file, "MOVD\t%s, %s", TempName(memory[start + i + 2], tbuffer, proc), AddrName(uint16(memory[start + i + 0] + 256 * memory[start + i + 1]), abuffer, linker));
|
||||
i += 3;
|
||||
break;
|
||||
case BC_LOAD_ABS_ADDR:
|
||||
fprintf(file, "MOV\tADDR, %s", AddrName(uint16(memory[start + i + 0] + 256 * memory[start + i + 1]), abuffer, linker));
|
||||
i += 2;
|
||||
break;
|
||||
|
||||
case BC_LEA_ABS:
|
||||
fprintf(file, "LEA\t%s, %s", TempName(memory[start + i + 0], tbuffer, proc), AddrName(uint16(memory[start + i + 1] + 256 * memory[start + i + 2]), abuffer, linker));
|
||||
|
|
Loading…
Reference in New Issue