Add fixed offset to pointer base mem access
This commit is contained in:
parent
8031ad8dee
commit
ebdd6f0d7d
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue