Add fixed offset to pointer base mem access

This commit is contained in:
drmortalwombat 2021-09-12 14:17:21 +02:00
parent 8031ad8dee
commit ebdd6f0d7d
4 changed files with 185 additions and 60 deletions

View File

@ -503,18 +503,26 @@ __asm inp_load_abs_u8
lda (ip), y lda (ip), y
sta addr + 1 sta addr + 1
iny iny
inp_load_addr_u8:
lda (ip), y lda (ip), y
tax tax
iny
sty tmpy sty tmpy
ldy #0 ldy #0
L0:
lda (addr), y lda (addr), y
sta $00, x sta $00, x
lda #0 lda #0
sta $01, x sta $01, x
ldy tmpy ldy tmpy
iny
jmp startup.exec jmp startup.exec
inp_load_addr_u8:
lda (ip), y
tax
iny
lda (ip), y
sty tmpy
tay
jmp L0
} }
#pragma bytecode(BC_LOAD_ABS_U8, inp_load_abs_u8) #pragma bytecode(BC_LOAD_ABS_U8, inp_load_abs_u8)
@ -528,12 +536,11 @@ __asm inp_load_abs_s8
lda (ip), y lda (ip), y
sta addr + 1 sta addr + 1
iny iny
inp_load_addr_s8:
lda (ip), y lda (ip), y
tax tax
iny
sty tmpy sty tmpy
ldy #0 ldy #0
L0:
lda (addr), y lda (addr), y
sta $00, x sta $00, x
bmi W1 bmi W1
@ -542,7 +549,16 @@ inp_load_addr_s8:
W1: lda #$ff W1: lda #$ff
sta $01, x sta $01, x
ldy tmpy ldy tmpy
iny
jmp startup.exec jmp startup.exec
inp_load_addr_s8:
lda (ip), y
tax
iny
lda (ip), y
sty tmpy
tay
jmp L0
} }
#pragma bytecode(BC_LOAD_ABS_I8, inp_load_abs_s8) #pragma bytecode(BC_LOAD_ABS_I8, inp_load_abs_s8)
@ -556,19 +572,28 @@ __asm inp_load_abs_16
lda (ip), y lda (ip), y
sta addr + 1 sta addr + 1
iny iny
inp_load_addr_16:
lda (ip), y lda (ip), y
tax tax
iny
sty tmpy sty tmpy
ldy #0 ldy #0
L0:
lda (addr), y lda (addr), y
sta $00, x sta $00, x
iny iny
lda (addr), y lda (addr), y
sta $01, x sta $01, x
ldy tmpy ldy tmpy
iny
jmp startup.exec jmp startup.exec
inp_load_addr_16:
lda (ip), y
tax
iny
lda (ip), y
sty tmpy
tay
jmp L0
} }
#pragma bytecode(BC_LOAD_ABS_16, inp_load_abs_16) #pragma bytecode(BC_LOAD_ABS_16, inp_load_abs_16)
@ -582,12 +607,12 @@ __asm inp_load_abs_32
lda (ip), y lda (ip), y
sta addr + 1 sta addr + 1
iny iny
inp_load_addr_32:
lda (ip), y lda (ip), y
tax tax
iny
sty tmpy sty tmpy
ldy #0 ldy #0
L0:
lda (addr), y lda (addr), y
sta $00, x sta $00, x
iny iny
@ -600,7 +625,17 @@ inp_load_addr_32:
lda (addr), y lda (addr), y
sta $03, x sta $03, x
ldy tmpy ldy tmpy
iny
jmp startup.exec jmp startup.exec
inp_load_addr_32:
lda (ip), y
tax
iny
lda (ip), y
sty tmpy
tay
jmp L0
} }
#pragma bytecode(BC_LOAD_ABS_32, inp_load_abs_32) #pragma bytecode(BC_LOAD_ABS_32, inp_load_abs_32)
@ -614,16 +649,26 @@ __asm inp_store_abs_8
lda (ip), y lda (ip), y
sta addr + 1 sta addr + 1
iny iny
lda (ip), y
tax
sty tmpy
ldy #0
L0:
lda $00, x
sta (addr), y
ldy tmpy
iny
jmp startup.exec
inp_store_addr_8: inp_store_addr_8:
lda (ip), y lda (ip), y
tax tax
iny iny
lda (ip), y
sty tmpy sty tmpy
ldy #0 tay
lda $00, x jmp L0
sta (addr), y
ldy tmpy
jmp startup.exec
} }
#pragma bytecode(BC_STORE_ABS_8, inp_store_abs_8) #pragma bytecode(BC_STORE_ABS_8, inp_store_abs_8)
@ -637,19 +682,28 @@ __asm inp_store_abs_16
lda (ip), y lda (ip), y
sta addr + 1 sta addr + 1
iny iny
inp_store_addr_16:
lda (ip), y lda (ip), y
tax tax
iny
sty tmpy sty tmpy
ldy #0 ldy #0
L0:
lda $00, x lda $00, x
sta (addr), y sta (addr), y
iny iny
lda $01, x lda $01, x
sta (addr), y sta (addr), y
ldy tmpy ldy tmpy
iny
jmp startup.exec jmp startup.exec
inp_store_addr_16:
lda (ip), y
tax
iny
lda (ip), y
sty tmpy
tay
jmp L0
} }
#pragma bytecode(BC_STORE_ABS_16, inp_store_abs_16) #pragma bytecode(BC_STORE_ABS_16, inp_store_abs_16)
@ -663,12 +717,11 @@ __asm inp_store_abs_32
lda (ip), y lda (ip), y
sta addr + 1 sta addr + 1
iny iny
inp_store_addr_32:
lda (ip), y lda (ip), y
tax tax
iny
sty tmpy sty tmpy
ldy #0 ldy #0
L0:
lda $00, x lda $00, x
sta (addr), y sta (addr), y
iny iny
@ -681,7 +734,17 @@ inp_store_addr_32:
lda $03, x lda $03, x
sta (addr), y sta (addr), y
ldy tmpy ldy tmpy
iny
jmp startup.exec jmp startup.exec
inp_store_addr_32:
lda (ip), y
tax
iny
lda (ip), y
sty tmpy
tay
jmp L0
} }
#pragma bytecode(BC_STORE_ABS_32, inp_store_abs_32) #pragma bytecode(BC_STORE_ABS_32, inp_store_abs_32)

View File

@ -214,7 +214,8 @@ void ByteCodeInstruction::Assemble(ByteCodeGenerator* generator, ByteCodeBasicBl
case BC_LOAD_REG_32: case BC_LOAD_REG_32:
case BC_STORE_REG_32: case BC_STORE_REG_32:
case BC_ADDR_REG: case BC_ADDR_REG:
block->PutCode(generator, mCode); block->PutByte(mRegister); block->PutCode(generator, mCode);
block->PutByte(mRegister);
break; break;
case BC_LOAD_ABS_U8: case BC_LOAD_ABS_U8:
@ -428,6 +429,7 @@ void ByteCodeInstruction::Assemble(ByteCodeGenerator* generator, ByteCodeBasicBl
case BC_STORE_ADDR_32: case BC_STORE_ADDR_32:
block->PutCode(generator, mCode); block->PutCode(generator, mCode);
block->PutByte(mRegister); block->PutByte(mRegister);
block->PutByte(mValue);
break; break;
case BC_COPY: case BC_COPY:
@ -678,6 +680,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
ByteCodeInstruction bins(BC_STORE_ADDR_32); ByteCodeInstruction bins(BC_STORE_ADDR_32);
bins.mRegister = BC_REG_ACCU; bins.mRegister = BC_REG_ACCU;
bins.mRegisterFinal = ins.mSFinal[0]; bins.mRegisterFinal = ins.mSFinal[0];
bins.mValue = 0;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -733,6 +736,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
ByteCodeInstruction bins(BC_STORE_ADDR_32); ByteCodeInstruction bins(BC_STORE_ADDR_32);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]];
bins.mRegisterFinal = ins.mSFinal[0]; bins.mRegisterFinal = ins.mSFinal[0];
bins.mValue = 0;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -760,6 +764,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
mIns.Push(lins); mIns.Push(lins);
ByteCodeInstruction bins(BC_STORE_ADDR_32); ByteCodeInstruction bins(BC_STORE_ADDR_32);
bins.mRegister = BC_REG_ACCU; bins.mRegister = BC_REG_ACCU;
bins.mValue = ins.mSIntConst[1];
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -774,6 +779,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
ByteCodeInstruction bins(BC_STORE_ADDR_32); ByteCodeInstruction bins(BC_STORE_ADDR_32);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]];
bins.mRegisterFinal = ins.mSFinal[0]; bins.mRegisterFinal = ins.mSFinal[0];
bins.mValue = ins.mSIntConst[1];
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -826,6 +832,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
mIns.Push(lins); mIns.Push(lins);
ByteCodeInstruction bins(BC_STORE_ADDR_16); ByteCodeInstruction bins(BC_STORE_ADDR_16);
bins.mRegister = BC_REG_ACCU; bins.mRegister = BC_REG_ACCU;
bins.mValue = 0;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -881,6 +888,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
ByteCodeInstruction bins(BC_STORE_ADDR_16); ByteCodeInstruction bins(BC_STORE_ADDR_16);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]];
bins.mRegisterFinal = ins.mSFinal[0]; bins.mRegisterFinal = ins.mSFinal[0];
bins.mValue = 0;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -908,6 +916,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
mIns.Push(lins); mIns.Push(lins);
ByteCodeInstruction bins(BC_STORE_ADDR_16); ByteCodeInstruction bins(BC_STORE_ADDR_16);
bins.mRegister = BC_REG_ACCU; bins.mRegister = BC_REG_ACCU;
bins.mValue = ins.mSIntConst[1];
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -922,6 +931,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
ByteCodeInstruction bins(BC_STORE_ADDR_16); ByteCodeInstruction bins(BC_STORE_ADDR_16);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]];
bins.mRegisterFinal = ins.mSFinal[0]; bins.mRegisterFinal = ins.mSFinal[0];
bins.mValue = ins.mSIntConst[1];
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -976,6 +986,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
mIns.Push(lins); mIns.Push(lins);
ByteCodeInstruction bins(BC_STORE_ADDR_8); ByteCodeInstruction bins(BC_STORE_ADDR_8);
bins.mRegister = BC_REG_ACCU; bins.mRegister = BC_REG_ACCU;
bins.mValue = 0;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1028,6 +1039,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
mIns.Push(lins); mIns.Push(lins);
ByteCodeInstruction bins(BC_STORE_ADDR_16); ByteCodeInstruction bins(BC_STORE_ADDR_16);
bins.mRegister = BC_REG_ACCU; bins.mRegister = BC_REG_ACCU;
bins.mValue = 0;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1087,6 +1099,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
ByteCodeInstruction bins(BC_STORE_ADDR_8); ByteCodeInstruction bins(BC_STORE_ADDR_8);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]];
bins.mRegisterFinal = ins.mSFinal[0]; bins.mRegisterFinal = ins.mSFinal[0];
bins.mValue = 0;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1144,6 +1157,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
ByteCodeInstruction bins(BC_STORE_ADDR_16); ByteCodeInstruction bins(BC_STORE_ADDR_16);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]];
bins.mRegisterFinal = ins.mSFinal[0]; bins.mRegisterFinal = ins.mSFinal[0];
bins.mValue = 0;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1174,12 +1188,14 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
{ {
ByteCodeInstruction bins(BC_STORE_ADDR_8); ByteCodeInstruction bins(BC_STORE_ADDR_8);
bins.mRegister = BC_REG_ACCU; bins.mRegister = BC_REG_ACCU;
bins.mValue = ins.mSIntConst[1];
mIns.Push(bins); mIns.Push(bins);
} }
else if (ins.mOperandSize == 2) else if (ins.mOperandSize == 2)
{ {
ByteCodeInstruction bins(BC_STORE_ADDR_16); ByteCodeInstruction bins(BC_STORE_ADDR_16);
bins.mRegister = BC_REG_ACCU; bins.mRegister = BC_REG_ACCU;
bins.mValue = ins.mSIntConst[1];
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1197,6 +1213,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
ByteCodeInstruction bins(BC_STORE_ADDR_8); ByteCodeInstruction bins(BC_STORE_ADDR_8);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]];
bins.mRegisterFinal = ins.mSFinal[0]; bins.mRegisterFinal = ins.mSFinal[0];
bins.mValue = ins.mSIntConst[1];
mIns.Push(bins); mIns.Push(bins);
} }
else if (ins.mOperandSize == 2) else if (ins.mOperandSize == 2)
@ -1204,6 +1221,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
ByteCodeInstruction bins(BC_STORE_ADDR_16); ByteCodeInstruction bins(BC_STORE_ADDR_16);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]];
bins.mRegisterFinal = ins.mSFinal[0]; bins.mRegisterFinal = ins.mSFinal[0];
bins.mValue = ins.mSIntConst[1];
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1257,6 +1275,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn
mIns.Push(lins); mIns.Push(lins);
ByteCodeInstruction bins(BC_LOAD_ADDR_32); ByteCodeInstruction bins(BC_LOAD_ADDR_32);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp];
bins.mValue = 0;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1271,6 +1290,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn
mIns.Push(lins); mIns.Push(lins);
ByteCodeInstruction bins(BC_LOAD_ADDR_32); ByteCodeInstruction bins(BC_LOAD_ADDR_32);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp];
bins.mValue = ins.mSIntConst[0];
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1318,6 +1338,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn
mIns.Push(lins); mIns.Push(lins);
ByteCodeInstruction bins(BC_LOAD_ADDR_16); ByteCodeInstruction bins(BC_LOAD_ADDR_16);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp];
bins.mValue = 0;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1332,6 +1353,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn
mIns.Push(lins); mIns.Push(lins);
ByteCodeInstruction bins(BC_LOAD_ADDR_16); ByteCodeInstruction bins(BC_LOAD_ADDR_16);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp];
bins.mValue = ins.mSIntConst[0];
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1381,6 +1403,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn
mIns.Push(lins); mIns.Push(lins);
ByteCodeInstruction bins(ins.mTType == IT_SIGNED ? BC_LOAD_ADDR_I8 : BC_LOAD_ADDR_U8); ByteCodeInstruction bins(ins.mTType == IT_SIGNED ? BC_LOAD_ADDR_I8 : BC_LOAD_ADDR_U8);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp];
bins.mValue = 0;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1426,6 +1449,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn
mIns.Push(lins); mIns.Push(lins);
ByteCodeInstruction bins(BC_LOAD_ADDR_16); ByteCodeInstruction bins(BC_LOAD_ADDR_16);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp];
bins.mValue = 0;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1446,12 +1470,14 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn
{ {
ByteCodeInstruction bins(BC_LOAD_ADDR_I8); ByteCodeInstruction bins(BC_LOAD_ADDR_I8);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp];
bins.mValue = ins.mSIntConst[0];
mIns.Push(bins); mIns.Push(bins);
} }
else else
{ {
ByteCodeInstruction bins(BC_LOAD_ADDR_U8); ByteCodeInstruction bins(BC_LOAD_ADDR_U8);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp];
bins.mValue = ins.mSIntConst[0];
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1459,6 +1485,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn
{ {
ByteCodeInstruction bins(BC_LOAD_ADDR_16); ByteCodeInstruction bins(BC_LOAD_ADDR_16);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp];
bins.mValue = ins.mSIntConst[0];
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -3354,33 +3381,33 @@ void ByteCodeProcedure::Disassemble(FILE * file, ByteCodeGenerator * generator,
break; break;
case BC_LOAD_ADDR_U8: case BC_LOAD_ADDR_U8:
fprintf(file, "MOVUB\t%s, (ADDR)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); fprintf(file, "MOVUB\t%s, (ADDR + %d)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc), generator->mMemory[mProgStart + i + 1]);
i++; i += 2;
break; break;
case BC_LOAD_ADDR_I8: case BC_LOAD_ADDR_I8:
fprintf(file, "MOVSB\t%s, (ADDR)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); fprintf(file, "MOVSB\t%s, (ADDR + %d)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc), generator->mMemory[mProgStart + i + 1]);
i++; i += 2;
break; break;
case BC_LOAD_ADDR_16: case BC_LOAD_ADDR_16:
fprintf(file, "MOV\t%s, (ADDR)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); fprintf(file, "MOV\t%s, (ADDR + %d)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc), generator->mMemory[mProgStart + i + 1]);
i++; i += 2;
break; break;
case BC_LOAD_ADDR_32: case BC_LOAD_ADDR_32:
fprintf(file, "MOVD\t%s, (ADDR)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); fprintf(file, "MOVD\t%s, (ADDR + %d)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc), generator->mMemory[mProgStart + i + 1]);
i++; i += 2;
break; break;
case BC_STORE_ADDR_8: case BC_STORE_ADDR_8:
fprintf(file, "MOVB\t(ADDR), %s", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); fprintf(file, "MOVB\t(ADDR + %d), %s", generator->mMemory[mProgStart + i + 1], TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc));
i++; i += 2;
break; break;
case BC_STORE_ADDR_16: case BC_STORE_ADDR_16:
fprintf(file, "MOV\t(ADDR), %s", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); fprintf(file, "MOV\t(ADDR + %d), %s", generator->mMemory[mProgStart + i + 1], TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc));
i++; i += 2;
break; break;
case BC_STORE_ADDR_32: case BC_STORE_ADDR_32:
fprintf(file, "MOV\t(ADDR), %s", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); fprintf(file, "MOV\t(ADDR + %d), %s", generator->mMemory[mProgStart + i + 1], TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc));
i++; i += 2;
break; break;
} }

View File

@ -271,20 +271,23 @@ static bool StoreAliasing(const InterInstruction * lins, const InterInstruction*
int lvindex, svindex; int lvindex, svindex;
int loffset, soffset; int loffset, soffset;
if (MemRange(lins, tvalue, lmem, lvindex, loffset) && MemRange(sins, tvalue, smem, svindex, soffset)) if (MemRange(lins, tvalue, lmem, lvindex, loffset))
{ {
if (smem == lmem && svindex == lvindex) if (MemRange(sins, tvalue, smem, svindex, soffset))
{ {
if (soffset + sins->mOperandSize >= loffset && loffset + lins->mOperandSize >= soffset) if (smem == lmem && svindex == lvindex)
return true; {
if (soffset + sins->mOperandSize >= loffset && loffset + lins->mOperandSize >= soffset)
return true;
}
return false;
} }
return false; if (lmem == IM_LOCAL)
return aliasedLocals[lvindex];
} }
if (lmem == IM_LOCAL)
return aliasedLocals[lvindex];
return true; return true;
} }
@ -463,6 +466,7 @@ void ValueSet::UpdateValue(InterInstruction& ins, const GrowingInstructionPtrArr
while (i < mNum && while (i < mNum &&
(mInstructions[i]->mCode != IC_LEA || (mInstructions[i]->mCode != IC_LEA ||
mInstructions[i]->mSTemp[0] != ins.mSTemp[0] || mInstructions[i]->mSTemp[0] != ins.mSTemp[0] ||
mInstructions[i]->mSIntConst[0] != ins.mSIntConst[0] ||
mInstructions[i]->mSTemp[1] != ins.mSTemp[1])) mInstructions[i]->mSTemp[1] != ins.mSTemp[1]))
{ {
i++; i++;
@ -922,10 +926,25 @@ InterInstruction::InterInstruction(void)
mSType[1] = IT_NONE; mSType[1] = IT_NONE;
mSType[2] = IT_NONE; mSType[2] = IT_NONE;
mSIntConst[0] = 0;
mSIntConst[1] = 0;
mSIntConst[2] = 0;
mSFloatConst[0] = 0;
mSFloatConst[1] = 0;
mSFloatConst[2] = 0;
mMemory = IM_NONE;
mOperandSize = 0;
mVarIndex = -1;
mIntValue = 0;
mFloatValue = 0;
mTTemp = INVALID_TEMPORARY; mTTemp = INVALID_TEMPORARY;
mSTemp[0] = INVALID_TEMPORARY; mSTemp[0] = INVALID_TEMPORARY;
mSTemp[1] = INVALID_TEMPORARY; mSTemp[1] = INVALID_TEMPORARY;
mSTemp[2] = INVALID_TEMPORARY; mSTemp[2] = INVALID_TEMPORARY;
mSFinal[0] = mSFinal[1] = mSFinal[2] = false;
} }
void InterInstruction::SetCode(const Location& loc, InterCode code) void InterInstruction::SetCode(const Location& loc, InterCode code)
@ -1449,7 +1468,9 @@ void InterInstruction::Disassemble(FILE* file)
if (this->mCode == IC_CONSTANT) if (this->mCode == IC_CONSTANT)
{ {
if (mTType == IT_POINTER) if (mTType == IT_POINTER)
fprintf(file, "C%d", mOperandSize); {
fprintf(file, "C%c%d(%d:%d)", memchars[mMemory], mOperandSize, mVarIndex, mIntValue);
}
else if (mTType == IT_FLOAT) else if (mTType == IT_FLOAT)
fprintf(file, "C%f", mFloatValue); fprintf(file, "C%f", mFloatValue);
else else
@ -1571,13 +1592,20 @@ static void OptimizeAddress(InterInstruction& ins, const GrowingInstructionPtrAr
if (ins.mSTemp[offset] >= 0 && tvalue[ins.mSTemp[offset]]) if (ins.mSTemp[offset] >= 0 && tvalue[ins.mSTemp[offset]])
{ {
if (tvalue[ins.mSTemp[offset]]->mCode == IC_CONSTANT) InterInstruction* ains = tvalue[ins.mSTemp[offset]];
if (ains->mCode == IC_CONSTANT)
{ {
ins.mSIntConst[offset] = tvalue[ins.mSTemp[offset]]->mIntValue; ins.mSIntConst[offset] = ains->mIntValue;
ins.mVarIndex = tvalue[ins.mSTemp[offset]]->mVarIndex; ins.mVarIndex = ains->mVarIndex;
ins.mMemory = tvalue[ins.mSTemp[offset]]->mMemory; ins.mMemory = ains->mMemory;
ins.mSTemp[offset] = -1; ins.mSTemp[offset] = -1;
} }
else if (ains->mCode == IC_LEA && ains->mSTemp[0] < 0 && ains->mSTemp[1] >= 0 && tvalue[ains->mSTemp[1]])
{
ins.mSIntConst[offset] = ains->mSIntConst[0];
ins.mSTemp[offset] = ains->mSTemp[1];
}
} }
} }
@ -1671,6 +1699,11 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction& ins, const GrowingIn
ins.mSTemp[1] = -1; ins.mSTemp[1] = -1;
assert(ins.mSTemp[0] >= 0); assert(ins.mSTemp[0] >= 0);
} }
else
{
ins.mSIntConst[0] = tvalue[ins.mSTemp[0]]->mIntValue;
ins.mSTemp[0] = -1;
}
} }
break; break;
case IC_TYPECAST: case IC_TYPECAST:

View File

@ -1409,7 +1409,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr
{ {
if (ins.mMemory == IM_INDIRECT) if (ins.mMemory == IM_INDIRECT)
{ {
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[1]));
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins.mSIntConst[0] & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins.mSIntConst[0] & 0xff));
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]]));
mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED));
@ -1427,7 +1427,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr
{ {
if (ins.mMemory == IM_INDIRECT) if (ins.mMemory == IM_INDIRECT)
{ {
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[1]));
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]));
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]]));
mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED));
@ -1544,7 +1544,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr
{ {
if (ins.mMemory == IM_INDIRECT) if (ins.mMemory == IM_INDIRECT)
{ {
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[1]));
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins.mSIntConst[0] & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins.mSIntConst[0] & 0xff));
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]]));
mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED));
@ -1556,7 +1556,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr
{ {
if (ins.mMemory == IM_INDIRECT) if (ins.mMemory == IM_INDIRECT)
{ {
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[1]));
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]));
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]]));
mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED));
@ -1744,7 +1744,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr
{ {
if (ins.mMemory == IM_INDIRECT) if (ins.mMemory == IM_INDIRECT)
{ {
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[1]));
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins.mSIntConst[0] & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins.mSIntConst[0] & 0xff));
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]]));
@ -1761,7 +1761,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr
{ {
if (ins.mMemory == IM_INDIRECT) if (ins.mMemory == IM_INDIRECT)
{ {
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[1]));
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]));
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]]));
@ -1821,7 +1821,7 @@ void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterI
{ {
if (rins.mMemory == IM_INDIRECT) if (rins.mMemory == IM_INDIRECT)
{ {
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, rins.mSIntConst[0]));
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[rins.mSTemp[0]])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[rins.mSTemp[0]]));
} }
} }
@ -1861,7 +1861,7 @@ void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterI
{ {
if (wins.mMemory == IM_INDIRECT) if (wins.mMemory == IM_INDIRECT)
{ {
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, wins.mSIntConst[1]));
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[wins.mSTemp[1]])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[wins.mSTemp[1]]));
} }
} }
@ -1925,7 +1925,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI
{ {
if (ins.mMemory == IM_INDIRECT) if (ins.mMemory == IM_INDIRECT)
{ {
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[0]));
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]));
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg));
mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED));
@ -2008,7 +2008,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI
if (ins.mMemory == IM_INDIRECT) if (ins.mMemory == IM_INDIRECT)
{ {
int src = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; int src = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]];
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[0]));
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, src)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, src));
if (ainsl) if (ainsl)
{ {
@ -2152,7 +2152,9 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI
{ {
if (ins.mOperandSize == 1) if (ins.mOperandSize == 1)
{ {
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); if (ins.mTType == IT_SIGNED)
mIns.Push(NativeCodeInstruction(ASMIT_LDX, ASMIM_IMMEDIATE, 0));
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[0]));
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]));
if (ainsl) if (ainsl)
{ {
@ -2166,8 +2168,8 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI
if (ins.mTType == IT_SIGNED) if (ins.mTType == IT_SIGNED)
{ {
mIns.Push(NativeCodeInstruction(ASMIT_BPL, ASMIM_RELATIVE, 1)); mIns.Push(NativeCodeInstruction(ASMIT_BPL, ASMIM_RELATIVE, 1));
mIns.Push(NativeCodeInstruction(ASMIT_DEY, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_DEX, ASMIM_IMPLIED));
mIns.Push(NativeCodeInstruction(ASMIT_TYA, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_TXA, ASMIM_IMPLIED));
} }
else else
{ {
@ -2180,7 +2182,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI
{ {
int src = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; int src = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]];
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[0]));
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, src)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, src));
if (ainsl) if (ainsl)
{ {
@ -3641,7 +3643,7 @@ bool NativeCodeBasicBlock::MoveLoadStoreUp(int at)
while (j > 0 && !((mIns[j - 1].mType == ASMIT_STA || mIns[j - 1].mType == ASMIT_LDA) && mIns[j - 1].mMode == ASMIM_ZERO_PAGE && mIns[j - 1].mAddress == mIns[at].mAddress)) while (j > 0 && !((mIns[j - 1].mType == ASMIT_STA || mIns[j - 1].mType == ASMIT_LDA) && mIns[j - 1].mMode == ASMIM_ZERO_PAGE && mIns[j - 1].mAddress == mIns[at].mAddress))
{ {
j--; j--;
if ((mIns[j].mMode == ASMIM_ZERO_PAGE || mIns[j].mMode == ASMIM_INDIRECT ) && mIns[j].mAddress == mIns[at + 1].mAddress) if ((mIns[j].mMode == ASMIM_ZERO_PAGE || mIns[j].mMode == ASMIM_INDIRECT_Y) && mIns[j].mAddress == mIns[at + 1].mAddress)
return false; return false;
if (mIns[j].mMode == ASMIM_ZERO_PAGE && mIns[j].mAddress == mIns[at].mAddress && mIns[j].ChangesAddress()) if (mIns[j].mMode == ASMIM_ZERO_PAGE && mIns[j].mAddress == mIns[at].mAddress && mIns[j].ChangesAddress())
return false; return false;