diff --git a/autotest/autotest.bat b/autotest/autotest.bat index 2392030..20138b2 100644 --- a/autotest/autotest.bat +++ b/autotest/autotest.bat @@ -30,6 +30,12 @@ if %errorlevel% neq 0 goto :error ..\release\oscar64 -e -n strcmptest.c if %errorlevel% neq 0 goto :error +..\release\oscar64 -e strcmptest2.c +if %errorlevel% neq 0 goto :error + +..\release\oscar64 -e -n strcmptest2.c +if %errorlevel% neq 0 goto :error + ..\release\oscar64 -e arraytest.c if %errorlevel% neq 0 goto :error diff --git a/autotest/strcmptest2.c b/autotest/strcmptest2.c new file mode 100644 index 0000000..f516348 --- /dev/null +++ b/autotest/strcmptest2.c @@ -0,0 +1,28 @@ +#include +#include + +char aa[2000], ba[2000]; + +int main(void) +{ + assert(strcmp("abcdefgh", "abcdefgh") == 0); + assert(strcmp("abcdefgh", "abcdemgh") < 0); + assert(strcmp("abcdefgh", "abcdefghi") < 0); + assert(strcmp("abcdefghi", "abcdefgh") > 0); + assert(strcmp("abcdemgh", "abcdefgh") > 0); + + for(int i=0; i<1900; i++) + { + aa[i] = 'a' + (i & 7); + } + aa[1900] = 0; + + strcpy(ba, aa); + + assert(strcmp(aa, ba) == 0); + ba[1000] = 'z'; + assert(strcmp(aa, ba) < 0); + assert(strcmp(ba, aa) > 0); + + return 0; +} diff --git a/include/string.c b/include/string.c index 174f3d7..5e5353e 100644 --- a/include/string.c +++ b/include/string.c @@ -45,6 +45,53 @@ char * strcpy(char * dst, const char * src) } #endif +#if 1 +int strcmp(const char * ptr1, const char * ptr2) +{ + __asm + { + ldy #ptr1 + lda (fp), y + sta $1f + iny + lda (fp), y + sta $20 + + ldy #ptr2 + lda (fp), y + sta $1b + iny + lda (fp), y + sta $1c + + ldy #0 + L1: lda ($1f), y + beq W1 + cmp ($1b), y + bne W2 + iny + bne L1 + inc $1c + inc $20 + bne L1 + W2: bcs gt + lda #$ff + sta accu + sta accu + 1 + rts + gt: lda #$01 + sta accu + lda #$00 + sta accu + 1 + rts + W1: cmp ($1b), y + bne W2 + lda #$00 + sta accu + sta accu + 1 + } +} +#else int strcmp(const char * ptr1, const char * ptr2) { const char * p = ptr1, * q = ptr2; @@ -59,6 +106,8 @@ int strcmp(const char * ptr1, const char * ptr2) else return 1; } +#endif + int strlen(const char * str) { diff --git a/oscar64/ByteCodeGenerator.cpp b/oscar64/ByteCodeGenerator.cpp index 49f7688..062d60b 100644 --- a/oscar64/ByteCodeGenerator.cpp +++ b/oscar64/ByteCodeGenerator.cpp @@ -655,21 +655,21 @@ void ByteCodeBasicBlock::IntConstToAddr(int64 val) void ByteCodeBasicBlock::LoadConstant(InterCodeProcedure* proc, const InterInstruction * ins) { - if (ins->mTType == IT_FLOAT) + if (ins->mDst.mType == IT_FLOAT) { union { float f; int v; } cc; cc.f = ins->mFloatValue; ByteCodeInstruction bins(BC_CONST_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = cc.v; mIns.Push(bins); } - else if (ins->mTType == IT_POINTER) + else if (ins->mDst.mType == IT_POINTER) { if (ins->mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_LEA_ABS); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mLinkerObject = ins->mLinkerObject; bins.mValue = ins->mIntValue; bins.mRelocate = true; @@ -678,59 +678,59 @@ void ByteCodeBasicBlock::LoadConstant(InterCodeProcedure* proc, const InterInstr else if (ins->mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_LEA_ABS); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = ins->mIntValue; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL) { ByteCodeInstruction bins(BC_LEA_LOCAL); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = ins->mIntValue + proc->mLocalVars[ins->mVarIndex]->mOffset; mIns.Push(bins); } else if (ins->mMemory == IM_PARAM) { ByteCodeInstruction bins(BC_LEA_LOCAL); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = ins->mIntValue + ins->mVarIndex + proc->mLocalSize + 2; mIns.Push(bins); } else if (ins->mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_LEA_FRAME); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; - bins.mValue = ins->mVarIndex + ins->mSIntConst[1] + 2; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; + bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } else if (ins->mMemory == IM_PROCEDURE) { ByteCodeInstruction bins(BC_CONST_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mLinkerObject = ins->mLinkerObject; bins.mValue = 0; bins.mRelocate = true; mIns.Push(bins); } } - else if (ins->mTType == IT_BOOL || ins->mTType == IT_INT8) + else if (ins->mDst.mType == IT_BOOL || ins->mDst.mType == IT_INT8) { ByteCodeInstruction bins(BC_CONST_8); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = ins->mIntValue; mIns.Push(bins); } - else if (ins->mTType == IT_INT32) + else if (ins->mDst.mType == IT_INT32) { ByteCodeInstruction bins(BC_CONST_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = ins->mIntValue; mIns.Push(bins); } else { ByteCodeInstruction bins(BC_CONST_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = ins->mIntValue; mIns.Push(bins); } @@ -740,12 +740,12 @@ void ByteCodeBasicBlock::LoadConstant(InterCodeProcedure* proc, const InterInstr void ByteCodeBasicBlock::CopyValue(InterCodeProcedure* proc, const InterInstruction * ins) { ByteCodeInstruction sins(BC_ADDR_REG); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - sins.mRegisterFinal = ins->mSFinal[1]; + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + sins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(sins); ByteCodeInstruction dins(BC_LOAD_REG_16); - dins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - dins.mRegisterFinal = ins->mSFinal[0]; + dins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + dins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(dins); ByteCodeInstruction cins(BC_COPY); cins.mValue = ins->mOperandSize; @@ -754,33 +754,33 @@ void ByteCodeBasicBlock::CopyValue(InterCodeProcedure* proc, const InterInstruct void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterInstruction * ins) { - if (ins->mSType[0] == IT_FLOAT) + if (ins->mSrc[0].mType == IT_FLOAT) { - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - FloatConstToAccu(ins->mSFloatConst[0]); + FloatConstToAccu(ins->mSrc[0].mFloatConst); if (ins->mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_STORE_ABS_32); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } else if (ins->mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_32); - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; else @@ -790,7 +790,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI { ByteCodeInstruction bins(BC_STORE_LOCAL_32); bins.mRegister = BC_REG_ACCU; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mValue = index; mIns.Push(bins); } @@ -802,7 +802,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(lins); ByteCodeInstruction bins(BC_STORE_ADDR_32); bins.mRegister = BC_REG_ACCU; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mValue = 0; mIns.Push(bins); } @@ -811,8 +811,8 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI { ByteCodeInstruction bins(BC_STORE_FRAME_32); bins.mRegister = BC_REG_ACCU; - bins.mRegisterFinal = ins->mSFinal[0]; - bins.mValue = ins->mVarIndex + ins->mSIntConst[1] + 2; + bins.mRegisterFinal = ins->mSrc[0].mFinal; + bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } @@ -823,20 +823,20 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ABS_32); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[1]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; + bins.mValue = ins->mSrc[1].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; mIns.Push(bins); } else if (ins->mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_32); - bins.mValue = ins->mSIntConst[1]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; + bins.mValue = ins->mSrc[1].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; else @@ -845,8 +845,8 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI if (index <= 252) { ByteCodeInstruction bins(BC_STORE_LOCAL_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mValue = index; mIns.Push(bins); } @@ -857,8 +857,8 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI lins.mValue = index; mIns.Push(lins); ByteCodeInstruction bins(BC_STORE_ADDR_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mValue = 0; mIns.Push(bins); } @@ -866,28 +866,28 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI else if (ins->mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_STORE_FRAME_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; - bins.mValue = ins->mVarIndex + ins->mSIntConst[1] + 2; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; + bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } } else { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - FloatConstToAccu(ins->mSFloatConst[0]); + FloatConstToAccu(ins->mSrc[0].mFloatConst); if (ins->mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction bins(BC_STORE_ADDR_32); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } } @@ -896,45 +896,45 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI if (ins->mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction bins(BC_STORE_ADDR_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; - bins.mValue = ins->mSIntConst[1]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } } } } - else if (ins->mSType[0] == IT_POINTER) + else if (ins->mSrc[0].mType == IT_POINTER) { - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - IntConstToAccu(ins->mSIntConst[0]); + IntConstToAccu(ins->mSrc[0].mIntConst); if (ins->mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_STORE_ABS_16); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } else if (ins->mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_16); - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; else @@ -963,7 +963,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI { ByteCodeInstruction bins(BC_STORE_FRAME_16); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mVarIndex + ins->mSIntConst[1] + 2; + bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } @@ -974,21 +974,21 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ABS_16); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[1]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; + bins.mValue = ins->mSrc[1].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; mIns.Push(bins); } else if (ins->mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_16); - bins.mValue = ins->mSIntConst[1]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mValue = ins->mSrc[1].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; else @@ -997,8 +997,8 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI if (index <= 254) { ByteCodeInstruction bins(BC_STORE_LOCAL_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mValue = index; mIns.Push(bins); } @@ -1009,8 +1009,8 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI lins.mValue = index; mIns.Push(lins); ByteCodeInstruction bins(BC_STORE_ADDR_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mValue = 0; mIns.Push(bins); } @@ -1018,28 +1018,28 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI else if (ins->mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_STORE_FRAME_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; - bins.mValue = ins->mVarIndex + ins->mSIntConst[1] + 2; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; + bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } } else { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - IntConstToAccu(ins->mSIntConst[0]); + IntConstToAccu(ins->mSrc[0].mIntConst); if (ins->mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction bins(BC_STORE_ADDR_16); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } } @@ -1048,13 +1048,13 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI if (ins->mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction bins(BC_STORE_ADDR_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; - bins.mValue = ins->mSIntConst[1]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } } @@ -1062,14 +1062,14 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI } else { - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { if (ins->mOperandSize <= 2) - IntConstToAccu(ins->mSIntConst[0]); + IntConstToAccu(ins->mSrc[0].mIntConst); else - LongConstToAccu(ins->mSIntConst[0]); + LongConstToAccu(ins->mSrc[0].mIntConst); if (ins->mOperandSize == 1) { @@ -1078,20 +1078,20 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ABS_8); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } else if (ins->mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_8); - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; else @@ -1120,7 +1120,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI { ByteCodeInstruction bins(BC_STORE_FRAME_8); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mVarIndex + ins->mSIntConst[1] + 2; + bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } @@ -1131,20 +1131,20 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ABS_16); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } else if (ins->mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_16); - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; else @@ -1173,7 +1173,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI { ByteCodeInstruction bins(BC_STORE_FRAME_16); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mVarIndex + ins->mSIntConst[1] + 2; + bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } @@ -1184,20 +1184,20 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ABS_32); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } else if (ins->mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_32); - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; else @@ -1226,7 +1226,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI { ByteCodeInstruction bins(BC_STORE_FRAME_32); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mVarIndex + ins->mSIntConst[1] + 2; + bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } @@ -1240,22 +1240,22 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ABS_8); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[1]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mValue = ins->mSrc[1].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } else if (ins->mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_8); - bins.mValue = ins->mSIntConst[1]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mValue = ins->mSrc[1].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; else @@ -1264,8 +1264,8 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI if (index <= 255) { ByteCodeInstruction bins(BC_STORE_LOCAL_8); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mValue = index; mIns.Push(bins); } @@ -1276,8 +1276,8 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI lins.mValue = index; mIns.Push(lins); ByteCodeInstruction bins(BC_STORE_ADDR_8); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mValue = 0; mIns.Push(bins); } @@ -1285,9 +1285,9 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI else if (ins->mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_STORE_FRAME_8); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; - bins.mValue = ins->mVarIndex + ins->mSIntConst[1] + 2; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; + bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } @@ -1298,22 +1298,22 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ABS_16); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[1]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mValue = ins->mSrc[1].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } else if (ins->mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_16); - bins.mValue = ins->mSIntConst[1]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mValue = ins->mSrc[1].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; else @@ -1322,8 +1322,8 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI if (index <= 254) { ByteCodeInstruction bins(BC_STORE_LOCAL_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mValue = index; mIns.Push(bins); } @@ -1334,8 +1334,8 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI lins.mValue = index; mIns.Push(lins); ByteCodeInstruction bins(BC_STORE_ADDR_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mValue = 0; mIns.Push(bins); } @@ -1343,9 +1343,9 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI else if (ins->mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_STORE_FRAME_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; - bins.mValue = ins->mVarIndex + ins->mSIntConst[1] + 2; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; + bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } @@ -1356,22 +1356,22 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ABS_32); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[1]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mValue = ins->mSrc[1].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } else if (ins->mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_32); - bins.mValue = ins->mSIntConst[1]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mValue = ins->mSrc[1].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; else @@ -1380,8 +1380,8 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI if (index <= 252) { ByteCodeInstruction bins(BC_STORE_LOCAL_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mValue = index; mIns.Push(bins); } @@ -1392,8 +1392,8 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI lins.mValue = index; mIns.Push(lins); ByteCodeInstruction bins(BC_STORE_ADDR_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mValue = 0; mIns.Push(bins); } @@ -1401,9 +1401,9 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI else if (ins->mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_STORE_FRAME_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; - bins.mValue = ins->mVarIndex + ins->mSIntConst[1] + 2; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; + bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } @@ -1411,38 +1411,38 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI } else { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { if (ins->mOperandSize <= 2) - IntConstToAccu(ins->mSIntConst[0]); + IntConstToAccu(ins->mSrc[0].mIntConst); else - LongConstToAccu(ins->mSIntConst[0]); + LongConstToAccu(ins->mSrc[0].mIntConst); if (ins->mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); if (ins->mOperandSize == 1) { ByteCodeInstruction bins(BC_STORE_ADDR_8); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } else if (ins->mOperandSize == 2) { ByteCodeInstruction bins(BC_STORE_ADDR_16); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } else if (ins->mOperandSize == 4) { ByteCodeInstruction bins(BC_STORE_ADDR_32); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } } @@ -1452,31 +1452,31 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI if (ins->mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); if (ins->mOperandSize == 1) { ByteCodeInstruction bins(BC_STORE_ADDR_8); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; - bins.mValue = ins->mSIntConst[1]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } else if (ins->mOperandSize == 2) { ByteCodeInstruction bins(BC_STORE_ADDR_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; - bins.mValue = ins->mSIntConst[1]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } else if (ins->mOperandSize == 4) { ByteCodeInstruction bins(BC_STORE_ADDR_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; - bins.mValue = ins->mSIntConst[1]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } } @@ -1487,29 +1487,29 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterInstruction * ins) { - if (ins->mTType == IT_FLOAT) + if (ins->mDst.mType == IT_FLOAT) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { if (ins->mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_LOAD_ABS_32); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[0]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mValue = ins->mSrc[0].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(bins); } else if (ins->mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_LOAD_ABS_32); - bins.mValue = ins->mSIntConst[0]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mValue = ins->mSrc[0].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[0]; + int index = ins->mSrc[0].mIntConst; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; else @@ -1518,7 +1518,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn if (index <= 254) { ByteCodeInstruction bins(BC_LOAD_LOCAL_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = index; mIns.Push(bins); } @@ -1529,7 +1529,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn lins.mValue = index; mIns.Push(lins); ByteCodeInstruction bins(BC_LOAD_ADDR_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = 0; mIns.Push(bins); } @@ -1540,39 +1540,39 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn if (ins->mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); ByteCodeInstruction bins(BC_LOAD_ADDR_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; - bins.mValue = ins->mSIntConst[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; + bins.mValue = ins->mSrc[0].mIntConst; mIns.Push(bins); } } } - else if (ins->mTType == IT_POINTER) + else if (ins->mDst.mType == IT_POINTER) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { if (ins->mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_LOAD_ABS_16); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[0]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mValue = ins->mSrc[0].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(bins); } else if (ins->mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_LOAD_ABS_16); - bins.mValue = ins->mSIntConst[0]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mValue = ins->mSrc[0].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[0]; + int index = ins->mSrc[0].mIntConst; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; else @@ -1581,7 +1581,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn if (index <= 254) { ByteCodeInstruction bins(BC_LOAD_LOCAL_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = index; mIns.Push(bins); } @@ -1592,7 +1592,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn lins.mValue = index; mIns.Push(lins); ByteCodeInstruction bins(BC_LOAD_ADDR_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = 0; mIns.Push(bins); } @@ -1603,41 +1603,41 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn if (ins->mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); ByteCodeInstruction bins(BC_LOAD_ADDR_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; - bins.mValue = ins->mSIntConst[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; + bins.mValue = ins->mSrc[0].mIntConst; mIns.Push(bins); } } } else { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { if (ins->mOperandSize == 1) { if (ins->mMemory == IM_GLOBAL) { - ByteCodeInstruction bins((ins->mTType == IT_BOOL || ins->mTType == IT_INT8) ? BC_LOAD_ABS_8 : BC_LOAD_ABS_U8); + ByteCodeInstruction bins((ins->mDst.mType == IT_BOOL || ins->mDst.mType == IT_INT8) ? BC_LOAD_ABS_8 : BC_LOAD_ABS_U8); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[0]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mValue = ins->mSrc[0].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(bins); } else if (ins->mMemory == IM_ABSOLUTE) { - ByteCodeInstruction bins((ins->mTType == IT_BOOL || ins->mTType == IT_INT8) ? BC_LOAD_ABS_8 : BC_LOAD_ABS_U8); - bins.mValue = ins->mSIntConst[0]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + ByteCodeInstruction bins((ins->mDst.mType == IT_BOOL || ins->mDst.mType == IT_INT8) ? BC_LOAD_ABS_8 : BC_LOAD_ABS_U8); + bins.mValue = ins->mSrc[0].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[0]; + int index = ins->mSrc[0].mIntConst; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; else @@ -1645,8 +1645,8 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn if (index <= 255) { - ByteCodeInstruction bins((ins->mTType == IT_BOOL || ins->mTType == IT_INT8) ? BC_LOAD_LOCAL_8 : BC_LOAD_LOCAL_U8); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + ByteCodeInstruction bins((ins->mDst.mType == IT_BOOL || ins->mDst.mType == IT_INT8) ? BC_LOAD_LOCAL_8 : BC_LOAD_LOCAL_U8); + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = index; mIns.Push(bins); } @@ -1656,8 +1656,8 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn lins.mRegister = BC_REG_ADDR; lins.mValue = index; mIns.Push(lins); - ByteCodeInstruction bins((ins->mTType == IT_BOOL || ins->mTType == IT_INT8) ? BC_LOAD_ADDR_8 : BC_LOAD_ADDR_U8); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + ByteCodeInstruction bins((ins->mDst.mType == IT_BOOL || ins->mDst.mType == IT_INT8) ? BC_LOAD_ADDR_8 : BC_LOAD_ADDR_U8); + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = 0; mIns.Push(bins); } @@ -1670,20 +1670,20 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn ByteCodeInstruction bins(BC_LOAD_ABS_16); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[0]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mValue = ins->mSrc[0].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(bins); } else if (ins->mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_LOAD_ABS_16); - bins.mValue = ins->mSIntConst[0]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mValue = ins->mSrc[0].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[0]; + int index = ins->mSrc[0].mIntConst; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; else @@ -1692,7 +1692,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn if (index <= 254) { ByteCodeInstruction bins(BC_LOAD_LOCAL_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = index; mIns.Push(bins); } @@ -1703,7 +1703,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn lins.mValue = index; mIns.Push(lins); ByteCodeInstruction bins(BC_LOAD_ADDR_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = 0; mIns.Push(bins); } @@ -1716,20 +1716,20 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn ByteCodeInstruction bins(BC_LOAD_ABS_32); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[0]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mValue = ins->mSrc[0].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(bins); } else if (ins->mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_LOAD_ABS_32); - bins.mValue = ins->mSIntConst[0]; - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mValue = ins->mSrc[0].mIntConst; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(bins); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[0]; + int index = ins->mSrc[0].mIntConst; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; else @@ -1738,7 +1738,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn if (index <= 252) { ByteCodeInstruction bins(BC_LOAD_LOCAL_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = index; mIns.Push(bins); } @@ -1749,7 +1749,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn lins.mValue = index; mIns.Push(lins); ByteCodeInstruction bins(BC_LOAD_ADDR_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = 0; mIns.Push(bins); } @@ -1761,29 +1761,29 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn if (ins->mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); if (ins->mOperandSize == 1) { - ByteCodeInstruction bins((ins->mTType == IT_BOOL || ins->mTType == IT_INT8) ? BC_LOAD_ADDR_8 : BC_LOAD_ADDR_U8); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; - bins.mValue = ins->mSIntConst[0]; + ByteCodeInstruction bins((ins->mDst.mType == IT_BOOL || ins->mDst.mType == IT_INT8) ? BC_LOAD_ADDR_8 : BC_LOAD_ADDR_U8); + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; + bins.mValue = ins->mSrc[0].mIntConst; mIns.Push(bins); } else if (ins->mOperandSize == 2) { ByteCodeInstruction bins(BC_LOAD_ADDR_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; - bins.mValue = ins->mSIntConst[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; + bins.mValue = ins->mSrc[0].mIntConst; mIns.Push(bins); } else if (ins->mOperandSize == 4) { ByteCodeInstruction bins(BC_LOAD_ADDR_32); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; - bins.mValue = ins->mSIntConst[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; + bins.mValue = ins->mSrc[0].mIntConst; mIns.Push(bins); } } @@ -1793,31 +1793,31 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn void ByteCodeBasicBlock::LoadEffectiveAddress(InterCodeProcedure* proc, const InterInstruction * ins) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - if (ins->mSTemp[1] == ins->mTTemp) + if (ins->mSrc[1].mTemp == ins->mDst.mTemp) { ByteCodeInstruction bins(BC_BINOP_ADDI_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; - bins.mValue = ins->mSIntConst[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; + bins.mValue = ins->mSrc[0].mIntConst; mIns.Push(bins); } else { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction ains(BC_BINOP_ADDI_16); ains.mRegister = BC_REG_ACCU; - ains.mValue = ins->mSIntConst[0]; + ains.mValue = ins->mSrc[0].mIntConst; mIns.Push(ains); ByteCodeInstruction sins(BC_STORE_REG_16); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } } - else if (ins->mSTemp[1] < 0) + else if (ins->mSrc[1].mTemp < 0) { if (ins->mMemory == IM_GLOBAL) { @@ -1846,31 +1846,31 @@ void ByteCodeBasicBlock::LoadEffectiveAddress(InterCodeProcedure* proc, const In } ByteCodeInstruction ains(BC_BINOP_ADDR_16); - ains.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - ains.mRegisterFinal = ins->mSFinal[0]; + ains.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + ains.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(ains); ByteCodeInstruction sins(BC_STORE_REG_16); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } else { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction ains(BC_BINOP_ADDR_16); - ains.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - ains.mRegisterFinal = ins->mSFinal[0]; + ains.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + ains.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(ains); ByteCodeInstruction sins(BC_STORE_REG_16); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } } void ByteCodeBasicBlock::CallFunction(InterCodeProcedure* proc, const InterInstruction * ins) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { ByteCodeInstruction bins(BC_LEA_ABS); bins.mRelocate = true; @@ -1882,37 +1882,37 @@ void ByteCodeBasicBlock::CallFunction(InterCodeProcedure* proc, const InterInstr else { ByteCodeInstruction bins(BC_ADDR_REG); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } ByteCodeInstruction cins(BC_CALL); mIns.Push(cins); - if (ins->mTTemp >= 0) + if (ins->mDst.mTemp >= 0) { - ByteCodeInstruction bins(StoreTypedTmpCodes[ins->mTType]); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + ByteCodeInstruction bins(StoreTypedTmpCodes[ins->mDst.mType]); + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(bins); } } void ByteCodeBasicBlock::CallAssembler(InterCodeProcedure* proc, const InterInstruction * ins) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { ByteCodeInstruction bins(BC_JSR); bins.mRelocate = true; bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mSIntConst[0]; + bins.mValue = ins->mSrc[0].mIntConst; mIns.Push(bins); } - if (ins->mTTemp >= 0) + if (ins->mDst.mTemp >= 0) { - ByteCodeInstruction bins(StoreTypedTmpCodes[ins->mTType]); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + ByteCodeInstruction bins(StoreTypedTmpCodes[ins->mDst.mType]); + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(bins); } } @@ -1962,46 +1962,46 @@ ByteCode ByteCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const break; } - if (ins->mSType[0] == IT_FLOAT) + if (ins->mSrc[0].mType == IT_FLOAT) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - FloatConstToAccu(ins->mSFloatConst[0]); + FloatConstToAccu(ins->mSrc[0].mFloatConst); } else { ByteCodeInstruction lins(BC_LOAD_REG_32); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); } ByteCodeInstruction cins(BC_BINOP_CMP_F32); - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - FloatConstToWork(ins->mSFloatConst[1]); + FloatConstToWork(ins->mSrc[1].mFloatConst); cins.mRegister = BC_REG_WORK; } else { - cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; + cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; } - cins.mRegisterFinal = ins->mSFinal[1]; + cins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(cins); } - else if (ins->mSType[0] == IT_INT32) + else if (ins->mSrc[0].mType == IT_INT32) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - LongConstToAccu(ins->mSIntConst[0]); + LongConstToAccu(ins->mSrc[0].mIntConst); } else { ByteCodeInstruction lins(BC_LOAD_REG_32); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); } @@ -2010,56 +2010,56 @@ ByteCode ByteCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const if (csigned) cins.mCode = BC_BINOP_CMP_S32; - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - LongConstToWork(ins->mSIntConst[1]); + LongConstToWork(ins->mSrc[1].mIntConst); cins.mRegister = BC_REG_WORK; } else { - cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; + cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; } - cins.mRegisterFinal = ins->mSFinal[1]; + cins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(cins); } else { - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + 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_16); - cins.mValue = ins->mSIntConst[1]; + cins.mValue = ins->mSrc[1].mIntConst; mIns.Push(cins); } else { ByteCodeInstruction cins(BC_BINOP_CMPUI_16); - cins.mValue = ins->mSIntConst[1]; + cins.mValue = ins->mSrc[1].mIntConst; mIns.Push(cins); } } - else if (ins->mSTemp[0] < 0) + else if (ins->mSrc[0].mTemp < 0) { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + 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_16); - cins.mValue = ins->mSIntConst[0]; + cins.mValue = ins->mSrc[0].mIntConst; mIns.Push(cins); } else { ByteCodeInstruction cins(BC_BINOP_CMPUI_16); - cins.mValue = ins->mSIntConst[0]; + cins.mValue = ins->mSrc[0].mIntConst; mIns.Push(cins); } code = TransposeBranchCondition(code); @@ -2067,21 +2067,21 @@ ByteCode ByteCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const else { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + 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_16); - cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - cins.mRegisterFinal = ins->mSFinal[1]; + 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_16); - cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - cins.mRegisterFinal = ins->mSFinal[1]; + cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + cins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(cins); } } @@ -2092,7 +2092,7 @@ ByteCode ByteCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const static ByteCode ByteCodeBinRegOperator(const InterInstruction * ins) { - if (ins->mTType == IT_FLOAT) + if (ins->mDst.mType == IT_FLOAT) { switch (ins->mOperator) { @@ -2106,7 +2106,7 @@ static ByteCode ByteCodeBinRegOperator(const InterInstruction * ins) return BC_EXIT; } } - else if (ins->mTType == IT_INT32) + else if (ins->mDst.mType == IT_INT32) { switch (ins->mOperator) { @@ -2176,10 +2176,10 @@ static ByteCode ByteCodeBinSizeImmOperator(const InterInstruction* ins) { switch (ins->mOperator) { - case IA_ADD: return InterTypeSize[ins->mTType] == 1 ? BC_BINOP_ADDI_8 : BC_BINOP_ADDI_16; + case IA_ADD: return InterTypeSize[ins->mDst.mType] == 1 ? BC_BINOP_ADDI_8 : BC_BINOP_ADDI_16; case IA_SUB: return BC_BINOP_SUBI_16; - case IA_AND: return InterTypeSize[ins->mTType] == 1 ? BC_BINOP_ANDI_8 : BC_BINOP_ANDI_16; - case IA_OR: return InterTypeSize[ins->mTType] == 1 ? BC_BINOP_ORI_8 : BC_BINOP_ORI_16; + case IA_AND: return InterTypeSize[ins->mDst.mType] == 1 ? BC_BINOP_ANDI_8 : BC_BINOP_ANDI_16; + case IA_OR: return InterTypeSize[ins->mDst.mType] == 1 ? BC_BINOP_ORI_8 : BC_BINOP_ORI_16; case IA_SHL: return BC_BINOP_SHLI_16; case IA_SHR: return BC_BINOP_SHRI_U16; case IA_SAR: return BC_BINOP_SHRI_I16; @@ -2197,24 +2197,24 @@ void ByteCodeBasicBlock::NumericConversion(InterCodeProcedure* proc, const Inter case IA_FLOAT2INT: { ByteCodeInstruction lins(BC_LOAD_REG_32); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); ByteCodeInstruction bins(BC_CONV_F32_I16); -// ByteCodeInstruction bins(ins->mTType == IT_SIGNED ? BC_CONV_F32_I16 : BC_CONV_F32_U16); +// ByteCodeInstruction bins(ins->mDst.mType == IT_SIGNED ? BC_CONV_F32_I16 : BC_CONV_F32_U16); mIns.Push(bins); ByteCodeInstruction sins(BC_STORE_REG_16); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } break; case IA_INT2FLOAT: { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); ByteCodeInstruction bins(BC_CONV_I16_F32); @@ -2222,24 +2222,24 @@ void ByteCodeBasicBlock::NumericConversion(InterCodeProcedure* proc, const Inter mIns.Push(bins); ByteCodeInstruction sins(BC_STORE_REG_32); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } break; case IA_EXT8TO16S: { - if (ins->mSTemp[0] == ins->mTTemp) + if (ins->mSrc[0].mTemp == ins->mDst.mTemp) { ByteCodeInstruction cins(BC_CONV_I8_I16); - cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; - cins.mRegisterFinal = ins->mSFinal[0]; + cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; + cins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(cins); } else { ByteCodeInstruction lins(BC_LOAD_REG_8); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); ByteCodeInstruction cins(BC_CONV_I8_I16); @@ -2247,37 +2247,37 @@ void ByteCodeBasicBlock::NumericConversion(InterCodeProcedure* proc, const Inter mIns.Push(cins); ByteCodeInstruction sins(BC_STORE_REG_16); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } } break; case IA_EXT8TO16U: { - if (ins->mSTemp[0] == ins->mTTemp) + if (ins->mSrc[0].mTemp == ins->mDst.mTemp) { ByteCodeInstruction cins(BC_BINOP_ANDI_16); - cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; - cins.mRegisterFinal = ins->mSFinal[0]; + cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; + cins.mRegisterFinal = ins->mSrc[0].mFinal; cins.mValue = 0x00ff; mIns.Push(cins); } else { ByteCodeInstruction lins(BC_LOAD_REG_8); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); ByteCodeInstruction sins(BC_STORE_REG_16); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } } break; case IA_EXT16TO32S: { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); ByteCodeInstruction cins(BC_CONV_I16_I32); @@ -2285,15 +2285,15 @@ void ByteCodeBasicBlock::NumericConversion(InterCodeProcedure* proc, const Inter mIns.Push(cins); ByteCodeInstruction sins(BC_STORE_REG_32); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } break; case IA_EXT16TO32U: { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); ByteCodeInstruction cins(BC_CONV_U16_U32); @@ -2302,7 +2302,7 @@ void ByteCodeBasicBlock::NumericConversion(InterCodeProcedure* proc, const Inter mIns.Push(cins); ByteCodeInstruction sins(BC_STORE_REG_32); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } break; } @@ -2310,11 +2310,11 @@ void ByteCodeBasicBlock::NumericConversion(InterCodeProcedure* proc, const Inter void ByteCodeBasicBlock::UnaryOperator(InterCodeProcedure* proc, const InterInstruction * ins) { - if (ins->mTType == IT_FLOAT) + if (ins->mDst.mType == IT_FLOAT) { ByteCodeInstruction lins(BC_LOAD_REG_32); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); switch (ins->mOperator) @@ -2342,14 +2342,14 @@ void ByteCodeBasicBlock::UnaryOperator(InterCodeProcedure* proc, const InterInst } ByteCodeInstruction sins(BC_STORE_REG_32); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } - else if (ins->mTType == IT_INT32) + else if (ins->mDst.mType == IT_INT32) { ByteCodeInstruction lins(BC_LOAD_REG_32); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); switch (ins->mOperator) @@ -2367,14 +2367,14 @@ void ByteCodeBasicBlock::UnaryOperator(InterCodeProcedure* proc, const InterInst } ByteCodeInstruction sins(BC_STORE_REG_32); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } else { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); switch (ins->mOperator) @@ -2393,81 +2393,81 @@ void ByteCodeBasicBlock::UnaryOperator(InterCodeProcedure* proc, const InterInst } ByteCodeInstruction sins(BC_STORE_REG_16); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } } void ByteCodeBasicBlock::BinaryOperator(InterCodeProcedure* proc, const InterInstruction * ins) { - if (ins->mTType == IT_FLOAT) + if (ins->mDst.mType == IT_FLOAT) { ByteCode bc = ByteCodeBinRegOperator(ins); - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - FloatConstToAccu(ins->mSFloatConst[1]); + FloatConstToAccu(ins->mSrc[1].mFloatConst); } else { ByteCodeInstruction lins(BC_LOAD_REG_32); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); } ByteCodeInstruction bins(bc); - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - FloatConstToWork(ins->mSFloatConst[0]); + FloatConstToWork(ins->mSrc[0].mFloatConst); bins.mRegister = BC_REG_WORK; } - else if (ins->mSTemp[1] == ins->mSTemp[0]) + else if (ins->mSrc[1].mTemp == ins->mSrc[0].mTemp) bins.mRegister = BC_REG_ACCU; else - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); ByteCodeInstruction sins(BC_STORE_REG_32); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } - else if (ins->mTType == IT_INT32) + else if (ins->mDst.mType == IT_INT32) { ByteCode bc = ByteCodeBinRegOperator(ins); - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - LongConstToAccu(ins->mSIntConst[1]); + LongConstToAccu(ins->mSrc[1].mIntConst); } else { ByteCodeInstruction lins(BC_LOAD_REG_32); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); } ByteCodeInstruction bins(bc); - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - LongConstToWork(ins->mSIntConst[0]); + LongConstToWork(ins->mSrc[0].mIntConst); bins.mRegister = BC_REG_WORK; } - else if (ins->mSTemp[1] == ins->mSTemp[0]) + else if (ins->mSrc[1].mTemp == ins->mSrc[0].mTemp) bins.mRegister = BC_REG_ACCU; else - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); ByteCodeInstruction sins(BC_STORE_REG_32); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } else @@ -2482,113 +2482,113 @@ void ByteCodeBasicBlock::BinaryOperator(InterCodeProcedure* proc, const InterIns ByteCode bci = ByteCodeBinImmOperator(ins); ByteCode bcis = ByteCodeBinSizeImmOperator(ins); - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - if (ins->mSTemp[0] == ins->mTTemp) + if (ins->mSrc[0].mTemp == ins->mDst.mTemp) { ByteCodeInstruction bins(bcis); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; - bins.mValue = ins->mSIntConst[1]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); return; } - ByteCodeInstruction lins(InterTypeSize[ins->mSType[0]] == 1 ? BC_LOAD_REG_8 : BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + ByteCodeInstruction lins(InterTypeSize[ins->mSrc[0].mType] == 1 ? BC_LOAD_REG_8 : BC_LOAD_REG_16); + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); ByteCodeInstruction bins(bci); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } - else if (ins->mSTemp[0] < 0) + else if (ins->mSrc[0].mTemp < 0) { - if (ins->mSTemp[1] == ins->mTTemp) + if (ins->mSrc[1].mTemp == ins->mDst.mTemp) { ByteCodeInstruction bins(bcis); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; - bins.mValue = ins->mSIntConst[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; + bins.mValue = ins->mSrc[0].mIntConst; mIns.Push(bins); return; } - ByteCodeInstruction lins(InterTypeSize[ins->mSType[1]] == 1 ? BC_LOAD_REG_8 : BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + ByteCodeInstruction lins(InterTypeSize[ins->mSrc[1].mType] == 1 ? BC_LOAD_REG_8 : BC_LOAD_REG_16); + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction bins(bci); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mSIntConst[0]; + bins.mValue = ins->mSrc[0].mIntConst; mIns.Push(bins); } else { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction bins(bc); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } } break; case IA_SUB: - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - if (ins->mSTemp[0] == ins->mTTemp) + if (ins->mSrc[0].mTemp == ins->mDst.mTemp) { ByteCodeInstruction bins(BC_BINOP_SUBI_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; - bins.mValue = ins->mSIntConst[1]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); return; } ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); ByteCodeInstruction bins(BC_BINOP_SUBI_16); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } - else if (ins->mSTemp[0] < 0) + else if (ins->mSrc[0].mTemp < 0) { - if (ins->mSTemp[1] == ins->mTTemp) + if (ins->mSrc[1].mTemp == ins->mDst.mTemp) { - ByteCodeInstruction bins(InterTypeSize[ins->mSType[0]] == 1 ? BC_BINOP_ADDI_8 : BC_BINOP_ADDI_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; - bins.mValue = - ins->mSIntConst[0]; + ByteCodeInstruction bins(InterTypeSize[ins->mSrc[0].mType] == 1 ? BC_BINOP_ADDI_8 : BC_BINOP_ADDI_16); + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; + bins.mValue = - ins->mSrc[0].mIntConst; mIns.Push(bins); return; } ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction bins(BC_BINOP_ADDI_16); bins.mRegister = BC_REG_ACCU; - bins.mValue = - ins->mSIntConst[0]; + bins.mValue = - ins->mSrc[0].mIntConst; mIns.Push(bins); } else { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction bins(BC_BINOP_SUBR_16); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } break; @@ -2596,114 +2596,114 @@ void ByteCodeBasicBlock::BinaryOperator(InterCodeProcedure* proc, const InterIns { ByteCode bc = ByteCodeBinRegOperator(ins); ByteCode bci = ByteCodeBinImmOperator(ins); - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - if (ins->mSIntConst[1] >= 0 && ins->mSIntConst[1] <= 255) + if (ins->mSrc[1].mIntConst >= 0 && ins->mSrc[1].mIntConst <= 255) { - if (ins->mSTemp[0] == ins->mTTemp) + if (ins->mSrc[0].mTemp == ins->mDst.mTemp) { ByteCodeInstruction bins(bci); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; - bins.mValue = ins->mSIntConst[1]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); return; } ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); ByteCodeInstruction bins(bci); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mSIntConst[1]; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } else { - IntConstToAccu(ins->mSIntConst[1]); + IntConstToAccu(ins->mSrc[1].mIntConst); ByteCodeInstruction bins(bc); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } } - else if (ins->mSTemp[0] < 0) + else if (ins->mSrc[0].mTemp < 0) { - if (ins->mSIntConst[0] >= 0 && ins->mSIntConst[0] <= 255) + if (ins->mSrc[0].mIntConst >= 0 && ins->mSrc[0].mIntConst <= 255) { - if (ins->mSTemp[1] == ins->mTTemp) + if (ins->mSrc[1].mTemp == ins->mDst.mTemp) { ByteCodeInstruction bins(bci); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - bins.mRegisterFinal = ins->mSFinal[1]; - bins.mValue = ins->mSIntConst[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + bins.mRegisterFinal = ins->mSrc[1].mFinal; + bins.mValue = ins->mSrc[0].mIntConst; mIns.Push(bins); return; } ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction bins(bci); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mSIntConst[0]; + bins.mValue = ins->mSrc[0].mIntConst; mIns.Push(bins); } else { - IntConstToAccu(ins->mSIntConst[0]); + IntConstToAccu(ins->mSrc[0].mIntConst); ByteCodeInstruction bins(bc); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - bins.mRegisterFinal = ins->mSFinal[1]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + bins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(bins); } } else { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction bins(bc); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } } break; case IA_XOR: { ByteCode bc = ByteCodeBinRegOperator(ins); - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - IntConstToAccu(ins->mSIntConst[1]); + IntConstToAccu(ins->mSrc[1].mIntConst); ByteCodeInstruction bins(bc); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } - else if (ins->mSTemp[0] < 0) + else if (ins->mSrc[0].mTemp < 0) { - IntConstToAccu(ins->mSIntConst[0]); + IntConstToAccu(ins->mSrc[0].mIntConst); ByteCodeInstruction bins(bc); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - bins.mRegisterFinal = ins->mSFinal[1]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + bins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(bins); } else { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction bins(bc); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } } break; @@ -2713,22 +2713,22 @@ void ByteCodeBasicBlock::BinaryOperator(InterCodeProcedure* proc, const InterIns case IA_MODU: { ByteCode bc = ByteCodeBinRegOperator(ins); - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - IntConstToAccu(ins->mSIntConst[1]); + IntConstToAccu(ins->mSrc[1].mIntConst); ByteCodeInstruction bins(bc); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } - else if (ins->mSTemp[0] < 0) + else if (ins->mSrc[0].mTemp < 0) { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); - IntConstToAddr(ins->mSIntConst[0]); + IntConstToAddr(ins->mSrc[0].mIntConst); ByteCodeInstruction bins(bc); bins.mRegister = BC_REG_ADDR; @@ -2737,13 +2737,13 @@ void ByteCodeBasicBlock::BinaryOperator(InterCodeProcedure* proc, const InterIns else { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction bins(bc); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } } break; @@ -2755,44 +2755,44 @@ void ByteCodeBasicBlock::BinaryOperator(InterCodeProcedure* proc, const InterIns ByteCode rbc = ByteCodeBinRegOperator(ins); ByteCode ibc = ByteCodeBinImmOperator(ins); - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - IntConstToAccu(ins->mSIntConst[1]); + IntConstToAccu(ins->mSrc[1].mIntConst); ByteCodeInstruction bins(rbc); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } - else if (ins->mSTemp[0] < 0) + else if (ins->mSrc[0].mTemp < 0) { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction bins(ibc); - bins.mValue = ins->mSIntConst[0]; + bins.mValue = ins->mSrc[0].mIntConst; mIns.Push(bins); } else { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; - lins.mRegisterFinal = ins->mSFinal[1]; + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); ByteCodeInstruction bins(rbc); - bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - bins.mRegisterFinal = ins->mSFinal[0]; + bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } } break; } - ByteCodeInstruction sins(InterTypeSize[ins->mSType[1]] == 1 ? BC_STORE_REG_8 : BC_STORE_REG_16); - sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + ByteCodeInstruction sins(InterTypeSize[ins->mSrc[1].mType] == 1 ? BC_STORE_REG_8 : BC_STORE_REG_16); + sins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } } @@ -2819,41 +2819,41 @@ void ByteCodeBasicBlock::Compile(InterCodeProcedure* iproc, ByteCodeProcedure* p break; case IC_LOAD_TEMPORARY: { - if (ins->mSTemp[0] != ins->mTTemp) + if (ins->mSrc[0].mTemp != ins->mDst.mTemp) { - switch (ins->mTType) + switch (ins->mDst.mType) { case IT_BOOL: case IT_INT8: { ByteCodeInstruction lins(BC_LOAD_REG_8); - lins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); ByteCodeInstruction sins(BC_STORE_REG_8); - sins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } break; case IT_INT16: case IT_POINTER: { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); ByteCodeInstruction sins(BC_STORE_REG_16); - sins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } break; case IT_INT32: case IT_FLOAT: { ByteCodeInstruction lins(BC_LOAD_REG_32); - lins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); ByteCodeInstruction sins(BC_STORE_REG_32); - sins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } break; @@ -2898,7 +2898,7 @@ void ByteCodeBasicBlock::Compile(InterCodeProcedure* iproc, ByteCodeProcedure* p } break; case IC_RELATIONAL_OPERATOR: - if (i + 1 < sblock->mInstructions.Size() && sblock->mInstructions[i + 1]->mCode == IC_BRANCH && sblock->mInstructions[i + 1]->mSFinal[0]) + if (i + 1 < sblock->mInstructions.Size() && sblock->mInstructions[i + 1]->mCode == IC_BRANCH && sblock->mInstructions[i + 1]->mSrc[0].mFinal) { ByteCode code = RelationalOperator(iproc, ins); this->Close(proc->CompileBlock(iproc, sblock->mTrueJump), proc->CompileBlock(iproc, sblock->mFalseJump), code); @@ -2910,27 +2910,27 @@ void ByteCodeBasicBlock::Compile(InterCodeProcedure* iproc, ByteCodeProcedure* p ByteCode code = RelationalOperator(iproc, ins); ByteCodeInstruction bins(ByteCode(code - BC_BRANCHS_EQ + BC_SET_EQ)); mIns.Push(bins); - ByteCodeInstruction sins(StoreTypedTmpCodes[ins->mTType]); - sins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mTTemp]; + ByteCodeInstruction sins(StoreTypedTmpCodes[ins->mDst.mType]); + sins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } break; case IC_RETURN_VALUE: - if (ins->mSTemp[0] < 0) - IntConstToAccu(ins->mSIntConst[0]); - else if (ins->mSType[0] == IT_FLOAT || ins->mSType[0] == IT_INT32) + if (ins->mSrc[0].mTemp < 0) + IntConstToAccu(ins->mSrc[0].mIntConst); + else if (ins->mSrc[0].mType == IT_FLOAT || ins->mSrc[0].mType == IT_INT32) { ByteCodeInstruction lins(BC_LOAD_REG_32); - lins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); } else { - ByteCodeInstruction lins(InterTypeSize[ins->mSType[0]] == 1 ? BC_LOAD_REG_8 : BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + ByteCodeInstruction lins(InterTypeSize[ins->mSrc[0].mType] == 1 ? BC_LOAD_REG_8 : BC_LOAD_REG_16); + lins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); } @@ -2942,31 +2942,31 @@ void ByteCodeBasicBlock::Compile(InterCodeProcedure* iproc, ByteCodeProcedure* p return; case IC_TYPECAST: - if (ins->mSTemp[0] >= 0 && ins->mTTemp != ins->mSTemp[0]) + if (ins->mSrc[0].mTemp >= 0 && ins->mDst.mTemp != ins->mSrc[0].mTemp) { ByteCodeInstruction lins(BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + lins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); ByteCodeInstruction sins(BC_STORE_REG_16); - sins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mTTemp]; + sins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mDst.mTemp]; mIns.Push(sins); } break; case IC_BRANCH: - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - if (ins->mSIntConst[0] == 0) + if (ins->mSrc[0].mIntConst == 0) this->Close(proc->CompileBlock(iproc, sblock->mFalseJump), nullptr, BC_JUMPS); else this->Close(proc->CompileBlock(iproc, sblock->mTrueJump), nullptr, BC_JUMPS); } else { - ByteCodeInstruction lins(InterTypeSize[ins->mSType[0]] == 1 ? BC_LOAD_REG_8 : BC_LOAD_REG_16); - lins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]]; - lins.mRegisterFinal = ins->mSFinal[0]; + ByteCodeInstruction lins(InterTypeSize[ins->mSrc[0].mType] == 1 ? BC_LOAD_REG_8 : BC_LOAD_REG_16); + lins.mRegister = BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); this->Close(proc->CompileBlock(iproc, sblock->mTrueJump), proc->CompileBlock(iproc, sblock->mFalseJump), BC_BRANCHS_NE); diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 45e9325..f55fcf3 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -242,32 +242,32 @@ static void ConversionConstantFold(InterInstruction * ins, InterInstruction * ci case IA_INT2FLOAT: ins->mCode = IC_CONSTANT; ins->mFloatValue = (double)(cins->mIntValue); - ins->mSTemp[0] = -1; + ins->mSrc[0].mTemp = -1; break; case IA_FLOAT2INT: ins->mCode = IC_CONSTANT; ins->mIntValue = (int)(cins->mFloatValue); - ins->mSTemp[0] = -1; + ins->mSrc[0].mTemp = -1; break; case IA_EXT8TO16S: ins->mCode = IC_CONSTANT; ins->mIntValue = (int8)(cins->mIntValue); - ins->mSTemp[0] = -1; + ins->mSrc[0].mTemp = -1; break; case IA_EXT8TO16U: ins->mCode = IC_CONSTANT; ins->mIntValue = (uint8)(cins->mIntValue); - ins->mSTemp[0] = -1; + ins->mSrc[0].mTemp = -1; break; case IA_EXT16TO32S: ins->mCode = IC_CONSTANT; ins->mIntValue = (int16)(cins->mIntValue); - ins->mSTemp[0] = -1; + ins->mSrc[0].mTemp = -1; break; case IA_EXT16TO32U: ins->mCode = IC_CONSTANT; ins->mIntValue = (uint16)(cins->mIntValue); - ins->mSTemp[0] = -1; + ins->mSrc[0].mTemp = -1; break; } } @@ -293,7 +293,7 @@ void ValueSet::InsertValue(InterInstruction * ins) static bool MemPtrRange(const InterInstruction* ins, const GrowingInstructionPtrArray& tvalue, InterMemory& mem, int& vindex, int& offset) { while (ins && ins->mMemory == IM_INDIRECT && ins->mCode == IC_LEA) - ins = tvalue[ins->mSTemp[1]]; + ins = tvalue[ins->mSrc[1].mTemp]; if (ins && (ins->mCode == IC_CONSTANT || ins->mCode == IC_LEA)) { @@ -313,9 +313,9 @@ static bool MemRange(const InterInstruction * ins, const GrowingInstructionPtrAr if (ins->mMemory == IM_INDIRECT) { if (ins->mCode == IC_LOAD) - return MemPtrRange(tvalue[ins->mSTemp[0]], tvalue, mem, vindex, offset); + return MemPtrRange(tvalue[ins->mSrc[0].mTemp], tvalue, mem, vindex, offset); else - return MemPtrRange(tvalue[ins->mSTemp[1]], tvalue, mem, vindex, offset); + return MemPtrRange(tvalue[ins->mSrc[1].mTemp], tvalue, mem, vindex, offset); } if (ins) { @@ -378,17 +378,17 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr { int i, value, temp; - temp = ins->mTTemp; + temp = ins->mDst.mTemp; if (temp >= 0) { i = 0; while (i < mNum) { - if (temp == mInstructions[i]->mTTemp || - temp == mInstructions[i]->mSTemp[0] || - temp == mInstructions[i]->mSTemp[1] || - temp == mInstructions[i]->mSTemp[2]) + if (temp == mInstructions[i]->mDst.mTemp || + temp == mInstructions[i]->mSrc[0].mTemp || + temp == mInstructions[i]->mSrc[1].mTemp || + temp == mInstructions[i]->mSrc[2].mTemp) { mNum--; if (i < mNum) @@ -401,10 +401,10 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr for (i = 0; i < 3; i++) { - temp = ins->mSTemp[i]; + temp = ins->mSrc[i].mTemp; if (temp >= 0 && tvalue[temp]) { - ins->mSTemp[i] = tvalue[temp]->mTTemp; + ins->mSrc[i].mTemp = tvalue[temp]->mDst.mTemp; } } @@ -414,7 +414,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr i = 0; while (i < mNum && (mInstructions[i]->mCode != IC_LOAD || - mInstructions[i]->mSTemp[0] != ins->mSTemp[0] || + mInstructions[i]->mSrc[0].mTemp != ins->mSrc[0].mTemp || mInstructions[i]->mOperandSize != ins->mOperandSize)) { i++; @@ -423,16 +423,16 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr if (i < mNum) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = mInstructions[i]->mTTemp; - ins->mSType[0] = mInstructions[i]->mTType; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = mInstructions[i]->mDst.mTemp; + ins->mSrc[0].mType = mInstructions[i]->mDst.mType; + assert(ins->mSrc[0].mTemp >= 0); } else { i = 0; while (i < mNum && (mInstructions[i]->mCode != IC_STORE || - mInstructions[i]->mSTemp[1] != ins->mSTemp[0] || + mInstructions[i]->mSrc[1].mTemp != ins->mSrc[0].mTemp || mInstructions[i]->mOperandSize != ins->mOperandSize)) { i++; @@ -440,19 +440,19 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr if (i < mNum) { - if (mInstructions[i]->mSTemp[0] < 0) + if (mInstructions[i]->mSrc[0].mTemp < 0) { ins->mCode = IC_CONSTANT; - ins->mSTemp[0] = -1; - ins->mSType[0] = mInstructions[i]->mSType[0]; - ins->mIntValue = mInstructions[i]->mSIntConst[0]; + ins->mSrc[0].mTemp = -1; + ins->mSrc[0].mType = mInstructions[i]->mSrc[0].mType; + ins->mIntValue = mInstructions[i]->mSrc[0].mIntConst; } else { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = mInstructions[i]->mSTemp[0]; - ins->mSType[0] = mInstructions[i]->mSType[0]; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = mInstructions[i]->mSrc[0].mTemp; + ins->mSrc[0].mType = mInstructions[i]->mSrc[0].mType; + assert(ins->mSrc[0].mTemp >= 0); } } else @@ -495,13 +495,13 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr break; case IC_CONSTANT: - switch (ins->mTType) + switch (ins->mDst.mType) { case IT_FLOAT: i = 0; while (i < mNum && (mInstructions[i]->mCode != IC_CONSTANT || - mInstructions[i]->mTType != ins->mTType || + mInstructions[i]->mDst.mType != ins->mDst.mType || mInstructions[i]->mFloatValue != ins->mFloatValue)) { i++; @@ -511,7 +511,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr i = 0; while (i < mNum && (mInstructions[i]->mCode != IC_CONSTANT || - mInstructions[i]->mTType != ins->mTType || + mInstructions[i]->mDst.mType != ins->mDst.mType || mInstructions[i]->mIntValue != ins->mIntValue || mInstructions[i]->mMemory != ins->mMemory || mInstructions[i]->mVarIndex != ins->mVarIndex || @@ -525,7 +525,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr i = 0; while (i < mNum && (mInstructions[i]->mCode != IC_CONSTANT || - mInstructions[i]->mTType != ins->mTType || + mInstructions[i]->mDst.mType != ins->mDst.mType || mInstructions[i]->mIntValue != ins->mIntValue)) { i++; @@ -535,9 +535,9 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr if (i < mNum) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = mInstructions[i]->mTTemp; - ins->mSType[0] = mInstructions[i]->mTType; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = mInstructions[i]->mDst.mTemp; + ins->mSrc[0].mType = mInstructions[i]->mDst.mType; + assert(ins->mSrc[0].mTemp >= 0); } else { @@ -549,9 +549,9 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr i = 0; while (i < mNum && (mInstructions[i]->mCode != IC_LEA || - mInstructions[i]->mSTemp[0] != ins->mSTemp[0] || - mInstructions[i]->mSIntConst[0] != ins->mSIntConst[0] || - mInstructions[i]->mSTemp[1] != ins->mSTemp[1])) + mInstructions[i]->mSrc[0].mTemp != ins->mSrc[0].mTemp || + mInstructions[i]->mSrc[0].mIntConst != ins->mSrc[0].mIntConst || + mInstructions[i]->mSrc[1].mTemp != ins->mSrc[1].mTemp)) { i++; } @@ -559,10 +559,10 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr if (i < mNum) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = mInstructions[i]->mTTemp; - ins->mSType[0] = mInstructions[i]->mTType; - ins->mSTemp[1] = -1; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = mInstructions[i]->mDst.mTemp; + ins->mSrc[0].mType = mInstructions[i]->mDst.mType; + ins->mSrc[1].mTemp = -1; + assert(ins->mSrc[0].mTemp >= 0); } else { @@ -571,21 +571,21 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr break; case IC_BINARY_OPERATOR: - switch (ins->mSType[0]) + switch (ins->mSrc[0].mType) { case IT_FLOAT: - if (ins->mSTemp[1] >= 0 && tvalue[ins->mSTemp[1]] && tvalue[ins->mSTemp[1]]->mCode == IC_CONSTANT && - ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT && + ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { ins->mCode = IC_CONSTANT; - ins->mFloatValue = ConstantFolding(ins->mOperator, tvalue[ins->mSTemp[1]]->mFloatValue, tvalue[ins->mSTemp[0]]->mFloatValue); - ins->mSTemp[0] = -1; - ins->mSTemp[1] = -1; + ins->mFloatValue = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mFloatValue, tvalue[ins->mSrc[0].mTemp]->mFloatValue); + ins->mSrc[0].mTemp = -1; + ins->mSrc[1].mTemp = -1; i = 0; while (i < mNum && (mInstructions[i]->mCode != IC_CONSTANT || - mInstructions[i]->mTType != ins->mTType || + mInstructions[i]->mDst.mType != ins->mDst.mType || mInstructions[i]->mFloatValue != ins->mFloatValue)) { i++; @@ -594,9 +594,9 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr if (i < mNum) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = mInstructions[i]->mTTemp; - ins->mSType[0] = mInstructions[i]->mTType; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = mInstructions[i]->mDst.mTemp; + ins->mSrc[0].mType = mInstructions[i]->mDst.mType; + assert(ins->mSrc[0].mTemp >= 0); } else { @@ -609,8 +609,8 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr while (i < mNum && (mInstructions[i]->mCode != IC_BINARY_OPERATOR || mInstructions[i]->mOperator != ins->mOperator || - mInstructions[i]->mSTemp[0] != ins->mSTemp[0] || - mInstructions[i]->mSTemp[1] != ins->mSTemp[1])) + mInstructions[i]->mSrc[0].mTemp != ins->mSrc[0].mTemp || + mInstructions[i]->mSrc[1].mTemp != ins->mSrc[1].mTemp)) { i++; } @@ -618,10 +618,10 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr if (i < mNum) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = mInstructions[i]->mTTemp; - ins->mSType[0] = mInstructions[i]->mTType; - ins->mSTemp[1] = -1; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = mInstructions[i]->mDst.mTemp; + ins->mSrc[0].mType = mInstructions[i]->mDst.mType; + ins->mSrc[1].mTemp = -1; + assert(ins->mSrc[0].mTemp >= 0); } else { @@ -632,94 +632,94 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr case IT_POINTER: break; default: - if (ins->mSTemp[1] >= 0 && tvalue[ins->mSTemp[1]] && tvalue[ins->mSTemp[1]]->mCode == IC_CONSTANT && - ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT && + ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { ins->mCode = IC_CONSTANT; - ins->mIntValue = ConstantFolding(ins->mOperator, tvalue[ins->mSTemp[1]]->mIntValue, tvalue[ins->mSTemp[0]]->mIntValue); - ins->mSTemp[0] = -1; - ins->mSTemp[1] = -1; + ins->mIntValue = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mIntValue, tvalue[ins->mSrc[0].mTemp]->mIntValue); + ins->mSrc[0].mTemp = -1; + ins->mSrc[1].mTemp = -1; UpdateValue(ins, tvalue, aliasedLocals, aliasedParams); return; } - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { if ((ins->mOperator == IA_ADD || ins->mOperator == IA_SUB || ins->mOperator == IA_OR || ins->mOperator == IA_XOR || - ins->mOperator == IA_SHL || ins->mOperator == IA_SHR || ins->mOperator == IA_SAR) && tvalue[ins->mSTemp[0]]->mIntValue == 0 || - (ins->mOperator == IA_MUL || ins->mOperator == IA_DIVU || ins->mOperator == IA_DIVS) && tvalue[ins->mSTemp[0]]->mIntValue == 1 || - (ins->mOperator == IA_AND) && tvalue[ins->mSTemp[0]]->mIntValue == -1) + ins->mOperator == IA_SHL || ins->mOperator == IA_SHR || ins->mOperator == IA_SAR) && tvalue[ins->mSrc[0].mTemp]->mIntValue == 0 || + (ins->mOperator == IA_MUL || ins->mOperator == IA_DIVU || ins->mOperator == IA_DIVS) && tvalue[ins->mSrc[0].mTemp]->mIntValue == 1 || + (ins->mOperator == IA_AND) && tvalue[ins->mSrc[0].mTemp]->mIntValue == -1) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = ins->mSTemp[1]; - ins->mSType[0] = ins->mSType[1]; - ins->mSTemp[1] = -1; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = ins->mSrc[1].mTemp; + ins->mSrc[0].mType = ins->mSrc[1].mType; + ins->mSrc[1].mTemp = -1; + assert(ins->mSrc[0].mTemp >= 0); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams); return; } - else if ((ins->mOperator == IA_MUL || ins->mOperator == IA_AND) && tvalue[ins->mSTemp[0]]->mIntValue == 0) + else if ((ins->mOperator == IA_MUL || ins->mOperator == IA_AND) && tvalue[ins->mSrc[0].mTemp]->mIntValue == 0) { ins->mCode = IC_CONSTANT; ins->mIntValue = 0; - ins->mSTemp[0] = -1; - ins->mSTemp[1] = -1; + ins->mSrc[0].mTemp = -1; + ins->mSrc[1].mTemp = -1; UpdateValue(ins, tvalue, aliasedLocals, aliasedParams); return; } } - else if (ins->mSTemp[1] >= 0 && tvalue[ins->mSTemp[1]] && tvalue[ins->mSTemp[1]]->mCode == IC_CONSTANT) + else if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT) { - if ((ins->mOperator == IA_ADD || ins->mOperator == IA_OR || ins->mOperator == IA_XOR) && tvalue[ins->mSTemp[1]]->mIntValue == 0 || - (ins->mOperator == IA_MUL) && tvalue[ins->mSTemp[1]]->mIntValue == 1 || - (ins->mOperator == IA_AND) && tvalue[ins->mSTemp[1]]->mIntValue == -1) + if ((ins->mOperator == IA_ADD || ins->mOperator == IA_OR || ins->mOperator == IA_XOR) && tvalue[ins->mSrc[1].mTemp]->mIntValue == 0 || + (ins->mOperator == IA_MUL) && tvalue[ins->mSrc[1].mTemp]->mIntValue == 1 || + (ins->mOperator == IA_AND) && tvalue[ins->mSrc[1].mTemp]->mIntValue == -1) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[1] = -1; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[1].mTemp = -1; + assert(ins->mSrc[0].mTemp >= 0); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams); return; } else if ((ins->mOperator == IA_MUL || ins->mOperator == IA_AND || - ins->mOperator == IA_SHL || ins->mOperator == IA_SHR || ins->mOperator == IA_SAR) && tvalue[ins->mSTemp[1]]->mIntValue == 0) + ins->mOperator == IA_SHL || ins->mOperator == IA_SHR || ins->mOperator == IA_SAR) && tvalue[ins->mSrc[1].mTemp]->mIntValue == 0) { ins->mCode = IC_CONSTANT; ins->mIntValue = 0; - ins->mSTemp[0] = -1; - ins->mSTemp[1] = -1; + ins->mSrc[0].mTemp = -1; + ins->mSrc[1].mTemp = -1; UpdateValue(ins, tvalue, aliasedLocals, aliasedParams); return; } - else if (ins->mOperator == IA_SUB && tvalue[ins->mSTemp[1]]->mIntValue == 0) + else if (ins->mOperator == IA_SUB && tvalue[ins->mSrc[1].mTemp]->mIntValue == 0) { ins->mCode = IC_UNARY_OPERATOR; ins->mOperator = IA_NEG; - ins->mSTemp[1] = -1; + ins->mSrc[1].mTemp = -1; UpdateValue(ins, tvalue, aliasedLocals, aliasedParams); return; } } - else if (ins->mSTemp[0] == ins->mSTemp[1]) + else if (ins->mSrc[0].mTemp == ins->mSrc[1].mTemp) { if (ins->mOperator == IA_SUB || ins->mOperator == IA_XOR) { ins->mCode = IC_CONSTANT; ins->mIntValue = 0; - ins->mSTemp[0] = -1; - ins->mSTemp[1] = -1; + ins->mSrc[0].mTemp = -1; + ins->mSrc[1].mTemp = -1; UpdateValue(ins, tvalue, aliasedLocals, aliasedParams); @@ -728,8 +728,8 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr else if (ins->mOperator == IA_AND || ins->mOperator == IA_OR) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[1] = -1; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[1].mTemp = -1; + assert(ins->mSrc[0].mTemp >= 0); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams); @@ -741,8 +741,8 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr while (i < mNum && (mInstructions[i]->mCode != IC_BINARY_OPERATOR || mInstructions[i]->mOperator != ins->mOperator || - mInstructions[i]->mSTemp[0] != ins->mSTemp[0] || - mInstructions[i]->mSTemp[1] != ins->mSTemp[1])) + mInstructions[i]->mSrc[0].mTemp != ins->mSrc[0].mTemp || + mInstructions[i]->mSrc[1].mTemp != ins->mSrc[1].mTemp)) { i++; } @@ -750,10 +750,10 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr if (i < mNum) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = mInstructions[i]->mTTemp; - ins->mSType[0] = mInstructions[i]->mTType; - ins->mSTemp[1] = -1; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = mInstructions[i]->mDst.mTemp; + ins->mSrc[0].mType = mInstructions[i]->mDst.mType; + ins->mSrc[1].mTemp = -1; + assert(ins->mSrc[0].mTemp >= 0); } else { @@ -764,15 +764,15 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr break; case IC_CONVERSION_OPERATOR: - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - ConversionConstantFold(ins, tvalue[ins->mSTemp[0]]); - if (ins->mTType == IT_FLOAT) + ConversionConstantFold(ins, tvalue[ins->mSrc[0].mTemp]); + if (ins->mDst.mType == IT_FLOAT) { i = 0; while (i < mNum && (mInstructions[i]->mCode != IC_CONSTANT || - mInstructions[i]->mTType != ins->mTType || + mInstructions[i]->mDst.mType != ins->mDst.mType || mInstructions[i]->mFloatValue != ins->mFloatValue)) { i++; @@ -781,9 +781,9 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr if (i < mNum) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = mInstructions[i]->mTTemp; - ins->mSType[0] = mInstructions[i]->mTType; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = mInstructions[i]->mDst.mTemp; + ins->mSrc[0].mType = mInstructions[i]->mDst.mType; + assert(ins->mSrc[0].mTemp >= 0); } else { @@ -801,7 +801,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr while (i < mNum && (mInstructions[i]->mCode != IC_CONVERSION_OPERATOR || mInstructions[i]->mOperator != ins->mOperator || - mInstructions[i]->mSTemp[0] != ins->mSTemp[0])) + mInstructions[i]->mSrc[0].mTemp != ins->mSrc[0].mTemp)) { i++; } @@ -809,10 +809,10 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr if (i < mNum) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = mInstructions[i]->mTTemp; - ins->mSType[0] = mInstructions[i]->mTType; - ins->mSTemp[1] = -1; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = mInstructions[i]->mDst.mTemp; + ins->mSrc[0].mType = mInstructions[i]->mDst.mType; + ins->mSrc[1].mTemp = -1; + assert(ins->mSrc[0].mTemp >= 0); } else { @@ -822,19 +822,19 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr break; case IC_UNARY_OPERATOR: - switch (ins->mSType[0]) + switch (ins->mSrc[0].mType) { case IT_FLOAT: - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { ins->mCode = IC_CONSTANT; - ins->mFloatValue = ConstantFolding(ins->mOperator, tvalue[ins->mSTemp[0]]->mFloatValue); - ins->mSTemp[0] = -1; + ins->mFloatValue = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[0].mTemp]->mFloatValue); + ins->mSrc[0].mTemp = -1; i = 0; while (i < mNum && (mInstructions[i]->mCode != IC_CONSTANT || - mInstructions[i]->mTType != ins->mTType || + mInstructions[i]->mDst.mType != ins->mDst.mType || mInstructions[i]->mFloatValue != ins->mFloatValue)) { i++; @@ -843,9 +843,9 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr if (i < mNum) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = mInstructions[i]->mTTemp; - ins->mSType[0] = mInstructions[i]->mTType; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = mInstructions[i]->mDst.mTemp; + ins->mSrc[0].mType = mInstructions[i]->mDst.mType; + assert(ins->mSrc[0].mTemp >= 0); } else { @@ -858,7 +858,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr while (i < mNum && (mInstructions[i]->mCode != IC_UNARY_OPERATOR || mInstructions[i]->mOperator != ins->mOperator || - mInstructions[i]->mSTemp[0] != ins->mSTemp[0])) + mInstructions[i]->mSrc[0].mTemp != ins->mSrc[0].mTemp)) { i++; } @@ -866,10 +866,10 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr if (i < mNum) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = mInstructions[i]->mTTemp; - ins->mSType[0] = mInstructions[i]->mTType; - ins->mSTemp[1] = -1; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = mInstructions[i]->mDst.mTemp; + ins->mSrc[0].mType = mInstructions[i]->mDst.mType; + ins->mSrc[1].mTemp = -1; + assert(ins->mSrc[0].mTemp >= 0); } else { @@ -880,16 +880,16 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr case IT_POINTER: break; default: - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { ins->mCode = IC_CONSTANT; - ins->mIntValue = ConstantFolding(ins->mOperator, tvalue[ins->mSTemp[0]]->mIntValue); - ins->mSTemp[0] = -1; + ins->mIntValue = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[0].mTemp]->mIntValue); + ins->mSrc[0].mTemp = -1; i = 0; while (i < mNum && (mInstructions[i]->mCode != IC_CONSTANT || - mInstructions[i]->mTType != ins->mTType || + mInstructions[i]->mDst.mType != ins->mDst.mType || mInstructions[i]->mIntValue != ins->mIntValue)) { i++; @@ -898,9 +898,9 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr if (i < mNum) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = mInstructions[i]->mTTemp; - ins->mSType[0] = mInstructions[i]->mTType; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = mInstructions[i]->mDst.mTemp; + ins->mSrc[0].mType = mInstructions[i]->mDst.mType; + assert(ins->mSrc[0].mTemp >= 0); } else { @@ -913,7 +913,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr while (i < mNum && (mInstructions[i]->mCode != IC_UNARY_OPERATOR || mInstructions[i]->mOperator != ins->mOperator || - mInstructions[i]->mSTemp[0] != ins->mSTemp[0])) + mInstructions[i]->mSrc[0].mTemp != ins->mSrc[0].mTemp)) { i++; } @@ -921,9 +921,9 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr if (i < mNum) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = mInstructions[i]->mTTemp; - ins->mSType[0] = mInstructions[i]->mTType; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = mInstructions[i]->mDst.mTemp; + ins->mSrc[0].mType = mInstructions[i]->mDst.mType; + assert(ins->mSrc[0].mTemp >= 0); } else { @@ -935,16 +935,16 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr break; case IC_RELATIONAL_OPERATOR: - switch (ins->mSType[1]) + switch (ins->mSrc[1].mType) { case IT_FLOAT: - if (ins->mSTemp[1] >= 0 && tvalue[ins->mSTemp[1]] && tvalue[ins->mSTemp[1]]->mCode == IC_CONSTANT && - ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT && + ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { ins->mCode = IC_CONSTANT; - ins->mIntValue = ConstantRelationalFolding(ins->mOperator, tvalue[ins->mSTemp[1]]->mFloatValue, tvalue[ins->mSTemp[0]]->mFloatValue); - ins->mSTemp[0] = -1; - ins->mSTemp[1] = -1; + ins->mIntValue = ConstantRelationalFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mFloatValue, tvalue[ins->mSrc[0].mTemp]->mFloatValue); + ins->mSrc[0].mTemp = -1; + ins->mSrc[1].mTemp = -1; UpdateValue(ins, tvalue, aliasedLocals, aliasedParams); } @@ -952,17 +952,17 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr case IT_POINTER: break; default: - if (ins->mSTemp[1] >= 0 && tvalue[ins->mSTemp[1]] && tvalue[ins->mSTemp[1]]->mCode == IC_CONSTANT && - ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT && + ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { ins->mCode = IC_CONSTANT; - ins->mIntValue = ConstantFolding(ins->mOperator, tvalue[ins->mSTemp[1]]->mIntValue, tvalue[ins->mSTemp[0]]->mIntValue); - ins->mSTemp[0] = -1; - ins->mSTemp[1] = -1; + ins->mIntValue = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mIntValue, tvalue[ins->mSrc[0].mTemp]->mIntValue); + ins->mSrc[0].mTemp = -1; + ins->mSrc[1].mTemp = -1; UpdateValue(ins, tvalue, aliasedLocals, aliasedParams); } - else if (ins->mSTemp[1] == ins->mSTemp[0]) + else if (ins->mSrc[1].mTemp == ins->mSrc[0].mTemp) { ins->mCode = IC_CONSTANT; @@ -983,8 +983,8 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr ins->mIntValue = 0; break; } - ins->mSTemp[0] = -1; - ins->mSTemp[1] = -1; + ins->mSrc[0].mTemp = -1; + ins->mSrc[1].mTemp = -1; UpdateValue(ins, tvalue, aliasedLocals, aliasedParams); } @@ -992,13 +992,13 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr } break; case IC_BRANCH: - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - if (tvalue[ins->mSTemp[0]]->mIntValue) + if (tvalue[ins->mSrc[0].mTemp]->mIntValue) ins->mCode = IC_JUMP; else ins->mCode = IC_JUMPF; - ins->mSTemp[0] = -1; + ins->mSrc[0].mTemp = -1; } break; case IC_CALL: @@ -1013,18 +1013,6 @@ InterInstruction::InterInstruction(void) { mCode = IC_NONE; - mTType = IT_NONE; - mSType[0] = IT_NONE; - mSType[1] = 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; @@ -1032,12 +1020,6 @@ InterInstruction::InterInstruction(void) mFloatValue = 0; mLinkerObject = nullptr; - mTTemp = INVALID_TEMPORARY; - mSTemp[0] = INVALID_TEMPORARY; - mSTemp[1] = INVALID_TEMPORARY; - mSTemp[2] = INVALID_TEMPORARY; - - mSFinal[0] = mSFinal[1] = mSFinal[2] = false; mInUse = false; mVolatile = false; } @@ -1105,33 +1087,33 @@ void InterInstruction::CollectLocalAddressTemps(GrowingIntArray& localTable, Gro { if (mCode == IC_CONSTANT) { - if (mTType == IT_POINTER && mMemory == IM_LOCAL) - localTable[mTTemp] = mVarIndex; - else if (mTType == IT_POINTER && mMemory == IM_PARAM) - paramTable[mTTemp] = mVarIndex; + if (mDst.mType == IT_POINTER && mMemory == IM_LOCAL) + localTable[mDst.mTemp] = mVarIndex; + else if (mDst.mType == IT_POINTER && mMemory == IM_PARAM) + paramTable[mDst.mTemp] = mVarIndex; } else if (mCode == IC_LEA) { if (mMemory == IM_LOCAL) - localTable[mTTemp] = localTable[mSTemp[1]]; + localTable[mDst.mTemp] = localTable[mSrc[1].mTemp]; else if (mMemory == IM_PARAM) - paramTable[mTTemp] = paramTable[mSTemp[1]]; + paramTable[mDst.mTemp] = paramTable[mSrc[1].mTemp]; } else if (mCode == IC_LOAD_TEMPORARY) { - localTable[mTTemp] = localTable[mSTemp[0]]; - paramTable[mTTemp] = paramTable[mSTemp[0]]; + localTable[mDst.mTemp] = localTable[mSrc[0].mTemp]; + paramTable[mDst.mTemp] = paramTable[mSrc[0].mTemp]; } } void InterInstruction::MarkAliasedLocalTemps(const GrowingIntArray& localTable, NumberSet& aliasedLocals, const GrowingIntArray& paramTable, NumberSet& aliasedParams) { - if (mCode == IC_STORE && mSTemp[0] >= 0) + if (mCode == IC_STORE && mSrc[0].mTemp >= 0) { - int l = localTable[mSTemp[0]]; + int l = localTable[mSrc[0].mTemp]; if (l >= 0) aliasedLocals += l; - l = paramTable[mSTemp[0]]; + l = paramTable[mSrc[0].mTemp]; if (l >= 0) aliasedParams += l; } @@ -1139,24 +1121,24 @@ void InterInstruction::MarkAliasedLocalTemps(const GrowingIntArray& localTable, void InterInstruction::FilterTempUsage(NumberSet& requiredTemps, NumberSet& providedTemps) { - FilterTempUseUsage(requiredTemps, providedTemps, mSTemp[0]); - FilterTempUseUsage(requiredTemps, providedTemps, mSTemp[1]); - FilterTempUseUsage(requiredTemps, providedTemps, mSTemp[2]); - FilterTempDefineUsage(requiredTemps, providedTemps, mTTemp); + FilterTempUseUsage(requiredTemps, providedTemps, mSrc[0].mTemp); + FilterTempUseUsage(requiredTemps, providedTemps, mSrc[1].mTemp); + FilterTempUseUsage(requiredTemps, providedTemps, mSrc[2].mTemp); + FilterTempDefineUsage(requiredTemps, providedTemps, mDst.mTemp); } void InterInstruction::FilterVarsUsage(const GrowingVariableArray& localVars, NumberSet& requiredVars, NumberSet& providedVars) { if (mCode == IC_LOAD && mMemory == IM_LOCAL) { - assert(mSTemp[0] < 0); + assert(mSrc[0].mTemp < 0); if (!providedVars[mVarIndex]) requiredVars += mVarIndex; } else if (mCode == IC_STORE && mMemory == IM_LOCAL) { - assert(mSTemp[1] < 0); - if (!providedVars[mVarIndex] && (mSIntConst[1] != 0 || mOperandSize != localVars[mVarIndex]->mSize)) + assert(mSrc[1].mTemp < 0); + if (!providedVars[mVarIndex] && (mSrc[1].mIntConst != 0 || mOperandSize != localVars[mVarIndex]->mSize)) requiredVars += mVarIndex; providedVars += mVarIndex; } @@ -1181,40 +1163,40 @@ bool InterInstruction::PropagateConstTemps(const GrowingInstructionPtrArray& cte switch (mCode) { case IC_LOAD: - if (mSTemp[0] >= 0 && ctemps[mSTemp[0]]) + if (mSrc[0].mTemp >= 0 && ctemps[mSrc[0].mTemp]) { - InterInstruction* ains = ctemps[mSTemp[0]]; - mSIntConst[0] = ains->mIntValue; + InterInstruction* ains = ctemps[mSrc[0].mTemp]; + mSrc[0].mIntConst = ains->mIntValue; mLinkerObject = ains->mLinkerObject; mVarIndex = ains->mVarIndex; mMemory = ains->mMemory; - mSTemp[0] = -1; + mSrc[0].mTemp = -1; return true; } break; case IC_STORE: - if (mSTemp[1] >= 0 && ctemps[mSTemp[1]]) + if (mSrc[1].mTemp >= 0 && ctemps[mSrc[1].mTemp]) { - InterInstruction* ains = ctemps[mSTemp[1]]; - mSIntConst[1] = ains->mIntValue; + InterInstruction* ains = ctemps[mSrc[1].mTemp]; + mSrc[1].mIntConst = ains->mIntValue; mLinkerObject = ains->mLinkerObject; mVarIndex = ains->mVarIndex; mMemory = ains->mMemory; - mSTemp[1] = -1; + mSrc[1].mTemp = -1; return true; } break; case IC_LOAD_TEMPORARY: - if (mSTemp[0] >= 0 && ctemps[mSTemp[0]]) + if (mSrc[0].mTemp >= 0 && ctemps[mSrc[0].mTemp]) { - InterInstruction* ains = ctemps[mSTemp[0]]; + InterInstruction* ains = ctemps[mSrc[0].mTemp]; mCode = IC_CONSTANT; mIntValue = ains->mIntValue; mFloatValue = ains->mFloatValue; mLinkerObject = ains->mLinkerObject; mVarIndex = ains->mVarIndex; mMemory = ains->mMemory; - mSTemp[0] = -1; + mSrc[0].mTemp = -1; return true; } } @@ -1224,13 +1206,13 @@ bool InterInstruction::PropagateConstTemps(const GrowingInstructionPtrArray& cte void InterInstruction::PerformTempForwarding(TempForwardingTable& forwardingTable) { - PerformTempUseForwarding(mSTemp[0], forwardingTable); - PerformTempUseForwarding(mSTemp[1], forwardingTable); - PerformTempUseForwarding(mSTemp[2], forwardingTable); - PerformTempDefineForwarding(mTTemp, forwardingTable); - if (mCode == IC_LOAD_TEMPORARY && mTTemp != mSTemp[0]) + PerformTempUseForwarding(mSrc[0].mTemp, forwardingTable); + PerformTempUseForwarding(mSrc[1].mTemp, forwardingTable); + PerformTempUseForwarding(mSrc[2].mTemp, forwardingTable); + PerformTempDefineForwarding(mDst.mTemp, forwardingTable); + if (mCode == IC_LOAD_TEMPORARY && mDst.mTemp != mSrc[0].mTemp) { - forwardingTable.Build(mTTemp, mSTemp[0]); + forwardingTable.Build(mDst.mTemp, mSrc[0].mTemp); } } @@ -1243,66 +1225,66 @@ bool InterInstruction::RemoveUnusedResultInstructions(InterInstruction* pre, Num { bool changed = false; - if (pre && mCode == IC_LOAD_TEMPORARY && pre->mTTemp == mSTemp[0] && !requiredTemps[mSTemp[0]] && pre->mTTemp >= numStaticTemps) + if (pre && mCode == IC_LOAD_TEMPORARY && pre->mDst.mTemp == mSrc[0].mTemp && !requiredTemps[mSrc[0].mTemp] && pre->mDst.mTemp >= numStaticTemps) { // previous instruction produced result, but it is not needed here - pre->mTTemp = mTTemp; + pre->mDst.mTemp = mDst.mTemp; mCode = IC_NONE; - mTTemp = -1; - mSTemp[0] = -1; - mSTemp[1] = -1; - mSTemp[2] = -1; + mDst.mTemp = -1; + mSrc[0].mTemp = -1; + mSrc[1].mTemp = -1; + mSrc[2].mTemp = -1; changed = true; } - else if (mTTemp != -1) + else if (mDst.mTemp != -1) { - if (!requiredTemps[mTTemp] && mTTemp >= numStaticTemps) + if (!requiredTemps[mDst.mTemp] && mDst.mTemp >= numStaticTemps) { if (!HasSideEffect(mCode)) { mCode = IC_NONE; - mTTemp = -1; - mSTemp[0] = -1; - mSTemp[1] = -1; - mSTemp[2] = -1; + mDst.mTemp = -1; + mSrc[0].mTemp = -1; + mSrc[1].mTemp = -1; + mSrc[2].mTemp = -1; changed = true; } else { - mTTemp = -1; + mDst.mTemp = -1; changed = true; } } else - requiredTemps -= mTTemp; + requiredTemps -= mDst.mTemp; } - if (mSTemp[0] >= 0) mSFinal[0] = !requiredTemps[mSTemp[0]] && mSTemp[0] >= numStaticTemps; - if (mSTemp[1] >= 0) mSFinal[1] = !requiredTemps[mSTemp[1]] && mSTemp[1] >= numStaticTemps; - if (mSTemp[2] >= 0) mSFinal[2] = !requiredTemps[mSTemp[2]] && mSTemp[2] >= numStaticTemps; + if (mSrc[0].mTemp >= 0) mSrc[0].mFinal = !requiredTemps[mSrc[0].mTemp] && mSrc[0].mTemp >= numStaticTemps; + if (mSrc[1].mTemp >= 0) mSrc[1].mFinal = !requiredTemps[mSrc[1].mTemp] && mSrc[1].mTemp >= numStaticTemps; + if (mSrc[2].mTemp >= 0) mSrc[2].mFinal = !requiredTemps[mSrc[2].mTemp] && mSrc[2].mTemp >= numStaticTemps; - if (mSTemp[0] >= 0) requiredTemps += mSTemp[0]; - if (mSTemp[1] >= 0) requiredTemps += mSTemp[1]; - if (mSTemp[2] >= 0) requiredTemps += mSTemp[2]; + if (mSrc[0].mTemp >= 0) requiredTemps += mSrc[0].mTemp; + if (mSrc[1].mTemp >= 0) requiredTemps += mSrc[1].mTemp; + if (mSrc[2].mTemp >= 0) requiredTemps += mSrc[2].mTemp; return changed; } void InterInstruction::BuildCallerSaveTempSet(NumberSet& requiredTemps, NumberSet& callerSaveTemps) { - if (mTTemp >= 0) - requiredTemps -= mTTemp; + if (mDst.mTemp >= 0) + requiredTemps -= mDst.mTemp; if (mCode == IC_CALL || mCode == IC_CALL_NATIVE) callerSaveTemps |= requiredTemps; - if (mSTemp[0] >= 0) requiredTemps += mSTemp[0]; - if (mSTemp[1] >= 0) requiredTemps += mSTemp[1]; - if (mSTemp[2] >= 0) requiredTemps += mSTemp[2]; + if (mSrc[0].mTemp >= 0) requiredTemps += mSrc[0].mTemp; + if (mSrc[1].mTemp >= 0) requiredTemps += mSrc[1].mTemp; + if (mSrc[2].mTemp >= 0) requiredTemps += mSrc[2].mTemp; } bool InterInstruction::RemoveUnusedStoreInstructions(const GrowingVariableArray& localVars, NumberSet& requiredTemps) @@ -1324,7 +1306,7 @@ bool InterInstruction::RemoveUnusedStoreInstructions(const GrowingVariableArray& ; else if (requiredTemps[mVarIndex]) { - if (mSIntConst[1] == 0 && mOperandSize == localVars[mVarIndex]->mSize) + if (mSrc[1].mIntConst == 0 && mOperandSize == localVars[mVarIndex]->mSize) requiredTemps -= mVarIndex; } else @@ -1352,7 +1334,7 @@ static void DestroySourceValues(int temp, GrowingInstructionPtrArray& tvalue, Fa ins = tvalue[j]; - if (ins->mSTemp[0] == temp || ins->mSTemp[1] == temp || ins->mSTemp[2] == temp) + if (ins->mSrc[0].mTemp == temp || ins->mSrc[1].mTemp == temp || ins->mSrc[2].mTemp == temp) { tvalue[j] = NULL; tvalid -= j; @@ -1365,57 +1347,57 @@ static void DestroySourceValues(int temp, GrowingInstructionPtrArray& tvalue, Fa void InterInstruction::PerformValueForwarding(GrowingInstructionPtrArray& tvalue, FastNumberSet& tvalid) { - DestroySourceValues(mTTemp, tvalue, tvalid); + DestroySourceValues(mDst.mTemp, tvalue, tvalid); if (mCode == IC_LOAD_TEMPORARY) { - if (tvalue[mSTemp[0]]) + if (tvalue[mSrc[0].mTemp]) { - tvalue[mTTemp] = tvalue[mSTemp[0]]; - tvalid += mTTemp; + tvalue[mDst.mTemp] = tvalue[mSrc[0].mTemp]; + tvalid += mDst.mTemp; } } else { - if (mTTemp >= 0) + if (mDst.mTemp >= 0) { - tvalue[mTTemp] = this; - tvalid += mTTemp; + tvalue[mDst.mTemp] = this; + tvalid += mDst.mTemp; } } } void InterInstruction::LocalRenameRegister(GrowingIntArray& renameTable, int& num, int fixed) { - if (mSTemp[0] >= 0) mSTemp[0] = renameTable[mSTemp[0]]; - if (mSTemp[1] >= 0) mSTemp[1] = renameTable[mSTemp[1]]; - if (mSTemp[2] >= 0) mSTemp[2] = renameTable[mSTemp[2]]; + if (mSrc[0].mTemp >= 0) mSrc[0].mTemp = renameTable[mSrc[0].mTemp]; + if (mSrc[1].mTemp >= 0) mSrc[1].mTemp = renameTable[mSrc[1].mTemp]; + if (mSrc[2].mTemp >= 0) mSrc[2].mTemp = renameTable[mSrc[2].mTemp]; - if (mTTemp >= fixed) + if (mDst.mTemp >= fixed) { - renameTable[mTTemp] = num; - mTTemp = num++; + renameTable[mDst.mTemp] = num; + mDst.mTemp = num++; } #if 0 - if (mCode == IC_LOAD_TEMPORARY && mSTemp[0] < 0) + if (mCode == IC_LOAD_TEMPORARY && mSrc[0].mTemp < 0) mCode = IC_CONSTANT; #endif } void InterInstruction::GlobalRenameRegister(const GrowingIntArray& renameTable, GrowingTypeArray& temporaries) { - if (mSTemp[0] >= 0) mSTemp[0] = renameTable[mSTemp[0]]; - if (mSTemp[1] >= 0) mSTemp[1] = renameTable[mSTemp[1]]; - if (mSTemp[2] >= 0) mSTemp[2] = renameTable[mSTemp[2]]; + if (mSrc[0].mTemp >= 0) mSrc[0].mTemp = renameTable[mSrc[0].mTemp]; + if (mSrc[1].mTemp >= 0) mSrc[1].mTemp = renameTable[mSrc[1].mTemp]; + if (mSrc[2].mTemp >= 0) mSrc[2].mTemp = renameTable[mSrc[2].mTemp]; - if (mTTemp >= 0) + if (mDst.mTemp >= 0) { - mTTemp = renameTable[mTTemp]; - if (InterTypeSize[mTType] > InterTypeSize[temporaries[mTTemp]]) - temporaries[mTTemp] = mTType; + mDst.mTemp = renameTable[mDst.mTemp]; + if (InterTypeSize[mDst.mType] > InterTypeSize[temporaries[mDst.mTemp]]) + temporaries[mDst.mTemp] = mDst.mType; } #if 0 - if (mCode == IC_LOAD_TEMPORARY && mSTemp[0] < 0) + if (mCode == IC_LOAD_TEMPORARY && mSrc[0].mTemp < 0) mCode = IC_CONSTANT; #endif } @@ -1441,49 +1423,49 @@ static void UpdateCollisionSet(NumberSet& liveTemps, NumberSet* collisionSets, i void InterInstruction::BuildCollisionTable(NumberSet& liveTemps, NumberSet* collisionSets) { - if (mTTemp >= 0) + if (mDst.mTemp >= 0) { // if (!liveTemps[ttemp]) __asm int 3 - liveTemps -= mTTemp; + liveTemps -= mDst.mTemp; } - UpdateCollisionSet(liveTemps, collisionSets, mSTemp[0]); - UpdateCollisionSet(liveTemps, collisionSets, mSTemp[1]); - UpdateCollisionSet(liveTemps, collisionSets, mSTemp[2]); + UpdateCollisionSet(liveTemps, collisionSets, mSrc[0].mTemp); + UpdateCollisionSet(liveTemps, collisionSets, mSrc[1].mTemp); + UpdateCollisionSet(liveTemps, collisionSets, mSrc[2].mTemp); } void InterInstruction::ReduceTemporaries(const GrowingIntArray& renameTable, GrowingTypeArray& temporaries) { - if (mSTemp[0] >= 0) mSTemp[0] = renameTable[mSTemp[0]]; - if (mSTemp[1] >= 0) mSTemp[1] = renameTable[mSTemp[1]]; - if (mSTemp[2] >= 0) mSTemp[2] = renameTable[mSTemp[2]]; + if (mSrc[0].mTemp >= 0) mSrc[0].mTemp = renameTable[mSrc[0].mTemp]; + if (mSrc[1].mTemp >= 0) mSrc[1].mTemp = renameTable[mSrc[1].mTemp]; + if (mSrc[2].mTemp >= 0) mSrc[2].mTemp = renameTable[mSrc[2].mTemp]; - if (mTTemp >= 0) + if (mDst.mTemp >= 0) { - mTTemp = renameTable[mTTemp]; - temporaries[mTTemp] = mTType; + mDst.mTemp = renameTable[mDst.mTemp]; + temporaries[mDst.mTemp] = mDst.mType; } } void InterInstruction::CollectActiveTemporaries(FastNumberSet& set) { - if (mTTemp >= 0) set += mTTemp; - if (mSTemp[0] >= 0) set += mSTemp[0]; - if (mSTemp[1] >= 0) set += mSTemp[1]; - if (mSTemp[2] >= 0) set += mSTemp[2]; + if (mDst.mTemp >= 0) set += mDst.mTemp; + if (mSrc[0].mTemp >= 0) set += mSrc[0].mTemp; + if (mSrc[1].mTemp >= 0) set += mSrc[1].mTemp; + if (mSrc[2].mTemp >= 0) set += mSrc[2].mTemp; } void InterInstruction::ShrinkActiveTemporaries(FastNumberSet& set, GrowingTypeArray& temporaries) { - if (mTTemp >= 0) + if (mDst.mTemp >= 0) { - mTTemp = set.Index(mTTemp); - temporaries[mTTemp] = mTType; + mDst.mTemp = set.Index(mDst.mTemp); + temporaries[mDst.mTemp] = mDst.mType; } - if (mSTemp[0] >= 0) mSTemp[0] = set.Index(mSTemp[0]); - if (mSTemp[1] >= 0) mSTemp[1] = set.Index(mSTemp[1]); - if (mSTemp[2] >= 0) mSTemp[2] = set.Index(mSTemp[2]); + if (mSrc[0].mTemp >= 0) mSrc[0].mTemp = set.Index(mSrc[0].mTemp); + if (mSrc[1].mTemp >= 0) mSrc[1].mTemp = set.Index(mSrc[1].mTemp); + if (mSrc[2].mTemp >= 0) mSrc[2].mTemp = set.Index(mSrc[2].mTemp); } void InterInstruction::CollectSimpleLocals(FastNumberSet& complexLocals, FastNumberSet& simpleLocals, GrowingTypeArray& localTypes, FastNumberSet& complexParams, FastNumberSet& simpleParams, GrowingTypeArray& paramTypes) @@ -1491,21 +1473,21 @@ void InterInstruction::CollectSimpleLocals(FastNumberSet& complexLocals, FastNum switch (mCode) { case IC_LOAD: - if (mMemory == IM_LOCAL && mSTemp[0] < 0) + if (mMemory == IM_LOCAL && mSrc[0].mTemp < 0) { - if (localTypes[mVarIndex] == IT_NONE || localTypes[mVarIndex] == mTType) + if (localTypes[mVarIndex] == IT_NONE || localTypes[mVarIndex] == mDst.mType) { - localTypes[mVarIndex] = mTType; + localTypes[mVarIndex] = mDst.mType; simpleLocals += mVarIndex; } else complexLocals += mVarIndex; } - else if (mMemory == IM_PARAM && mSTemp[0] < 0) + else if (mMemory == IM_PARAM && mSrc[0].mTemp < 0) { - if (paramTypes[mVarIndex] == IT_NONE || paramTypes[mVarIndex] == mTType) + if (paramTypes[mVarIndex] == IT_NONE || paramTypes[mVarIndex] == mDst.mType) { - paramTypes[mVarIndex] = mTType; + paramTypes[mVarIndex] = mDst.mType; simpleParams += mVarIndex; } else @@ -1513,21 +1495,21 @@ void InterInstruction::CollectSimpleLocals(FastNumberSet& complexLocals, FastNum } break; case IC_STORE: - if (mMemory == IM_LOCAL && mSTemp[1] < 0) + if (mMemory == IM_LOCAL && mSrc[1].mTemp < 0) { - if (localTypes[mVarIndex] == IT_NONE || localTypes[mVarIndex] == mSType[0]) + if (localTypes[mVarIndex] == IT_NONE || localTypes[mVarIndex] == mSrc[0].mType) { - localTypes[mVarIndex] = mSType[0]; + localTypes[mVarIndex] = mSrc[0].mType; simpleLocals += mVarIndex; } else complexLocals += mVarIndex; } - else if (mMemory == IM_PARAM && mSTemp[1] < 0) + else if (mMemory == IM_PARAM && mSrc[1].mTemp < 0) { - if (paramTypes[mVarIndex] == IT_NONE || paramTypes[mVarIndex] == mSType[0]) + if (paramTypes[mVarIndex] == IT_NONE || paramTypes[mVarIndex] == mSrc[0].mType) { - paramTypes[mVarIndex] = mSType[0]; + paramTypes[mVarIndex] = mSrc[0].mType; simpleParams += mVarIndex; } else @@ -1535,15 +1517,15 @@ void InterInstruction::CollectSimpleLocals(FastNumberSet& complexLocals, FastNum } break; case IC_LEA: - if (mMemory == IM_LOCAL && mSTemp[1] < 0) + if (mMemory == IM_LOCAL && mSrc[1].mTemp < 0) complexLocals += mVarIndex; - else if (mMemory == IM_PARAM && mSTemp[1] < 0) + else if (mMemory == IM_PARAM && mSrc[1].mTemp < 0) complexParams += mVarIndex; break; case IC_CONSTANT: - if (mTType == IT_POINTER && mMemory == IM_LOCAL) + if (mDst.mType == IT_POINTER && mMemory == IM_LOCAL) complexLocals += mVarIndex; - else if (mTType == IT_POINTER && mMemory == IM_PARAM) + else if (mDst.mType == IT_POINTER && mMemory == IM_PARAM) complexParams += mVarIndex; break; } @@ -1554,33 +1536,33 @@ void InterInstruction::SimpleLocalToTemp(int vindex, int temp) switch (mCode) { case IC_LOAD: - if (mMemory == IM_LOCAL && mSTemp[0] < 0 && vindex == this->mVarIndex) + if (mMemory == IM_LOCAL && mSrc[0].mTemp < 0 && vindex == this->mVarIndex) { mCode = IC_LOAD_TEMPORARY; - mSTemp[0] = temp; - mSType[0] = mTType; + mSrc[0].mTemp = temp; + mSrc[0].mType = mDst.mType; - assert(mSTemp[0] >= 0); + assert(mSrc[0].mTemp >= 0); } break; case IC_STORE: - if (mMemory == IM_LOCAL && mSTemp[1] < 0 && vindex == this->mVarIndex) + if (mMemory == IM_LOCAL && mSrc[1].mTemp < 0 && vindex == this->mVarIndex) { - if (mSTemp[0] < 0) + if (mSrc[0].mTemp < 0) { mCode = IC_CONSTANT; - mIntValue = mSIntConst[0]; - mFloatValue = mSFloatConst[0]; + mIntValue = mSrc[0].mIntConst; + mFloatValue = mSrc[0].mFloatConst; } else { mCode = IC_LOAD_TEMPORARY; - assert(mSTemp[0] >= 0); + assert(mSrc[0].mTemp >= 0); } - mTTemp = temp; - mTType = mSType[0]; + mDst.mTemp = temp; + mDst.mType = mSrc[0].mType; } break; } @@ -1666,24 +1648,24 @@ void InterInstruction::Disassemble(FILE* file) static char typechars[] = "NBCILFP"; fprintf(file, "\t"); - if (mTTemp >= 0) fprintf(file, "R%d(%c)", mTTemp, typechars[mTType]); + if (mDst.mTemp >= 0) fprintf(file, "R%d(%c)", mDst.mTemp, typechars[mDst.mType]); fprintf(file, "\t<-\t"); - if (mSTemp[2] >= 0) fprintf(file, "R%d(%c%c), ", mSTemp[2], typechars[mSType[2]], mSFinal[2] ? 'F' : '-'); - if (mSTemp[1] >= 0) - fprintf(file, "R%d(%c%c), ", mSTemp[1], typechars[mSType[1]], mSFinal[1] ? 'F' : '-'); + if (mSrc[2].mTemp >= 0) fprintf(file, "R%d(%c%c), ", mSrc[2].mTemp, typechars[mSrc[2].mType], mSrc[2].mFinal ? 'F' : '-'); + if (mSrc[1].mTemp >= 0) + fprintf(file, "R%d(%c%c), ", mSrc[1].mTemp, typechars[mSrc[1].mType], mSrc[1].mFinal ? 'F' : '-'); else if (this->mCode == IC_STORE) - fprintf(file, "V%d+%d, ", mVarIndex, int(mSIntConst[1])); - if (mSTemp[0] >= 0) - fprintf(file, "R%d(%c%c)", mSTemp[0], typechars[mSType[0]], mSFinal[0] ? 'F' : '-'); + fprintf(file, "V%d+%d, ", mVarIndex, int(mSrc[1].mIntConst)); + if (mSrc[0].mTemp >= 0) + fprintf(file, "R%d(%c%c)", mSrc[0].mTemp, typechars[mSrc[0].mType], mSrc[0].mFinal ? 'F' : '-'); else if (this->mCode == IC_LOAD) - fprintf(file, "V%d+%d", mVarIndex, int(mSIntConst[0])); + fprintf(file, "V%d+%d", mVarIndex, int(mSrc[0].mIntConst)); if (this->mCode == IC_CONSTANT) { - if (mTType == IT_POINTER) + if (mDst.mType == IT_POINTER) { fprintf(file, "C%c%d(%d:%d)", memchars[mMemory], mOperandSize, mVarIndex, int(mIntValue)); } - else if (mTType == IT_FLOAT) + else if (mDst.mType == IT_FLOAT) fprintf(file, "C%f", mFloatValue); else { @@ -1816,34 +1798,34 @@ static bool IsSimpleAddressMultiply(int val) static void OptimizeAddress(InterInstruction * ins, const GrowingInstructionPtrArray& tvalue, int offset) { - ins->mSIntConst[offset] = 0; + ins->mSrc[offset].mIntConst = 0; - if (ins->mSTemp[offset] >= 0 && tvalue[ins->mSTemp[offset]]) + if (ins->mSrc[offset].mTemp >= 0 && tvalue[ins->mSrc[offset].mTemp]) { - InterInstruction* ains = tvalue[ins->mSTemp[offset]]; + InterInstruction* ains = tvalue[ins->mSrc[offset].mTemp]; if (ains->mCode == IC_CONSTANT) { - ins->mSIntConst[offset] = ains->mIntValue; + ins->mSrc[offset].mIntConst = ains->mIntValue; ins->mLinkerObject = ains->mLinkerObject; ins->mVarIndex = ains->mVarIndex; ins->mMemory = ains->mMemory; - ins->mSTemp[offset] = -1; + ins->mSrc[offset].mTemp = -1; } - else if (ains->mCode == IC_LEA && ains->mSTemp[0] < 0 && ains->mSTemp[1] >= 0 && tvalue[ains->mSTemp[1]]) + else if (ains->mCode == IC_LEA && ains->mSrc[0].mTemp < 0 && ains->mSrc[1].mTemp >= 0 && tvalue[ains->mSrc[1].mTemp]) { - ins->mSIntConst[offset] = ains->mSIntConst[0]; - ins->mSTemp[offset] = ains->mSTemp[1]; + ins->mSrc[offset].mIntConst = ains->mSrc[0].mIntConst; + ins->mSrc[offset].mTemp = ains->mSrc[1].mTemp; } - else if (ains->mCode == IC_BINARY_OPERATOR && ains->mOperator == IA_ADD && ains->mSTemp[0] < 0 && ains->mSTemp[1] >= 0 && tvalue[ains->mSTemp[1]] && ains->mSIntConst[0] >= 0) + else if (ains->mCode == IC_BINARY_OPERATOR && ains->mOperator == IA_ADD && ains->mSrc[0].mTemp < 0 && ains->mSrc[1].mTemp >= 0 && tvalue[ains->mSrc[1].mTemp] && ains->mSrc[0].mIntConst >= 0) { - ins->mSIntConst[offset] = ains->mSIntConst[0]; - ins->mSTemp[offset] = ains->mSTemp[1]; + ins->mSrc[offset].mIntConst = ains->mSrc[0].mIntConst; + ins->mSrc[offset].mTemp = ains->mSrc[1].mTemp; } - else if (ains->mCode == IC_BINARY_OPERATOR && ains->mOperator == IA_ADD && ains->mSTemp[1] < 0 && ains->mSTemp[0] >= 0 && tvalue[ains->mSTemp[0]] && ains->mSIntConst[1] >= 0) + else if (ains->mCode == IC_BINARY_OPERATOR && ains->mOperator == IA_ADD && ains->mSrc[1].mTemp < 0 && ains->mSrc[0].mTemp >= 0 && tvalue[ains->mSrc[0].mTemp] && ains->mSrc[1].mIntConst >= 0) { - ins->mSIntConst[offset] = ains->mSIntConst[1]; - ins->mSTemp[offset] = ains->mSTemp[0]; + ins->mSrc[offset].mIntConst = ains->mSrc[1].mIntConst; + ins->mSrc[offset].mTemp = ains->mSrc[0].mTemp; } } } @@ -1856,40 +1838,40 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI case IC_CALL: case IC_CALL_NATIVE: case IC_ASSEMBLER: - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - ins->mMemory = tvalue[ins->mSTemp[0]]->mMemory; - ins->mLinkerObject = tvalue[ins->mSTemp[0]]->mLinkerObject; - ins->mVarIndex = tvalue[ins->mSTemp[0]]->mVarIndex; - ins->mOperandSize = tvalue[ins->mSTemp[0]]->mOperandSize; - ins->mSIntConst[0] = tvalue[ins->mSTemp[0]]->mIntValue; - ins->mSTemp[0] = -1; + ins->mMemory = tvalue[ins->mSrc[0].mTemp]->mMemory; + ins->mLinkerObject = tvalue[ins->mSrc[0].mTemp]->mLinkerObject; + ins->mVarIndex = tvalue[ins->mSrc[0].mTemp]->mVarIndex; + ins->mOperandSize = tvalue[ins->mSrc[0].mTemp]->mOperandSize; + ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mSrc[0].mTemp = -1; } break; case IC_LOAD_TEMPORARY: - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - switch (ins->mSType[0]) + switch (ins->mSrc[0].mType) { case IT_FLOAT: ins->mCode = IC_CONSTANT; - ins->mFloatValue = tvalue[ins->mSTemp[0]]->mFloatValue; - ins->mSTemp[0] = -1; + ins->mFloatValue = tvalue[ins->mSrc[0].mTemp]->mFloatValue; + ins->mSrc[0].mTemp = -1; break; case IT_POINTER: ins->mCode = IC_CONSTANT; - ins->mMemory = tvalue[ins->mSTemp[0]]->mMemory; - ins->mLinkerObject = tvalue[ins->mSTemp[0]]->mLinkerObject; - ins->mVarIndex = tvalue[ins->mSTemp[0]]->mVarIndex; - ins->mIntValue = tvalue[ins->mSTemp[0]]->mIntValue; - ins->mOperandSize = tvalue[ins->mSTemp[0]]->mOperandSize; - ins->mSTemp[0] = -1; + ins->mMemory = tvalue[ins->mSrc[0].mTemp]->mMemory; + ins->mLinkerObject = tvalue[ins->mSrc[0].mTemp]->mLinkerObject; + ins->mVarIndex = tvalue[ins->mSrc[0].mTemp]->mVarIndex; + ins->mIntValue = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mOperandSize = tvalue[ins->mSrc[0].mTemp]->mOperandSize; + ins->mSrc[0].mTemp = -1; break; default: ins->mCode = IC_CONSTANT; - ins->mIntValue = tvalue[ins->mSTemp[0]]->mIntValue; - ins->mSTemp[0] = -1; + ins->mIntValue = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mSrc[0].mTemp = -1; break; } } @@ -1899,177 +1881,177 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI OptimizeAddress(ins, tvalue, 0); break; case IC_STORE: - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - switch (ins->mSType[0]) + switch (ins->mSrc[0].mType) { case IT_FLOAT: - ins->mSFloatConst[0] = tvalue[ins->mSTemp[0]]->mFloatValue; - ins->mSTemp[0] = -1; + ins->mSrc[0].mFloatConst = tvalue[ins->mSrc[0].mTemp]->mFloatValue; + ins->mSrc[0].mTemp = -1; break; case IT_POINTER: break; default: - ins->mSIntConst[0] = tvalue[ins->mSTemp[0]]->mIntValue; - ins->mSTemp[0] = -1; + ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mSrc[0].mTemp = -1; break; } } OptimizeAddress(ins, tvalue, 1); break; case IC_LEA: - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - if (ins->mSTemp[1] >= 0 && tvalue[ins->mSTemp[1]] && tvalue[ins->mSTemp[1]]->mCode == IC_CONSTANT) + if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT) { ins->mCode = IC_CONSTANT; - ins->mTType = IT_POINTER; - ins->mMemory = tvalue[ins->mSTemp[1]]->mMemory; - ins->mLinkerObject = tvalue[ins->mSTemp[1]]->mLinkerObject; - ins->mVarIndex = tvalue[ins->mSTemp[1]]->mVarIndex; - ins->mIntValue = tvalue[ins->mSTemp[1]]->mIntValue + tvalue[ins->mSTemp[0]]->mIntValue; - ins->mOperandSize = tvalue[ins->mSTemp[1]]->mOperandSize; - ins->mSTemp[0] = -1; - ins->mSTemp[1] = -1; + ins->mDst.mType = IT_POINTER; + ins->mMemory = tvalue[ins->mSrc[1].mTemp]->mMemory; + ins->mLinkerObject = tvalue[ins->mSrc[1].mTemp]->mLinkerObject; + ins->mVarIndex = tvalue[ins->mSrc[1].mTemp]->mVarIndex; + ins->mIntValue = tvalue[ins->mSrc[1].mTemp]->mIntValue + tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mOperandSize = tvalue[ins->mSrc[1].mTemp]->mOperandSize; + ins->mSrc[0].mTemp = -1; + ins->mSrc[1].mTemp = -1; } - else if (tvalue[ins->mSTemp[0]]->mIntValue == 0) + else if (tvalue[ins->mSrc[0].mTemp]->mIntValue == 0) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSType[0] = ins->mSType[1]; - ins->mSTemp[0] = ins->mSTemp[1]; - ins->mSTemp[1] = -1; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mType = ins->mSrc[1].mType; + ins->mSrc[0].mTemp = ins->mSrc[1].mTemp; + ins->mSrc[1].mTemp = -1; + assert(ins->mSrc[0].mTemp >= 0); } else { - ins->mSIntConst[0] = tvalue[ins->mSTemp[0]]->mIntValue; - ins->mSTemp[0] = -1; + ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mSrc[0].mTemp = -1; } } - else if (ins->mSTemp[1] >= 0 && tvalue[ins->mSTemp[1]] && tvalue[ins->mSTemp[1]]->mCode == IC_CONSTANT && tvalue[ins->mSTemp[1]]->mMemory == IM_GLOBAL) + else if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT && tvalue[ins->mSrc[1].mTemp]->mMemory == IM_GLOBAL) { - ins->mMemory = tvalue[ins->mSTemp[1]]->mMemory; - ins->mLinkerObject = tvalue[ins->mSTemp[1]]->mLinkerObject; - ins->mVarIndex = tvalue[ins->mSTemp[1]]->mVarIndex; - ins->mIntValue = tvalue[ins->mSTemp[1]]->mIntValue + tvalue[ins->mSTemp[0]]->mIntValue; - ins->mOperandSize = tvalue[ins->mSTemp[1]]->mOperandSize; - ins->mSTemp[1] = -1; + ins->mMemory = tvalue[ins->mSrc[1].mTemp]->mMemory; + ins->mLinkerObject = tvalue[ins->mSrc[1].mTemp]->mLinkerObject; + ins->mVarIndex = tvalue[ins->mSrc[1].mTemp]->mVarIndex; + ins->mIntValue = tvalue[ins->mSrc[1].mTemp]->mIntValue + tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mOperandSize = tvalue[ins->mSrc[1].mTemp]->mOperandSize; + ins->mSrc[1].mTemp = -1; } break; case IC_TYPECAST: - if (ins->mSType[0] == ins->mTType) + if (ins->mSrc[0].mType == ins->mDst.mType) { ins->mCode = IC_LOAD_TEMPORARY; - assert(ins->mSTemp[0] >= 0); + assert(ins->mSrc[0].mTemp >= 0); } - else if (TypeInteger(ins->mSType[0]) && ins->mTType == IT_POINTER) + else if (TypeInteger(ins->mSrc[0].mType) && ins->mDst.mType == IT_POINTER) { - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { ins->mCode = IC_CONSTANT; - ins->mTType = IT_POINTER; + ins->mDst.mType = IT_POINTER; ins->mMemory = IM_ABSOLUTE; ins->mVarIndex = 0; - ins->mIntValue = tvalue[ins->mSTemp[0]]->mIntValue; - ins->mSTemp[0] = -1; + ins->mIntValue = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mSrc[0].mTemp = -1; } } break; case IC_RETURN_VALUE: - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - switch (ins->mSType[0]) + switch (ins->mSrc[0].mType) { case IT_FLOAT: break; case IT_POINTER: break; default: - ins->mSIntConst[0] = tvalue[ins->mSTemp[0]]->mIntValue; - ins->mSTemp[0] = -1; + ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mSrc[0].mTemp = -1; break; } } break; case IC_BINARY_OPERATOR: - switch (ins->mSType[0]) + switch (ins->mSrc[0].mType) { case IT_FLOAT: - if (ins->mSTemp[1] >= 0 && tvalue[ins->mSTemp[1]] && tvalue[ins->mSTemp[1]]->mCode == IC_CONSTANT) + if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT) { - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { ins->mCode = IC_CONSTANT; - ins->mFloatValue = ConstantFolding(ins->mOperator, tvalue[ins->mSTemp[1]]->mFloatValue, tvalue[ins->mSTemp[0]]->mFloatValue); - ins->mSTemp[0] = -1; - ins->mSTemp[1] = -1; + ins->mFloatValue = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mFloatValue, tvalue[ins->mSrc[0].mTemp]->mFloatValue); + ins->mSrc[0].mTemp = -1; + ins->mSrc[1].mTemp = -1; } else { - ins->mSFloatConst[1] = tvalue[ins->mSTemp[1]]->mFloatValue; - ins->mSTemp[1] = -1; + ins->mSrc[1].mFloatConst = tvalue[ins->mSrc[1].mTemp]->mFloatValue; + ins->mSrc[1].mTemp = -1; - if (ins->mOperator == IA_ADD && ins->mSFloatConst[1] == 0) + if (ins->mOperator == IA_ADD && ins->mSrc[1].mFloatConst == 0) { ins->mCode = IC_LOAD_TEMPORARY; - assert(ins->mSTemp[0] >= 0); + assert(ins->mSrc[0].mTemp >= 0); } else if (ins->mOperator == IA_MUL) { - if (ins->mSFloatConst[1] == 1.0) + if (ins->mSrc[1].mFloatConst == 1.0) { ins->mCode = IC_LOAD_TEMPORARY; - assert(ins->mSTemp[0] >= 0); + assert(ins->mSrc[0].mTemp >= 0); } - else if (ins->mSFloatConst[1] == 0.0) + else if (ins->mSrc[1].mFloatConst == 0.0) { ins->mCode = IC_CONSTANT; ins->mFloatValue = 0.0; - ins->mSTemp[0] = -1; - ins->mSTemp[1] = -1; + ins->mSrc[0].mTemp = -1; + ins->mSrc[1].mTemp = -1; } - else if (ins->mSFloatConst[1] == 2.0) + else if (ins->mSrc[1].mFloatConst == 2.0) { ins->mOperator = IA_ADD; - ins->mSTemp[1] = ins->mSTemp[0]; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[1].mTemp = ins->mSrc[0].mTemp; + assert(ins->mSrc[0].mTemp >= 0); } } } } - else if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + else if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - ins->mSFloatConst[0] = tvalue[ins->mSTemp[0]]->mFloatValue; - ins->mSTemp[0] = -1; + ins->mSrc[0].mFloatConst = tvalue[ins->mSrc[0].mTemp]->mFloatValue; + ins->mSrc[0].mTemp = -1; - if (ins->mOperator == IA_ADD && ins->mSFloatConst[0] == 0) + if (ins->mOperator == IA_ADD && ins->mSrc[0].mFloatConst == 0) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = ins->mSTemp[1]; - ins->mSTemp[1] = -1; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = ins->mSrc[1].mTemp; + ins->mSrc[1].mTemp = -1; + assert(ins->mSrc[0].mTemp >= 0); } else if (ins->mOperator == IA_MUL) { - if (ins->mSFloatConst[0] == 1.0) + if (ins->mSrc[0].mFloatConst == 1.0) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = ins->mSTemp[1]; - ins->mSTemp[1] = -1; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = ins->mSrc[1].mTemp; + ins->mSrc[1].mTemp = -1; + assert(ins->mSrc[0].mTemp >= 0); } - else if (ins->mSFloatConst[0] == 0.0) + else if (ins->mSrc[0].mFloatConst == 0.0) { ins->mCode = IC_CONSTANT; ins->mFloatValue = 0.0; - ins->mSTemp[0] = -1; - ins->mSTemp[1] = -1; + ins->mSrc[0].mTemp = -1; + ins->mSrc[1].mTemp = -1; } - else if (ins->mSFloatConst[0] == 2.0) + else if (ins->mSrc[0].mFloatConst == 2.0) { ins->mOperator = IA_ADD; - ins->mSTemp[0] = ins->mSTemp[1]; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = ins->mSrc[1].mTemp; + assert(ins->mSrc[0].mTemp >= 0); } } } @@ -2077,138 +2059,138 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI case IT_POINTER: break; default: - if (ins->mSTemp[1] >= 0 && tvalue[ins->mSTemp[1]] && tvalue[ins->mSTemp[1]]->mCode == IC_CONSTANT) + if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT) { - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { ins->mCode = IC_CONSTANT; - ins->mIntValue = ConstantFolding(ins->mOperator, tvalue[ins->mSTemp[1]]->mIntValue, tvalue[ins->mSTemp[0]]->mIntValue); - ins->mSTemp[0] = -1; - ins->mSTemp[1] = -1; + ins->mIntValue = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mIntValue, tvalue[ins->mSrc[0].mTemp]->mIntValue); + ins->mSrc[0].mTemp = -1; + ins->mSrc[1].mTemp = -1; } else { - ins->mSIntConst[1] = tvalue[ins->mSTemp[1]]->mIntValue; - ins->mSTemp[1] = -1; + ins->mSrc[1].mIntConst = tvalue[ins->mSrc[1].mTemp]->mIntValue; + ins->mSrc[1].mTemp = -1; #if 1 - if (ins->mOperator == IA_ADD && ins->mSIntConst[1] == 0) + if (ins->mOperator == IA_ADD && ins->mSrc[1].mIntConst == 0) { ins->mCode = IC_LOAD_TEMPORARY; - assert(ins->mSTemp[0] >= 0); + assert(ins->mSrc[0].mTemp >= 0); } else if (ins->mOperator == IA_MUL) { - if (ins->mSIntConst[1] == 1) + if (ins->mSrc[1].mIntConst == 1) { ins->mCode = IC_LOAD_TEMPORARY; - assert(ins->mSTemp[0] >= 0); + assert(ins->mSrc[0].mTemp >= 0); } - else if (ins->mSIntConst[1] == 2) + else if (ins->mSrc[1].mIntConst == 2) { ins->mOperator = IA_SHL; - ins->mSTemp[1] = ins->mSTemp[0]; - ins->mSType[1] = ins->mSType[0]; - ins->mSTemp[0] = -1; - ins->mSIntConst[0] = 1; + ins->mSrc[1].mTemp = ins->mSrc[0].mTemp; + ins->mSrc[1].mType = ins->mSrc[0].mType; + ins->mSrc[0].mTemp = -1; + ins->mSrc[0].mIntConst = 1; } - else if (ins->mSIntConst[1] == 4) + else if (ins->mSrc[1].mIntConst == 4) { ins->mOperator = IA_SHL; - ins->mSTemp[1] = ins->mSTemp[0]; - ins->mSType[1] = ins->mSType[0]; - ins->mSTemp[0] = -1; - ins->mSIntConst[0] = 2; + ins->mSrc[1].mTemp = ins->mSrc[0].mTemp; + ins->mSrc[1].mType = ins->mSrc[0].mType; + ins->mSrc[0].mTemp = -1; + ins->mSrc[0].mIntConst = 2; } - else if (ins->mSIntConst[1] == 8) + else if (ins->mSrc[1].mIntConst == 8) { ins->mOperator = IA_SHL; - ins->mSTemp[1] = ins->mSTemp[0]; - ins->mSType[1] = ins->mSType[0]; - ins->mSTemp[0] = -1; - ins->mSIntConst[0] = 3; + ins->mSrc[1].mTemp = ins->mSrc[0].mTemp; + ins->mSrc[1].mType = ins->mSrc[0].mType; + ins->mSrc[0].mTemp = -1; + ins->mSrc[0].mIntConst = 3; } } #endif } } - else if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + else if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - ins->mSIntConst[0] = tvalue[ins->mSTemp[0]]->mIntValue; - ins->mSTemp[0] = -1; + ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mSrc[0].mTemp = -1; - if (ins->mOperator == IA_ADD && ins->mSIntConst[0] == 0) + if (ins->mOperator == IA_ADD && ins->mSrc[0].mIntConst == 0) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = ins->mSTemp[1]; - ins->mSTemp[1] = -1; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = ins->mSrc[1].mTemp; + ins->mSrc[1].mTemp = -1; + assert(ins->mSrc[0].mTemp >= 0); } else if (ins->mOperator == IA_MUL) { - if (ins->mSIntConst[0] == 1) + if (ins->mSrc[0].mIntConst == 1) { ins->mCode = IC_LOAD_TEMPORARY; - ins->mSTemp[0] = ins->mSTemp[1]; - ins->mSTemp[1] = -1; - assert(ins->mSTemp[0] >= 0); + ins->mSrc[0].mTemp = ins->mSrc[1].mTemp; + ins->mSrc[1].mTemp = -1; + assert(ins->mSrc[0].mTemp >= 0); } - else if (ins->mSIntConst[0] == 2) + else if (ins->mSrc[0].mIntConst == 2) { ins->mOperator = IA_SHL; - ins->mSIntConst[0] = 1; + ins->mSrc[0].mIntConst = 1; } - else if (ins->mSIntConst[0] == 4) + else if (ins->mSrc[0].mIntConst == 4) { ins->mOperator = IA_SHL; - ins->mSIntConst[0] = 2; + ins->mSrc[0].mIntConst = 2; } - else if (ins->mSIntConst[0] == 8) + else if (ins->mSrc[0].mIntConst == 8) { ins->mOperator = IA_SHL; - ins->mSIntConst[0] = 3; + ins->mSrc[0].mIntConst = 3; } } } - if (ins->mSTemp[1] < 0 && ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_BINARY_OPERATOR) + if (ins->mSrc[1].mTemp < 0 && ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_BINARY_OPERATOR) { - InterInstruction* pins = tvalue[ins->mSTemp[0]]; + InterInstruction* pins = tvalue[ins->mSrc[0].mTemp]; if (ins->mOperator == pins->mOperator && (ins->mOperator == IA_ADD || ins->mOperator == IA_MUL || ins->mOperator == IA_AND || ins->mOperator == IA_OR)) { - if (pins->mSTemp[1] < 0) + if (pins->mSrc[1].mTemp < 0) { - ins->mSIntConst[1] = ConstantFolding(ins->mOperator, ins->mSIntConst[1], pins->mSIntConst[1]); - ins->mSTemp[0] = pins->mSTemp[0]; + ins->mSrc[1].mIntConst = ConstantFolding(ins->mOperator, ins->mSrc[1].mIntConst, pins->mSrc[1].mIntConst); + ins->mSrc[0].mTemp = pins->mSrc[0].mTemp; } - else if (pins->mSTemp[0] < 0) + else if (pins->mSrc[0].mTemp < 0) { - ins->mSIntConst[1] = ConstantFolding(ins->mOperator, ins->mSIntConst[1], pins->mSIntConst[0]); - ins->mSTemp[0] = pins->mSTemp[1]; + ins->mSrc[1].mIntConst = ConstantFolding(ins->mOperator, ins->mSrc[1].mIntConst, pins->mSrc[0].mIntConst); + ins->mSrc[0].mTemp = pins->mSrc[1].mTemp; } } } - else if (ins->mSTemp[0] < 0 && ins->mSTemp[1] >= 0 && tvalue[ins->mSTemp[1]] && tvalue[ins->mSTemp[1]]->mCode == IC_BINARY_OPERATOR) + else if (ins->mSrc[0].mTemp < 0 && ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_BINARY_OPERATOR) { - InterInstruction* pins = tvalue[ins->mSTemp[1]]; + InterInstruction* pins = tvalue[ins->mSrc[1].mTemp]; if (ins->mOperator == pins->mOperator && (ins->mOperator == IA_ADD || ins->mOperator == IA_MUL || ins->mOperator == IA_AND || ins->mOperator == IA_OR)) { - if (pins->mSTemp[1] < 0) + if (pins->mSrc[1].mTemp < 0) { - ins->mSIntConst[0] = ConstantFolding(ins->mOperator, ins->mSIntConst[0], pins->mSIntConst[1]); - ins->mSTemp[1] = pins->mSTemp[0]; + ins->mSrc[0].mIntConst = ConstantFolding(ins->mOperator, ins->mSrc[0].mIntConst, pins->mSrc[1].mIntConst); + ins->mSrc[1].mTemp = pins->mSrc[0].mTemp; } - else if (pins->mSTemp[0] < 0) + else if (pins->mSrc[0].mTemp < 0) { - ins->mSIntConst[0] = ConstantFolding(ins->mOperator, ins->mSIntConst[0], pins->mSIntConst[0]); - ins->mSTemp[1] = pins->mSTemp[1]; + ins->mSrc[0].mIntConst = ConstantFolding(ins->mOperator, ins->mSrc[0].mIntConst, pins->mSrc[0].mIntConst); + ins->mSrc[1].mTemp = pins->mSrc[1].mTemp; } } - else if (ins->mOperator == IA_SHL && (pins->mOperator == IA_SHR || pins->mOperator == IA_SAR) && pins->mSTemp[0] < 0 && ins->mSIntConst[0] == pins->mSIntConst[0]) + else if (ins->mOperator == IA_SHL && (pins->mOperator == IA_SHR || pins->mOperator == IA_SAR) && pins->mSrc[0].mTemp < 0 && ins->mSrc[0].mIntConst == pins->mSrc[0].mIntConst) { ins->mOperator = IA_AND; - ins->mSIntConst[0] = -1LL << ins->mSIntConst[0]; - ins->mSTemp[1] = pins->mSTemp[1]; + ins->mSrc[0].mIntConst = -1LL << ins->mSrc[0].mIntConst; + ins->mSrc[1].mTemp = pins->mSrc[1].mTemp; } } @@ -2216,14 +2198,14 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI } break; case IC_UNARY_OPERATOR: - switch (ins->mSType[0]) + switch (ins->mSrc[0].mType) { case IT_FLOAT: - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { ins->mCode = IC_CONSTANT; - ins->mFloatValue = ConstantFolding(ins->mOperator, tvalue[ins->mSTemp[0]]->mFloatValue); - ins->mSTemp[0] = -1; + ins->mFloatValue = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[0].mTemp]->mFloatValue); + ins->mSrc[0].mTemp = -1; } break; case IT_POINTER: @@ -2233,77 +2215,77 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI } break; case IC_RELATIONAL_OPERATOR: - switch (ins->mSType[1]) + switch (ins->mSrc[1].mType) { case IT_FLOAT: - if (ins->mSTemp[1] >= 0 && tvalue[ins->mSTemp[1]] && tvalue[ins->mSTemp[1]]->mCode == IC_CONSTANT && - ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT && + ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { ins->mCode = IC_CONSTANT; - ins->mIntValue = ConstantRelationalFolding(ins->mOperator, tvalue[ins->mSTemp[1]]->mFloatValue, tvalue[ins->mSTemp[0]]->mFloatValue); - ins->mTType = IT_BOOL; - ins->mSTemp[0] = -1; - ins->mSTemp[1] = -1; + ins->mIntValue = ConstantRelationalFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mFloatValue, tvalue[ins->mSrc[0].mTemp]->mFloatValue); + ins->mDst.mType = IT_BOOL; + ins->mSrc[0].mTemp = -1; + ins->mSrc[1].mTemp = -1; } else { - if (ins->mSTemp[1] >= 0 && tvalue[ins->mSTemp[1]] && tvalue[ins->mSTemp[1]]->mCode == IC_CONSTANT) + if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT) { - ins->mSFloatConst[1] = tvalue[ins->mSTemp[1]]->mFloatValue; - ins->mSTemp[1] = -1; + ins->mSrc[1].mFloatConst = tvalue[ins->mSrc[1].mTemp]->mFloatValue; + ins->mSrc[1].mTemp = -1; } - else if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + else if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - ins->mSFloatConst[0] = tvalue[ins->mSTemp[0]]->mFloatValue; - ins->mSTemp[0] = -1; + ins->mSrc[0].mFloatConst = tvalue[ins->mSrc[0].mTemp]->mFloatValue; + ins->mSrc[0].mTemp = -1; } } break; case IT_POINTER: if (ins->mOperator == IA_CMPEQ || ins->mOperator == IA_CMPNE) { - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - ins->mOperandSize = tvalue[ins->mSTemp[0]]->mOperandSize; - ins->mSTemp[0] = -1; + ins->mOperandSize = tvalue[ins->mSrc[0].mTemp]->mOperandSize; + ins->mSrc[0].mTemp = -1; } - else if (ins->mSTemp[1] >= 0 && tvalue[ins->mSTemp[1]] && tvalue[ins->mSTemp[1]]->mCode == IC_CONSTANT) + else if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT) { - ins->mOperandSize = tvalue[ins->mSTemp[1]]->mOperandSize; - ins->mSTemp[1] = -1; + ins->mOperandSize = tvalue[ins->mSrc[1].mTemp]->mOperandSize; + ins->mSrc[1].mTemp = -1; } } break; default: - if (ins->mSTemp[1] >= 0 && tvalue[ins->mSTemp[1]] && tvalue[ins->mSTemp[1]]->mCode == IC_CONSTANT && - ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT && + ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { ins->mCode = IC_CONSTANT; - ins->mIntValue = ConstantFolding(ins->mOperator, tvalue[ins->mSTemp[1]]->mIntValue, tvalue[ins->mSTemp[0]]->mIntValue); - ins->mSTemp[0] = -1; - ins->mSTemp[1] = -1; + ins->mIntValue = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mIntValue, tvalue[ins->mSrc[0].mTemp]->mIntValue); + ins->mSrc[0].mTemp = -1; + ins->mSrc[1].mTemp = -1; } else { - if (ins->mSTemp[1] >= 0 && tvalue[ins->mSTemp[1]] && tvalue[ins->mSTemp[1]]->mCode == IC_CONSTANT) + if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT) { - ins->mSIntConst[1] = tvalue[ins->mSTemp[1]]->mIntValue; - ins->mSTemp[1] = -1; + ins->mSrc[1].mIntConst = tvalue[ins->mSrc[1].mTemp]->mIntValue; + ins->mSrc[1].mTemp = -1; } - else if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + else if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - ins->mSIntConst[0] = tvalue[ins->mSTemp[0]]->mIntValue; - ins->mSTemp[0] = -1; + ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mSrc[0].mTemp = -1; } } break; } break; case IC_BRANCH: - if (ins->mSTemp[0] >= 0 && tvalue[ins->mSTemp[0]] && tvalue[ins->mSTemp[0]]->mCode == IC_CONSTANT) + if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - ins->mSIntConst[0] = tvalue[ins->mSTemp[0]]->mIntValue; - ins->mSTemp[0] = -1; + ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mSrc[0].mTemp = -1; } break; } @@ -2352,7 +2334,7 @@ void InterCodeBasicBlock::CollectConstTemps(GrowingInstructionPtrArray& ctemps, for (i = 0; i < mInstructions.Size(); i++) { - int ttemp = mInstructions[i]->mTTemp; + int ttemp = mInstructions[i]->mDst.mTemp; if (ttemp >= 0) { if (assignedTemps[ttemp]) @@ -2745,40 +2727,40 @@ void InterCodeBasicBlock::PerformValueForwarding(const GrowingInstructionPtrArra InterInstruction* ins = mInstructions[i]; #if 1 - if (ins->mCode == IC_BINARY_OPERATOR && ins->mOperator == IA_MUL && ins->mTType == IT_INT16 && spareTemps + 1 < tvalid.Size()) + if (ins->mCode == IC_BINARY_OPERATOR && ins->mOperator == IA_MUL && ins->mDst.mType == IT_INT16 && spareTemps + 1 < tvalid.Size()) { - InterInstruction* mi0 = ltvalue[ins->mSTemp[0]], * mi1 = ltvalue[ins->mSTemp[1]]; + InterInstruction* mi0 = ltvalue[ins->mSrc[0].mTemp], * mi1 = ltvalue[ins->mSrc[1].mTemp]; if (mi0 && mi1 && mi1->mCode == IC_CONSTANT && mi0->mCode == IC_BINARY_OPERATOR && mi0->mOperator == IA_ADD) { - InterInstruction* ai0 = ltvalue[mi0->mSTemp[0]], * ai1 = ltvalue[mi0->mSTemp[1]]; + InterInstruction* ai0 = ltvalue[mi0->mSrc[0].mTemp], * ai1 = ltvalue[mi0->mSrc[1].mTemp]; if (ai0 && ai0->mCode == IC_CONSTANT) { InterInstruction* nai = new InterInstruction(); nai->mCode = IC_BINARY_OPERATOR; nai->mOperator = IA_MUL; - nai->mSTemp[0] = mi0->mSTemp[1]; - nai->mSType[0] = IT_INT16; - nai->mSTemp[1] = ins->mSTemp[1]; - nai->mSType[1] = IT_INT16; - nai->mTTemp = spareTemps++; - nai->mTType = IT_INT16; + nai->mSrc[0].mTemp = mi0->mSrc[1].mTemp; + nai->mSrc[0].mType = IT_INT16; + nai->mSrc[1].mTemp = ins->mSrc[1].mTemp; + nai->mSrc[1].mType = IT_INT16; + nai->mDst.mTemp = spareTemps++; + nai->mDst.mType = IT_INT16; mInstructions.Insert(i, nai); - ltvalue[nai->mTTemp] = nullptr; + ltvalue[nai->mDst.mTemp] = nullptr; InterInstruction* cai = new InterInstruction(); cai->mCode = IC_CONSTANT; - cai->mTTemp = spareTemps++; - cai->mTType = IT_INT16; + cai->mDst.mTemp = spareTemps++; + cai->mDst.mType = IT_INT16; cai->mIntValue = ai0->mIntValue * mi1->mIntValue; mInstructions.Insert(i, cai); - ltvalue[cai->mTTemp] = nullptr; + ltvalue[cai->mDst.mTemp] = nullptr; ins->mOperator = IA_ADD; - ins->mSTemp[1] = nai->mTTemp; - ins->mSTemp[0] = cai->mTTemp; + ins->mSrc[1].mTemp = nai->mDst.mTemp; + ins->mSrc[0].mTemp = cai->mDst.mTemp; printf("MADD0\n"); } @@ -2790,15 +2772,15 @@ void InterCodeBasicBlock::PerformValueForwarding(const GrowingInstructionPtrArra } #endif #if 1 - if (ins->mCode == IC_BINARY_OPERATOR && ins->mOperator == IA_ADD && ins->mTType == IT_INT16 && spareTemps < tvalid.Size()) + if (ins->mCode == IC_BINARY_OPERATOR && ins->mOperator == IA_ADD && ins->mDst.mType == IT_INT16 && spareTemps < tvalid.Size()) { - InterInstruction* mi0 = ltvalue[ins->mSTemp[0]], * mi1 = ltvalue[ins->mSTemp[1]]; + InterInstruction* mi0 = ltvalue[ins->mSrc[0].mTemp], * mi1 = ltvalue[ins->mSrc[1].mTemp]; if (mi0 && mi1) { if (mi1->mCode == IC_CONSTANT && mi0->mCode == IC_BINARY_OPERATOR && mi0->mOperator == IA_ADD) { - InterInstruction* ai0 = ltvalue[mi0->mSTemp[0]], * ai1 = ltvalue[mi0->mSTemp[1]]; + InterInstruction* ai0 = ltvalue[mi0->mSrc[0].mTemp], * ai1 = ltvalue[mi0->mSrc[1].mTemp]; if (ai0 && ai1) { if (ai0 && ai0->mCode == IC_CONSTANT) @@ -2813,22 +2795,22 @@ void InterCodeBasicBlock::PerformValueForwarding(const GrowingInstructionPtrArra } else if (mi0->mCode == IC_CONSTANT && mi1->mCode == IC_BINARY_OPERATOR && mi1->mOperator == IA_ADD) { - InterInstruction* ai0 = ltvalue[mi1->mSTemp[0]], * ai1 = ltvalue[mi1->mSTemp[1]]; + InterInstruction* ai0 = ltvalue[mi1->mSrc[0].mTemp], * ai1 = ltvalue[mi1->mSrc[1].mTemp]; if (ai0 && ai1) { if (ai0 && ai0->mCode == IC_CONSTANT) { InterInstruction* cai = new InterInstruction(); cai->mCode = IC_CONSTANT; - cai->mTTemp = spareTemps++; - cai->mTType = IT_INT16; + cai->mDst.mTemp = spareTemps++; + cai->mDst.mType = IT_INT16; cai->mIntValue = ai0->mIntValue + mi0->mIntValue; mInstructions.Insert(i, cai); - ltvalue[cai->mTTemp] = nullptr; + ltvalue[cai->mDst.mTemp] = nullptr; - ins->mSTemp[1] = mi1->mSTemp[1]; - ins->mSTemp[0] = cai->mTTemp; + ins->mSrc[1].mTemp = mi1->mSrc[1].mTemp; + ins->mSrc[0].mTemp = cai->mDst.mTemp; printf("ADDADD10\n"); } @@ -2843,30 +2825,30 @@ void InterCodeBasicBlock::PerformValueForwarding(const GrowingInstructionPtrArra if (ins->mCode == IC_LEA && spareTemps < tvalid.Size()) { - InterInstruction* li0 = ltvalue[ins->mSTemp[0]], * li1 = ltvalue[ins->mSTemp[1]]; + InterInstruction* li0 = ltvalue[ins->mSrc[0].mTemp], * li1 = ltvalue[ins->mSrc[1].mTemp]; if (li0 && li1) { if (li1->mCode != IC_CONSTANT && li0->mCode == IC_BINARY_OPERATOR && li0->mOperator == IA_ADD) { - InterInstruction* ai0 = ltvalue[li0->mSTemp[0]], * ai1 = ltvalue[li0->mSTemp[1]]; + InterInstruction* ai0 = ltvalue[li0->mSrc[0].mTemp], * ai1 = ltvalue[li0->mSrc[1].mTemp]; if (ai0 && ai1 && ai0->mCode == IC_CONSTANT && ai0->mIntValue >= 0) { InterInstruction* nai = new InterInstruction(); nai->mCode = IC_LEA; nai->mMemory = IM_INDIRECT; - nai->mSTemp[0] = li0->mSTemp[1]; - nai->mSType[0] = IT_INT16; - nai->mSTemp[1] = ins->mSTemp[1]; - nai->mSType[1] = IT_POINTER; - nai->mTTemp = spareTemps++; - nai->mTType = IT_POINTER; + nai->mSrc[0].mTemp = li0->mSrc[1].mTemp; + nai->mSrc[0].mType = IT_INT16; + nai->mSrc[1].mTemp = ins->mSrc[1].mTemp; + nai->mSrc[1].mType = IT_POINTER; + nai->mDst.mTemp = spareTemps++; + nai->mDst.mType = IT_POINTER; mInstructions.Insert(i, nai); - ltvalue[nai->mTTemp] = nullptr; + ltvalue[nai->mDst.mTemp] = nullptr; - ins->mSTemp[1] = nai->mTTemp; - ins->mSTemp[0] = li0->mSTemp[0]; + ins->mSrc[1].mTemp = nai->mDst.mTemp; + ins->mSrc[0].mTemp = li0->mSrc[0].mTemp; printf("LADD0 %d %x\n", mIndex, i); } @@ -2877,20 +2859,20 @@ void InterCodeBasicBlock::PerformValueForwarding(const GrowingInstructionPtrArra } else if (li0->mCode == IC_CONSTANT && li1->mCode == IC_LEA) { - InterInstruction* ai0 = ltvalue[li1->mSTemp[0]], * ai1 = ltvalue[li1->mSTemp[1]]; + InterInstruction* ai0 = ltvalue[li1->mSrc[0].mTemp], * ai1 = ltvalue[li1->mSrc[1].mTemp]; if (ai0 && ai1 && ai0->mCode == IC_CONSTANT && ai0->mIntValue >= 0) { InterInstruction* cai = new InterInstruction(); cai->mCode = IC_CONSTANT; - cai->mTTemp = spareTemps++; - cai->mTType = IT_INT16; + cai->mDst.mTemp = spareTemps++; + cai->mDst.mType = IT_INT16; cai->mIntValue = ai0->mIntValue + li0->mIntValue; mInstructions.Insert(i, cai); - ins->mSTemp[0] = cai->mTTemp; - ins->mSTemp[1] = li1->mSTemp[1]; + ins->mSrc[0].mTemp = cai->mDst.mTemp; + ins->mSrc[1].mTemp = li1->mSrc[1].mTemp; - ltvalue[cai->mTTemp] = nullptr; + ltvalue[cai->mDst.mTemp] = nullptr; printf("LEAEA %d %x\n", mIndex, i); } @@ -3185,7 +3167,7 @@ void InterCodeBasicBlock::MapVariables(GrowingVariableArray& globalVars, Growing switch (mInstructions[i]->mCode) { case IC_CONSTANT: - if (mInstructions[i]->mTType != IT_POINTER) + if (mInstructions[i]->mDst.mType != IT_POINTER) break; case IC_STORE: @@ -3275,11 +3257,11 @@ static bool CanBypassLoad(const InterInstruction * lins, const InterInstruction return false; // True data dependency - if (lins->mTTemp == bins->mSTemp[0] || lins->mTTemp == bins->mSTemp[1] || lins->mTTemp == bins->mSTemp[2]) + if (lins->mDst.mTemp == bins->mSrc[0].mTemp || lins->mDst.mTemp == bins->mSrc[1].mTemp || lins->mDst.mTemp == bins->mSrc[2].mTemp) return false; // False data dependency - if (lins->mSTemp[0] >= 0 && lins->mSTemp[0] == bins->mTTemp) + if (lins->mSrc[0].mTemp >= 0 && lins->mSrc[0].mTemp == bins->mDst.mTemp) return false; return true; @@ -3317,7 +3299,7 @@ static bool CanBypassStore(const InterInstruction * sins, const InterInstruction return false; // True data dependency - if (bins->mTTemp >= 0 && (bins->mTTemp == sins->mSTemp[0] || bins->mTTemp == sins->mSTemp[1])) + if (bins->mDst.mTemp >= 0 && (bins->mDst.mTemp == sins->mSrc[0].mTemp || bins->mDst.mTemp == sins->mSrc[1].mTemp)) return false; return true; @@ -3372,7 +3354,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa ins->mInvariant = false; else if (ins->mCode == IC_LOAD) { - if (ins->mSTemp[0] >= 0 || ins->mVolatile) + if (ins->mSrc[0].mTemp >= 0 || ins->mVolatile) { ins->mInvariant = false; } @@ -3383,7 +3365,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa InterInstruction* sins = mInstructions[j]; if (sins->mCode == IC_STORE) { - if (sins->mSTemp[1] >= 0) + if (sins->mSrc[1].mTemp >= 0) { if (ins->mMemory != IM_PARAM || aliasedParams[ins->mVarIndex]) ins->mInvariant = false; @@ -3412,7 +3394,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa for (int i = 0; i < mInstructions.Size(); i++) { InterInstruction* ins = mInstructions[i]; - int t = ins->mTTemp; + int t = ins->mDst.mTemp; if (t >= 0) { if (HasSideEffect(ins->mCode) || !ins->mInvariant) @@ -3441,14 +3423,14 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa for (int i = 0; i < mInstructions.Size(); i++) { InterInstruction* ins = mInstructions[i]; - int t = ins->mTTemp; + int t = ins->mDst.mTemp; if (t >= 0) { if (dep[t] < DEP_VARIABLE) { - if (ins->mSTemp[0] >= 0 && dep[ins->mSTemp[0]] >= DEP_ITERATED || - ins->mSTemp[1] >= 0 && dep[ins->mSTemp[1]] >= DEP_ITERATED || - ins->mSTemp[2] >= 0 && dep[ins->mSTemp[2]] >= DEP_ITERATED) + if (ins->mSrc[0].mTemp >= 0 && dep[ins->mSrc[0].mTemp] >= DEP_ITERATED || + ins->mSrc[1].mTemp >= 0 && dep[ins->mSrc[1].mTemp] >= DEP_ITERATED || + ins->mSrc[2].mTemp >= 0 && dep[ins->mSrc[2].mTemp] >= DEP_ITERATED) { dep[t] = DEP_VARIABLE; ins->mInvariant = false; @@ -3579,75 +3561,75 @@ void InterCodeBasicBlock::PeepholeOptimization(void) { if (i + 2 < mInstructions.Size()) { - if (mInstructions[i + 0]->mTTemp >= 0 && - mInstructions[i + 1]->mCode == IC_LOAD_TEMPORARY && mInstructions[i + 1]->mSTemp[0] == mInstructions[i]->mTTemp && - (mInstructions[i + 2]->mCode == IC_RELATIONAL_OPERATOR || mInstructions[i + 2]->mCode == IC_BINARY_OPERATOR) && mInstructions[i + 2]->mSTemp[0] == mInstructions[i]->mTTemp && mInstructions[i + 2]->mSFinal[0]) + if (mInstructions[i + 0]->mDst.mTemp >= 0 && + mInstructions[i + 1]->mCode == IC_LOAD_TEMPORARY && mInstructions[i + 1]->mSrc[0].mTemp == mInstructions[i]->mDst.mTemp && + (mInstructions[i + 2]->mCode == IC_RELATIONAL_OPERATOR || mInstructions[i + 2]->mCode == IC_BINARY_OPERATOR) && mInstructions[i + 2]->mSrc[0].mTemp == mInstructions[i]->mDst.mTemp && mInstructions[i + 2]->mSrc[0].mFinal) { - mInstructions[i + 0]->mTTemp = mInstructions[i + 1]->mTTemp; + mInstructions[i + 0]->mDst.mTemp = mInstructions[i + 1]->mDst.mTemp; mInstructions[i + 1]->mCode = IC_NONE; - mInstructions[i + 2]->mSTemp[0] = mInstructions[i + 1]->mTTemp; - mInstructions[i + 2]->mSFinal[0] = false; + mInstructions[i + 2]->mSrc[0].mTemp = mInstructions[i + 1]->mDst.mTemp; + mInstructions[i + 2]->mSrc[0].mFinal = false; changed = true; } - else if (mInstructions[i + 0]->mTTemp >= 0 && - mInstructions[i + 1]->mCode == IC_LOAD_TEMPORARY && mInstructions[i + 1]->mSTemp[0] == mInstructions[i]->mTTemp && - (mInstructions[i + 2]->mCode == IC_RELATIONAL_OPERATOR || mInstructions[i + 2]->mCode == IC_BINARY_OPERATOR) && mInstructions[i + 2]->mSTemp[1] == mInstructions[i]->mTTemp && mInstructions[i + 2]->mSFinal[1]) + else if (mInstructions[i + 0]->mDst.mTemp >= 0 && + mInstructions[i + 1]->mCode == IC_LOAD_TEMPORARY && mInstructions[i + 1]->mSrc[0].mTemp == mInstructions[i]->mDst.mTemp && + (mInstructions[i + 2]->mCode == IC_RELATIONAL_OPERATOR || mInstructions[i + 2]->mCode == IC_BINARY_OPERATOR) && mInstructions[i + 2]->mSrc[1].mTemp == mInstructions[i]->mDst.mTemp && mInstructions[i + 2]->mSrc[1].mFinal) { - mInstructions[i + 0]->mTTemp = mInstructions[i + 1]->mTTemp; + mInstructions[i + 0]->mDst.mTemp = mInstructions[i + 1]->mDst.mTemp; mInstructions[i + 1]->mCode = IC_NONE; - mInstructions[i + 2]->mSTemp[1] = mInstructions[i + 1]->mTTemp; - mInstructions[i + 2]->mSFinal[1] = false; + mInstructions[i + 2]->mSrc[1].mTemp = mInstructions[i + 1]->mDst.mTemp; + mInstructions[i + 2]->mSrc[1].mFinal = false; changed = true; } else if ( - mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_SAR && mInstructions[i + 0]->mSTemp[0] < 0 && - mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 1]->mOperator == IA_MUL && mInstructions[i + 1]->mSTemp[0] < 0 && - mInstructions[i + 1]->mSTemp[1] == mInstructions[i + 0]->mTTemp && mInstructions[i + 1]->mSFinal[1] && - (mInstructions[i + 1]->mSIntConst[0] & (1LL << mInstructions[i + 0]->mSIntConst[0])) == 0) + mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_SAR && mInstructions[i + 0]->mSrc[0].mTemp < 0 && + mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 1]->mOperator == IA_MUL && mInstructions[i + 1]->mSrc[0].mTemp < 0 && + mInstructions[i + 1]->mSrc[1].mTemp == mInstructions[i + 0]->mDst.mTemp && mInstructions[i + 1]->mSrc[1].mFinal && + (mInstructions[i + 1]->mSrc[0].mIntConst & (1LL << mInstructions[i + 0]->mSrc[0].mIntConst)) == 0) { - int shift = mInstructions[i + 0]->mSIntConst[0]; - mInstructions[i + 1]->mSIntConst[0] >>= shift; + int shift = mInstructions[i + 0]->mSrc[0].mIntConst; + mInstructions[i + 1]->mSrc[0].mIntConst >>= shift; mInstructions[i + 0]->mOperator = IA_AND; - mInstructions[i + 0]->mSIntConst[0] = ~((1LL << shift) - 1); + mInstructions[i + 0]->mSrc[0].mIntConst = ~((1LL << shift) - 1); changed = true; } else if ( - mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_SAR && mInstructions[i + 0]->mSTemp[0] < 0 && - mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 1]->mOperator == IA_MUL && mInstructions[i + 1]->mSTemp[1] < 0 && - mInstructions[i + 1]->mSTemp[0] == mInstructions[i + 0]->mTTemp && mInstructions[i + 1]->mSFinal[0] && - (mInstructions[i + 1]->mSIntConst[1] & (1LL << mInstructions[i + 0]->mSIntConst[0])) == 0) + mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_SAR && mInstructions[i + 0]->mSrc[0].mTemp < 0 && + mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 1]->mOperator == IA_MUL && mInstructions[i + 1]->mSrc[1].mTemp < 0 && + mInstructions[i + 1]->mSrc[0].mTemp == mInstructions[i + 0]->mDst.mTemp && mInstructions[i + 1]->mSrc[0].mFinal && + (mInstructions[i + 1]->mSrc[1].mIntConst & (1LL << mInstructions[i + 0]->mSrc[0].mIntConst)) == 0) { - int shift = mInstructions[i + 0]->mSIntConst[0]; - mInstructions[i + 1]->mSIntConst[1] >>= shift; + int shift = mInstructions[i + 0]->mSrc[0].mIntConst; + mInstructions[i + 1]->mSrc[1].mIntConst >>= shift; mInstructions[i + 0]->mOperator = IA_AND; - mInstructions[i + 0]->mSIntConst[0] = ~((1LL << shift) - 1); + mInstructions[i + 0]->mSrc[0].mIntConst = ~((1LL << shift) - 1); changed = true; } else if ( - mInstructions[i + 1]->mCode == IC_LOAD_TEMPORARY && mExitRequiredTemps[mInstructions[i + 1]->mTTemp] && !mExitRequiredTemps[mInstructions[i + 1]->mSTemp[0]] && - mInstructions[i + 0]->mTTemp == mInstructions[i + 1]->mSTemp[0]) + mInstructions[i + 1]->mCode == IC_LOAD_TEMPORARY && mExitRequiredTemps[mInstructions[i + 1]->mDst.mTemp] && !mExitRequiredTemps[mInstructions[i + 1]->mSrc[0].mTemp] && + mInstructions[i + 0]->mDst.mTemp == mInstructions[i + 1]->mSrc[0].mTemp) { - mInstructions[i + 0]->mTTemp = mInstructions[i + 1]->mTTemp; - mInstructions[i + 1]->mTTemp = mInstructions[i + 1]->mSTemp[0]; - mInstructions[i + 1]->mSTemp[0] = mInstructions[i + 0]->mTTemp; + mInstructions[i + 0]->mDst.mTemp = mInstructions[i + 1]->mDst.mTemp; + mInstructions[i + 1]->mDst.mTemp = mInstructions[i + 1]->mSrc[0].mTemp; + mInstructions[i + 1]->mSrc[0].mTemp = mInstructions[i + 0]->mDst.mTemp; changed = true; } // Postincrement artifact if (mInstructions[i + 0]->mCode == IC_LOAD_TEMPORARY && mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && - mInstructions[i + 1]->mSTemp[0] < 0 && - mInstructions[i + 0]->mSTemp[0] == mInstructions[i + 1]->mSTemp[1] && - mInstructions[i + 0]->mSTemp[0] == mInstructions[i + 1]->mTTemp) + mInstructions[i + 1]->mSrc[0].mTemp < 0 && + mInstructions[i + 0]->mSrc[0].mTemp == mInstructions[i + 1]->mSrc[1].mTemp && + mInstructions[i + 0]->mSrc[0].mTemp == mInstructions[i + 1]->mDst.mTemp) { InterInstruction * ins = mInstructions[i + 1]; - int ttemp = mInstructions[i + 1]->mTTemp; + int ttemp = mInstructions[i + 1]->mDst.mTemp; int k = i + 1; while (k + 2 < mInstructions.Size() && mInstructions[k + 1]->mCode != IC_RELATIONAL_OPERATOR && - mInstructions[k + 1]->mSTemp[0] != ttemp && - mInstructions[k + 1]->mSTemp[1] != ttemp && - mInstructions[k + 1]->mSTemp[2] != ttemp && - mInstructions[k + 1]->mTTemp != ttemp) + mInstructions[k + 1]->mSrc[0].mTemp != ttemp && + mInstructions[k + 1]->mSrc[1].mTemp != ttemp && + mInstructions[k + 1]->mSrc[2].mTemp != ttemp && + mInstructions[k + 1]->mDst.mTemp != ttemp) { mInstructions[k] = mInstructions[k + 1]; k++; diff --git a/oscar64/InterCode.h b/oscar64/InterCode.h index f178ea4..4a53461 100644 --- a/oscar64/InterCode.h +++ b/oscar64/InterCode.h @@ -285,16 +285,26 @@ public: } }; +class InterOperand +{ +public: + int mTemp; + InterType mType; + bool mFinal; + int64 mIntConst; + double mFloatConst; + + InterOperand(void) + : mTemp(INVALID_TEMPORARY), mType(IT_NONE), mFinal(false), mIntConst(0), mFloatConst(0) + {} +}; class InterInstruction { public: InterCode mCode; - InterType mTType, mSType[3]; - int mTTemp, mSTemp[3]; - bool mSFinal[3]; - int64 mSIntConst[3]; - double mSFloatConst[3]; + InterOperand mSrc[3]; + InterOperand mDst; InterMemory mMemory; InterOperator mOperator; int mOperandSize; diff --git a/oscar64/InterCodeGenerator.cpp b/oscar64/InterCodeGenerator.cpp index 533e631..24550e2 100644 --- a/oscar64/InterCodeGenerator.cpp +++ b/oscar64/InterCodeGenerator.cpp @@ -44,16 +44,16 @@ InterCodeGenerator::ExValue InterCodeGenerator::Dereference(InterCodeProcedure* InterInstruction * ins = new InterInstruction(); ins->mCode = IC_LOAD; ins->mMemory = IM_INDIRECT; - ins->mSType[0] = IT_POINTER; - ins->mSTemp[0] = v.mTemp; - ins->mTType = v.mReference == 1 ? InterTypeOf(v.mType) : IT_POINTER; - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mSrc[0].mType = IT_POINTER; + ins->mSrc[0].mTemp = v.mTemp; + ins->mDst.mType = v.mReference == 1 ? InterTypeOf(v.mType) : IT_POINTER; + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); ins->mOperandSize = v.mReference == 1 ? v.mType->mSize : 2; if (v.mType->mFlags & DTF_VOLATILE) ins->mVolatile = true; block->Append(ins); - v = ExValue(v.mType, ins->mTTemp, v.mReference - 1); + v = ExValue(v.mType, ins->mDst.mTemp, v.mReference - 1); } return v; @@ -72,37 +72,37 @@ InterCodeGenerator::ExValue InterCodeGenerator::CoerceType(InterCodeProcedure* p InterInstruction * xins = new InterInstruction(); xins->mCode = IC_CONVERSION_OPERATOR; xins->mOperator = IA_EXT8TO16S; - xins->mSType[0] = IT_INT8; - xins->mSTemp[0] = stemp; - xins->mTType = IT_INT16; - xins->mTTemp = proc->AddTemporary(IT_INT16); + xins->mSrc[0].mType = IT_INT8; + xins->mSrc[0].mTemp = stemp; + xins->mDst.mType = IT_INT16; + xins->mDst.mTemp = proc->AddTemporary(IT_INT16); block->Append(xins); - stemp = xins->mTTemp; + stemp = xins->mDst.mTemp; } else { InterInstruction * xins = new InterInstruction(); xins->mCode = IC_CONVERSION_OPERATOR; xins->mOperator = IA_EXT8TO16U; - xins->mSType[0] = IT_INT8; - xins->mSTemp[0] = stemp; - xins->mTType = IT_INT16; - xins->mTTemp = proc->AddTemporary(IT_INT16); + xins->mSrc[0].mType = IT_INT8; + xins->mSrc[0].mTemp = stemp; + xins->mDst.mType = IT_INT16; + xins->mDst.mTemp = proc->AddTemporary(IT_INT16); block->Append(xins); - stemp = xins->mTTemp; + stemp = xins->mDst.mTemp; } } InterInstruction * cins = new InterInstruction(); cins->mCode = IC_CONVERSION_OPERATOR; cins->mOperator = IA_INT2FLOAT; - cins->mSType[0] = IT_INT16; - cins->mSTemp[0] = stemp; - cins->mTType = IT_FLOAT; - cins->mTTemp = proc->AddTemporary(IT_FLOAT); + cins->mSrc[0].mType = IT_INT16; + cins->mSrc[0].mTemp = stemp; + cins->mDst.mType = IT_FLOAT; + cins->mDst.mTemp = proc->AddTemporary(IT_FLOAT); block->Append(cins); - v.mTemp = cins->mTTemp; + v.mTemp = cins->mDst.mTemp; v.mType = type; } else if (v.mType->mType == DT_TYPE_FLOAT && type->IsIntegerType()) @@ -110,12 +110,12 @@ InterCodeGenerator::ExValue InterCodeGenerator::CoerceType(InterCodeProcedure* p InterInstruction * cins = new InterInstruction(); cins->mCode = IC_CONVERSION_OPERATOR; cins->mOperator = IA_FLOAT2INT; - cins->mSType[0] = IT_FLOAT; - cins->mSTemp[0] = v.mTemp; - cins->mTType = IT_INT16; - cins->mTTemp = proc->AddTemporary(IT_INT16); + cins->mSrc[0].mType = IT_FLOAT; + cins->mSrc[0].mTemp = v.mTemp; + cins->mDst.mType = IT_INT16; + cins->mDst.mTemp = proc->AddTemporary(IT_INT16); block->Append(cins); - v.mTemp = cins->mTTemp; + v.mTemp = cins->mDst.mTemp; v.mType = type; } else if (v.mType->mSize < type->mSize) @@ -127,24 +127,24 @@ InterCodeGenerator::ExValue InterCodeGenerator::CoerceType(InterCodeProcedure* p InterInstruction * xins = new InterInstruction(); xins->mCode = IC_CONVERSION_OPERATOR; xins->mOperator = IA_EXT8TO16S; - xins->mSType[0] = IT_INT8; - xins->mSTemp[0] = stemp; - xins->mTType = IT_INT16; - xins->mTTemp = proc->AddTemporary(IT_INT16); + xins->mSrc[0].mType = IT_INT8; + xins->mSrc[0].mTemp = stemp; + xins->mDst.mType = IT_INT16; + xins->mDst.mTemp = proc->AddTemporary(IT_INT16); block->Append(xins); - stemp = xins->mTTemp; + stemp = xins->mDst.mTemp; } else { InterInstruction * xins = new InterInstruction(); xins->mCode = IC_CONVERSION_OPERATOR; xins->mOperator = IA_EXT8TO16U; - xins->mSType[0] = IT_INT8; - xins->mSTemp[0] = stemp; - xins->mTType = IT_INT16; - xins->mTTemp = proc->AddTemporary(IT_INT16); + xins->mSrc[0].mType = IT_INT8; + xins->mSrc[0].mTemp = stemp; + xins->mDst.mType = IT_INT16; + xins->mDst.mTemp = proc->AddTemporary(IT_INT16); block->Append(xins); - stemp = xins->mTTemp; + stemp = xins->mDst.mTemp; } } else if (v.mType->mSize == 2 && type->mSize == 4) @@ -154,24 +154,24 @@ InterCodeGenerator::ExValue InterCodeGenerator::CoerceType(InterCodeProcedure* p InterInstruction* xins = new InterInstruction(); xins->mCode = IC_CONVERSION_OPERATOR; xins->mOperator = IA_EXT16TO32S; - xins->mSType[0] = IT_INT16; - xins->mSTemp[0] = stemp; - xins->mTType = IT_INT32; - xins->mTTemp = proc->AddTemporary(IT_INT32); + xins->mSrc[0].mType = IT_INT16; + xins->mSrc[0].mTemp = stemp; + xins->mDst.mType = IT_INT32; + xins->mDst.mTemp = proc->AddTemporary(IT_INT32); block->Append(xins); - stemp = xins->mTTemp; + stemp = xins->mDst.mTemp; } else { InterInstruction* xins = new InterInstruction(); xins->mCode = IC_CONVERSION_OPERATOR; xins->mOperator = IA_EXT16TO32U; - xins->mSType[0] = IT_INT16; - xins->mSTemp[0] = stemp; - xins->mTType = IT_INT32; - xins->mTTemp = proc->AddTemporary(IT_INT32); + xins->mSrc[0].mType = IT_INT16; + xins->mSrc[0].mTemp = stemp; + xins->mDst.mType = IT_INT32; + xins->mDst.mTemp = proc->AddTemporary(IT_INT32); block->Append(xins); - stemp = xins->mTTemp; + stemp = xins->mDst.mTemp; } } @@ -525,9 +525,9 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* { InterInstruction * ins = new InterInstruction(); ins->mCode = IC_CONSTANT; - ins->mTType = InterTypeOf(dec->mBase); - ins->mTTemp = proc->AddTemporary(ins->mTType); - if (ins->mTType == IT_INT8) + ins->mDst.mType = InterTypeOf(dec->mBase); + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); + if (ins->mDst.mType == IT_INT8) { if (dec->mBase->mFlags & DTF_SIGNED) { @@ -542,7 +542,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ins->mIntValue = uint8(dec->mInteger); } } - else if (ins->mTType == IT_INT16) + else if (ins->mDst.mType == IT_INT16) { if (dec->mBase->mFlags & DTF_SIGNED) { @@ -557,7 +557,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ins->mIntValue = uint16(dec->mInteger); } } - else if (ins->mTType == IT_INT32) + else if (ins->mDst.mType == IT_INT32) { if (dec->mBase->mFlags & DTF_SIGNED) { @@ -577,7 +577,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ins->mIntValue = dec->mInteger; } block->Append(ins); - return ExValue(dec->mBase, ins->mTTemp); + return ExValue(dec->mBase, ins->mDst.mTemp); } break; @@ -585,11 +585,11 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* { InterInstruction * ins = new InterInstruction(); ins->mCode = IC_CONSTANT; - ins->mTType = InterTypeOf(dec->mBase); - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mDst.mType = InterTypeOf(dec->mBase); + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); ins->mFloatValue = dec->mNumber; block->Append(ins); - return ExValue(dec->mBase, ins->mTTemp); + return ExValue(dec->mBase, ins->mDst.mTemp); } break; @@ -597,12 +597,12 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* { InterInstruction * ins = new InterInstruction(); ins->mCode = IC_CONSTANT; - ins->mTType = IT_POINTER; - ins->mTTemp = proc->AddTemporary(IT_POINTER); + ins->mDst.mType = IT_POINTER; + ins->mDst.mTemp = proc->AddTemporary(IT_POINTER); ins->mIntValue = dec->mInteger; ins->mMemory = IM_ABSOLUTE; block->Append(ins); - return ExValue(dec->mBase, ins->mTTemp); + return ExValue(dec->mBase, ins->mDst.mTemp); } break; @@ -615,14 +615,14 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * ins = new InterInstruction(); ins->mCode = IC_CONSTANT; - ins->mTType = InterTypeOf(dec->mBase); - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mDst.mType = InterTypeOf(dec->mBase); + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); ins->mVarIndex = dec->mVarIndex; ins->mLinkerObject = dec->mLinkerObject; ins->mMemory = IM_PROCEDURE; ins->mIntValue = 0; block->Append(ins); - return ExValue(dec->mBase, ins->mTTemp); + return ExValue(dec->mBase, ins->mDst.mTemp); } break; @@ -649,14 +649,14 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * ins = new InterInstruction(); ins->mCode = IC_CONSTANT; - ins->mTType = IT_POINTER; - ins->mTTemp = proc->AddTemporary(IT_POINTER); + ins->mDst.mType = IT_POINTER; + ins->mDst.mTemp = proc->AddTemporary(IT_POINTER); ins->mIntValue = 0; ins->mVarIndex = dec->mVarIndex; ins->mLinkerObject = dec->mLinkerObject; ins->mMemory = IM_GLOBAL; block->Append(ins); - return ExValue(dec->mBase, ins->mTTemp, 1); + return ExValue(dec->mBase, ins->mDst.mTemp, 1); } case DT_CONST_STRUCT: @@ -680,14 +680,14 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * ins = new InterInstruction(); ins->mCode = IC_CONSTANT; - ins->mTType = IT_POINTER; - ins->mTTemp = proc->AddTemporary(IT_POINTER); + ins->mDst.mType = IT_POINTER; + ins->mDst.mTemp = proc->AddTemporary(IT_POINTER); ins->mIntValue = 0; ins->mVarIndex = dec->mVarIndex; ins->mLinkerObject = dec->mLinkerObject; ins->mMemory = IM_GLOBAL; block->Append(ins); - return ExValue(dec->mBase, ins->mTTemp, 1); + return ExValue(dec->mBase, ins->mDst.mTemp, 1); } default: @@ -702,8 +702,8 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * ins = new InterInstruction(); ins->mCode = IC_CONSTANT; - ins->mTType = IT_POINTER; - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mDst.mType = IT_POINTER; + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); ins->mOperandSize = dec->mSize; ins->mIntValue = dec->mOffset; ins->mVarIndex = dec->mVarIndex; @@ -744,7 +744,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* if (!(dec->mBase->mFlags & DTF_DEFINED)) mErrors->Error(dec->mLocation, EERR_VARIABLE_TYPE, "Undefined variable type"); - return ExValue(dec->mBase, ins->mTTemp, ref); + return ExValue(dec->mBase, ins->mDst.mTemp, ref); } @@ -776,10 +776,10 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * ins = new InterInstruction(); ins->mCode = IC_COPY; ins->mMemory = IM_INDIRECT; - ins->mSType[0] = IT_POINTER; - ins->mSTemp[0] = vr.mTemp; - ins->mSType[1] = IT_POINTER; - ins->mSTemp[1] = vl.mTemp; + ins->mSrc[0].mType = IT_POINTER; + ins->mSrc[0].mTemp = vr.mTemp; + ins->mSrc[1].mType = IT_POINTER; + ins->mSrc[1].mTemp = vl.mTemp; ins->mOperandSize = vl.mType->mSize; block->Append(ins); } @@ -820,8 +820,8 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* if (!vr.mType->IsIntegerType()) mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_TYPES, "Invalid argument for pointer inc/dec"); - cins->mTType = IT_INT16; - cins->mTTemp = proc->AddTemporary(cins->mTType); + cins->mDst.mType = IT_INT16; + cins->mDst.mTemp = proc->AddTemporary(cins->mDst.mType); block->Append(cins); vr = CoerceType(proc, block, vr, TheSignedIntTypeDeclaration); @@ -829,26 +829,26 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * mins = new InterInstruction(); mins->mCode = IC_BINARY_OPERATOR; mins->mOperator = IA_MUL; - mins->mSType[0] = IT_INT16; - mins->mSTemp[0] = vr.mTemp; - mins->mSType[1] = IT_INT16; - mins->mSTemp[1] = cins->mTTemp; - mins->mTType = IT_INT16; - mins->mTTemp = proc->AddTemporary(mins->mTType); + mins->mSrc[0].mType = IT_INT16; + mins->mSrc[0].mTemp = vr.mTemp; + mins->mSrc[1].mType = IT_INT16; + mins->mSrc[1].mTemp = cins->mDst.mTemp; + mins->mDst.mType = IT_INT16; + mins->mDst.mTemp = proc->AddTemporary(mins->mDst.mType); block->Append(mins); InterInstruction * ains = new InterInstruction(); ains->mCode = IC_LEA; ains->mMemory = IM_INDIRECT; - ains->mSType[0] = IT_INT16; - ains->mSTemp[0] = mins->mTTemp; - ains->mSType[1] = IT_POINTER; - ains->mSTemp[1] = vll.mTemp; - ains->mTType = IT_POINTER; - ains->mTTemp = proc->AddTemporary(ains->mTType); + ains->mSrc[0].mType = IT_INT16; + ains->mSrc[0].mTemp = mins->mDst.mTemp; + ains->mSrc[1].mType = IT_POINTER; + ains->mSrc[1].mTemp = vll.mTemp; + ains->mDst.mType = IT_POINTER; + ains->mDst.mTemp = proc->AddTemporary(ains->mDst.mType); block->Append(ains); - vr.mTemp = ains->mTTemp; + vr.mTemp = ains->mDst.mTemp; vr.mType = vll.mType; } else @@ -857,12 +857,12 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * oins = new InterInstruction(); oins->mCode = IC_BINARY_OPERATOR; - oins->mSType[0] = InterTypeOf(vr.mType); - oins->mSTemp[0] = vr.mTemp; - oins->mSType[1] = InterTypeOf(vll.mType); - oins->mSTemp[1] = vll.mTemp; - oins->mTType = InterTypeOf(vll.mType); - oins->mTTemp = proc->AddTemporary(oins->mTType); + oins->mSrc[0].mType = InterTypeOf(vr.mType); + oins->mSrc[0].mTemp = vr.mTemp; + oins->mSrc[1].mType = InterTypeOf(vll.mType); + oins->mSrc[1].mTemp = vll.mTemp; + oins->mDst.mType = InterTypeOf(vll.mType); + oins->mDst.mTemp = proc->AddTemporary(oins->mDst.mType); if (!vll.mType->IsNumericType()) mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Left hand element type is not numeric"); @@ -912,7 +912,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* break; } - vr.mTemp = oins->mTTemp; + vr.mTemp = oins->mDst.mTemp; vr.mType = vll.mType; block->Append(oins); @@ -925,10 +925,10 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ins->mCode = IC_STORE; ins->mMemory = IM_INDIRECT; - ins->mSType[0] = InterTypeOf(vr.mType); - ins->mSTemp[0] = vr.mTemp; - ins->mSType[1] = IT_POINTER; - ins->mSTemp[1] = vl.mTemp; + ins->mSrc[0].mType = InterTypeOf(vr.mType); + ins->mSrc[0].mTemp = vr.mTemp; + ins->mSrc[1].mType = IT_POINTER; + ins->mSrc[1].mTemp = vl.mTemp; ins->mOperandSize = vl.mType->mSize; block->Append(ins); } @@ -955,33 +955,33 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * cins = new InterInstruction(); cins->mCode = IC_CONSTANT; cins->mIntValue = vl.mType->mBase->mSize; - cins->mTType = IT_INT16; - cins->mTTemp = proc->AddTemporary(cins->mTType); + cins->mDst.mType = IT_INT16; + cins->mDst.mTemp = proc->AddTemporary(cins->mDst.mType); block->Append(cins); InterInstruction * mins = new InterInstruction(); mins->mCode = IC_BINARY_OPERATOR; mins->mOperator = IA_MUL; - mins->mSType[0] = IT_INT16; - mins->mSTemp[0] = vr.mTemp; - mins->mSType[1] = IT_INT16; - mins->mSTemp[1] = cins->mTTemp; - mins->mTType = IT_INT16; - mins->mTTemp = proc->AddTemporary(mins->mTType); + mins->mSrc[0].mType = IT_INT16; + mins->mSrc[0].mTemp = vr.mTemp; + mins->mSrc[1].mType = IT_INT16; + mins->mSrc[1].mTemp = cins->mDst.mTemp; + mins->mDst.mType = IT_INT16; + mins->mDst.mTemp = proc->AddTemporary(mins->mDst.mType); block->Append(mins); InterInstruction * ains = new InterInstruction(); ains->mCode = IC_LEA; ains->mMemory = IM_INDIRECT; - ains->mSType[0] = IT_INT16; - ains->mSTemp[0] = mins->mTTemp; - ains->mSType[1] = IT_POINTER; - ains->mSTemp[1] = vl.mTemp; - ains->mTType = IT_POINTER; - ains->mTTemp = proc->AddTemporary(ains->mTType); + ains->mSrc[0].mType = IT_INT16; + ains->mSrc[0].mTemp = mins->mDst.mTemp; + ains->mSrc[1].mType = IT_POINTER; + ains->mSrc[1].mTemp = vl.mTemp; + ains->mDst.mType = IT_POINTER; + ains->mDst.mTemp = proc->AddTemporary(ains->mDst.mType); block->Append(ains); - return ExValue(vl.mType->mBase, ains->mTTemp, 1); + return ExValue(vl.mType->mBase, ains->mDst.mTemp, 1); } case EX_QUALIFY: @@ -995,22 +995,22 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * cins = new InterInstruction(); cins->mCode = IC_CONSTANT; cins->mIntValue = exp->mDecValue->mOffset; - cins->mTType = IT_INT16; - cins->mTTemp = proc->AddTemporary(cins->mTType); + cins->mDst.mType = IT_INT16; + cins->mDst.mTemp = proc->AddTemporary(cins->mDst.mType); block->Append(cins); InterInstruction * ains = new InterInstruction(); ains->mCode = IC_LEA; ains->mMemory = IM_INDIRECT; - ains->mSType[0] = IT_INT16; - ains->mSTemp[0] = cins->mTTemp; - ains->mSType[1] = IT_POINTER; - ains->mSTemp[1] = vl.mTemp; - ains->mTType = IT_POINTER; - ains->mTTemp = proc->AddTemporary(ains->mTType); + ains->mSrc[0].mType = IT_INT16; + ains->mSrc[0].mTemp = cins->mDst.mTemp; + ains->mSrc[1].mType = IT_POINTER; + ains->mSrc[1].mTemp = vl.mTemp; + ains->mDst.mType = IT_POINTER; + ains->mDst.mTemp = proc->AddTemporary(ains->mDst.mType); block->Append(ains); - return ExValue(exp->mDecValue->mBase, ains->mTTemp, 1); + return ExValue(exp->mDecValue->mBase, ains->mDst.mTemp, 1); } case EX_BINARY: @@ -1051,8 +1051,8 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* else mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Invalid pointer operation"); - cins->mTType = IT_INT16; - cins->mTTemp = proc->AddTemporary(cins->mTType); + cins->mDst.mType = IT_INT16; + cins->mDst.mTemp = proc->AddTemporary(cins->mDst.mType); block->Append(cins); vr = CoerceType(proc, block, vr, TheSignedIntTypeDeclaration); @@ -1060,22 +1060,22 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * mins = new InterInstruction(); mins->mCode = IC_BINARY_OPERATOR; mins->mOperator = IA_MUL; - mins->mSType[0] = IT_INT16; - mins->mSTemp[0] = vr.mTemp; - mins->mSType[1] = IT_INT16; - mins->mSTemp[1] = cins->mTTemp; - mins->mTType = IT_INT16; - mins->mTTemp = proc->AddTemporary(mins->mTType); + mins->mSrc[0].mType = IT_INT16; + mins->mSrc[0].mTemp = vr.mTemp; + mins->mSrc[1].mType = IT_INT16; + mins->mSrc[1].mTemp = cins->mDst.mTemp; + mins->mDst.mType = IT_INT16; + mins->mDst.mTemp = proc->AddTemporary(mins->mDst.mType); block->Append(mins); ins->mCode = IC_LEA; ins->mMemory = IM_INDIRECT; - ins->mSType[0] = IT_INT16; - ins->mSTemp[0] = mins->mTTemp; - ins->mSType[1] = IT_POINTER; - ins->mSTemp[1] = vl.mTemp; - ins->mTType = IT_POINTER; - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mSrc[0].mType = IT_INT16; + ins->mSrc[0].mTemp = mins->mDst.mTemp; + ins->mSrc[1].mType = IT_POINTER; + ins->mSrc[1].mTemp = vl.mTemp; + ins->mDst.mType = IT_POINTER; + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); block->Append(ins); } else if (vr.mType->IsSame(vl.mType)) @@ -1084,48 +1084,48 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* { InterInstruction * clins = new InterInstruction(), * crins = new InterInstruction(); clins->mCode = IC_TYPECAST; - clins->mSTemp[0] = vl.mTemp; - clins->mSType[0] = IT_POINTER; - clins->mTType = IT_INT16; - clins->mTTemp = proc->AddTemporary(clins->mTType); + clins->mSrc[0].mTemp = vl.mTemp; + clins->mSrc[0].mType = IT_POINTER; + clins->mDst.mType = IT_INT16; + clins->mDst.mTemp = proc->AddTemporary(clins->mDst.mType); block->Append(clins); crins->mCode = IC_TYPECAST; - crins->mSTemp[0] = vr.mTemp; - crins->mSType[0] = IT_POINTER; - crins->mTType = IT_INT16; - crins->mTTemp = proc->AddTemporary(crins->mTType); + crins->mSrc[0].mTemp = vr.mTemp; + crins->mSrc[0].mType = IT_POINTER; + crins->mDst.mType = IT_INT16; + crins->mDst.mTemp = proc->AddTemporary(crins->mDst.mType); block->Append(crins); InterInstruction * cins = new InterInstruction(); cins->mCode = IC_CONSTANT; cins->mIntValue = vl.mType->mBase->mSize; - cins->mTType = IT_INT16; - cins->mTTemp = proc->AddTemporary(cins->mTType); + cins->mDst.mType = IT_INT16; + cins->mDst.mTemp = proc->AddTemporary(cins->mDst.mType); block->Append(cins); InterInstruction * sins = new InterInstruction(), * dins = new InterInstruction(); sins->mCode = IC_BINARY_OPERATOR; sins->mOperator = IA_SUB; - sins->mSType[0] = IT_INT16; - sins->mSTemp[0] = crins->mTTemp; - sins->mSType[1] = IT_INT16; - sins->mSTemp[1] = clins->mTTemp; - sins->mTType = IT_INT16; - sins->mTTemp = proc->AddTemporary(sins->mTType); + sins->mSrc[0].mType = IT_INT16; + sins->mSrc[0].mTemp = crins->mDst.mTemp; + sins->mSrc[1].mType = IT_INT16; + sins->mSrc[1].mTemp = clins->mDst.mTemp; + sins->mDst.mType = IT_INT16; + sins->mDst.mTemp = proc->AddTemporary(sins->mDst.mType); block->Append(sins); dins->mCode = IC_BINARY_OPERATOR; dins->mOperator = IA_DIVS; - dins->mSType[0] = IT_INT16; - dins->mSTemp[0] = cins->mTTemp; - dins->mSType[1] = IT_INT16; - dins->mSTemp[1] = sins->mTTemp; - dins->mTType = IT_INT16; - dins->mTTemp = proc->AddTemporary(dins->mTType); + dins->mSrc[0].mType = IT_INT16; + dins->mSrc[0].mTemp = cins->mDst.mTemp; + dins->mSrc[1].mType = IT_INT16; + dins->mSrc[1].mTemp = sins->mDst.mTemp; + dins->mDst.mType = IT_INT16; + dins->mDst.mTemp = proc->AddTemporary(dins->mDst.mType); block->Append(dins); - return ExValue(TheSignedIntTypeDeclaration, dins->mTTemp); + return ExValue(TheSignedIntTypeDeclaration, dins->mDst.mTemp); } else mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Invalid pointer operation"); @@ -1212,16 +1212,16 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* break; } - ins->mSType[0] = InterTypeOf(vr.mType);; - ins->mSTemp[0] = vr.mTemp; - ins->mSType[1] = InterTypeOf(vl.mType);; - ins->mSTemp[1] = vl.mTemp; - ins->mTType = InterTypeOfArithmetic(ins->mSType[0], ins->mSType[1]); - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mSrc[0].mType = InterTypeOf(vr.mType);; + ins->mSrc[0].mTemp = vr.mTemp; + ins->mSrc[1].mType = InterTypeOf(vl.mType);; + ins->mSrc[1].mTemp = vl.mTemp; + ins->mDst.mType = InterTypeOfArithmetic(ins->mSrc[0].mType, ins->mSrc[1].mType); + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); block->Append(ins); } - return ExValue(vl.mType, ins->mTTemp); + return ExValue(vl.mType, ins->mDst.mTemp); } @@ -1243,8 +1243,8 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* bool ftype = vl.mType->mType == DT_TYPE_FLOAT; cins->mCode = IC_CONSTANT; - cins->mTType = ftype ? IT_FLOAT : IT_INT16; - cins->mTTemp = proc->AddTemporary(cins->mTType); + cins->mDst.mType = ftype ? IT_FLOAT : IT_INT16; + cins->mDst.mTemp = proc->AddTemporary(cins->mDst.mType); if (vdl.mType->mType == DT_TYPE_POINTER) cins->mIntValue = exp->mToken == TK_INC ? vdl.mType->mBase->mSize : -(vdl.mType->mBase->mSize); else if (vdl.mType->IsNumericType()) @@ -1256,24 +1256,24 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ains->mCode = IC_BINARY_OPERATOR; ains->mOperator = IA_ADD; - ains->mSType[0] = cins->mTType; - ains->mSTemp[0] = cins->mTTemp; - ains->mSType[1] = InterTypeOf(vdl.mType); - ains->mSTemp[1] = vdl.mTemp; - ains->mTType = ains->mSType[1]; - ains->mTTemp = proc->AddTemporary(ains->mTType); + ains->mSrc[0].mType = cins->mDst.mType; + ains->mSrc[0].mTemp = cins->mDst.mTemp; + ains->mSrc[1].mType = InterTypeOf(vdl.mType); + ains->mSrc[1].mTemp = vdl.mTemp; + ains->mDst.mType = ains->mSrc[1].mType; + ains->mDst.mTemp = proc->AddTemporary(ains->mDst.mType); block->Append(ains); sins->mCode = IC_STORE; sins->mMemory = IM_INDIRECT; - sins->mSType[0] = ains->mTType; - sins->mSTemp[0] = ains->mTTemp; - sins->mSType[1] = IT_POINTER; - sins->mSTemp[1] = vl.mTemp; + sins->mSrc[0].mType = ains->mDst.mType; + sins->mSrc[0].mTemp = ains->mDst.mTemp; + sins->mSrc[1].mType = IT_POINTER; + sins->mSrc[1].mTemp = vl.mTemp; sins->mOperandSize = vl.mType->mSize; block->Append(sins); - return ExValue(vdl.mType, ains->mTTemp); + return ExValue(vdl.mType, ains->mDst.mTemp); } break; @@ -1295,8 +1295,8 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* bool ftype = vl.mType->mType == DT_TYPE_FLOAT; cins->mCode = IC_CONSTANT; - cins->mTType = ftype ? IT_FLOAT : IT_INT16; - cins->mTTemp = proc->AddTemporary(cins->mTType); + cins->mDst.mType = ftype ? IT_FLOAT : IT_INT16; + cins->mDst.mTemp = proc->AddTemporary(cins->mDst.mType); if (vdl.mType->mType == DT_TYPE_POINTER) cins->mIntValue = exp->mToken == TK_INC ? vdl.mType->mBase->mSize : -(vdl.mType->mBase->mSize); else if (vdl.mType->IsNumericType()) @@ -1307,20 +1307,20 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ains->mCode = IC_BINARY_OPERATOR; ains->mOperator = IA_ADD; - ains->mSType[0] = cins->mTType; - ains->mSTemp[0] = cins->mTTemp; - ains->mSType[1] = InterTypeOf(vdl.mType); - ains->mSTemp[1] = vdl.mTemp; - ains->mTType = ains->mSType[1]; - ains->mTTemp = proc->AddTemporary(ains->mTType); + ains->mSrc[0].mType = cins->mDst.mType; + ains->mSrc[0].mTemp = cins->mDst.mTemp; + ains->mSrc[1].mType = InterTypeOf(vdl.mType); + ains->mSrc[1].mTemp = vdl.mTemp; + ains->mDst.mType = ains->mSrc[1].mType; + ains->mDst.mTemp = proc->AddTemporary(ains->mDst.mType); block->Append(ains); sins->mCode = IC_STORE; sins->mMemory = IM_INDIRECT; - sins->mSType[0] = ains->mTType; - sins->mSTemp[0] = ains->mTTemp; - sins->mSType[1] = IT_POINTER; - sins->mSTemp[1] = vl.mTemp; + sins->mSrc[0].mType = ains->mDst.mType; + sins->mSrc[0].mTemp = ains->mDst.mTemp; + sins->mSrc[1].mType = IT_POINTER; + sins->mSrc[1].mTemp = vl.mTemp; sins->mOperandSize = vl.mType->mSize; block->Append(sins); @@ -1371,14 +1371,14 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* } } - ins->mSType[0] = InterTypeOf(vl.mType); - ins->mSTemp[0] = vl.mTemp; - ins->mTType = ins->mSType[0]; - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mSrc[0].mType = InterTypeOf(vl.mType); + ins->mSrc[0].mTemp = vl.mTemp; + ins->mDst.mType = ins->mSrc[0].mType; + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); block->Append(ins); - return ExValue(vl.mType, ins->mTTemp); + return ExValue(vl.mType, ins->mDst.mTemp); } case EX_RELATIONAL: @@ -1460,16 +1460,16 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ins->mOperator = signedCompare ? IA_CMPLES : IA_CMPLEU; break; } - ins->mSType[0] = InterTypeOf(vr.mType);; - ins->mSTemp[0] = vr.mTemp; - ins->mSType[1] = InterTypeOf(vl.mType);; - ins->mSTemp[1] = vl.mTemp; - ins->mTType = IT_BOOL; - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mSrc[0].mType = InterTypeOf(vr.mType);; + ins->mSrc[0].mTemp = vr.mTemp; + ins->mSrc[1].mType = InterTypeOf(vl.mType);; + ins->mSrc[1].mTemp = vl.mTemp; + ins->mDst.mType = IT_BOOL; + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); block->Append(ins); - return ExValue(TheBoolTypeDeclaration, ins->mTTemp); + return ExValue(TheBoolTypeDeclaration, ins->mDst.mTemp); } case EX_CALL: @@ -1491,13 +1491,13 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * ins = new InterInstruction(); ins->mCode = IC_UNARY_OPERATOR; ins->mOperator = IA_ABS; - ins->mSType[0] = IT_FLOAT; - ins->mSTemp[0] = vr.mTemp; - ins->mTType = IT_FLOAT; - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mSrc[0].mType = IT_FLOAT; + ins->mSrc[0].mTemp = vr.mTemp; + ins->mDst.mType = IT_FLOAT; + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); block->Append(ins); - return ExValue(TheFloatTypeDeclaration, ins->mTTemp); + return ExValue(TheFloatTypeDeclaration, ins->mDst.mTemp); } else if (!strcmp(iname->mString, "floor")) { @@ -1511,13 +1511,13 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * ins = new InterInstruction(); ins->mCode = IC_UNARY_OPERATOR; ins->mOperator = IA_FLOOR; - ins->mSType[0] = IT_FLOAT; - ins->mSTemp[0] = vr.mTemp; - ins->mTType = IT_FLOAT; - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mSrc[0].mType = IT_FLOAT; + ins->mSrc[0].mTemp = vr.mTemp; + ins->mDst.mType = IT_FLOAT; + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); block->Append(ins); - return ExValue(TheFloatTypeDeclaration, ins->mTTemp); + return ExValue(TheFloatTypeDeclaration, ins->mDst.mTemp); } else if (!strcmp(iname->mString, "ceil")) { @@ -1531,13 +1531,13 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * ins = new InterInstruction(); ins->mCode = IC_UNARY_OPERATOR; ins->mOperator = IA_CEIL; - ins->mSType[0] = IT_FLOAT; - ins->mSTemp[0] = vr.mTemp; - ins->mTType = IT_FLOAT; - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mSrc[0].mType = IT_FLOAT; + ins->mSrc[0].mTemp = vr.mTemp; + ins->mDst.mType = IT_FLOAT; + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); block->Append(ins); - return ExValue(TheFloatTypeDeclaration, ins->mTTemp); + return ExValue(TheFloatTypeDeclaration, ins->mDst.mTemp); } else mErrors->Error(exp->mLeft->mDecValue->mLocation, EERR_OBJECT_NOT_FOUND, "Unknown intrinsic function", iname->mString); @@ -1567,8 +1567,8 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction* ains = new InterInstruction(); ains->mCode = IC_CONSTANT; - ains->mTType = IT_POINTER; - ains->mTTemp = proc->AddTemporary(ains->mTType); + ains->mDst.mType = IT_POINTER; + ains->mDst.mTemp = proc->AddTemporary(ains->mDst.mType); ains->mMemory = IM_LOCAL; ains->mVarIndex = nindex; @@ -1627,10 +1627,10 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction* wins = new InterInstruction(); wins->mCode = IC_STORE; wins->mMemory = IM_INDIRECT; - wins->mSType[0] = InterTypeOf(vr.mType);; - wins->mSTemp[0] = vr.mTemp; - wins->mSType[1] = IT_POINTER; - wins->mSTemp[1] = ains->mTTemp; + wins->mSrc[0].mType = InterTypeOf(vr.mType);; + wins->mSrc[0].mTemp = vr.mTemp; + wins->mSrc[1].mType = IT_POINTER; + wins->mSrc[1].mTemp = ains->mDst.mTemp; if (pdec) { if (pdec->mBase->mType == DT_TYPE_ARRAY) @@ -1676,8 +1676,8 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* { InterInstruction* ins = new InterInstruction(); ins->mCode = IC_CONSTANT; - ins->mTType = IT_POINTER; - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mDst.mType = IT_POINTER; + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); ins->mOperandSize = rdec->mSize; ins->mIntValue = rdec->mOffset; ins->mVarIndex = rdec->mVarIndex; @@ -1685,7 +1685,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* block->Append(ins); - return ExValue(rdec->mBase, ins->mTTemp, 1); + return ExValue(rdec->mBase, ins->mDst.mTemp, 1); } else return ExValue(TheVoidTypeDeclaration); @@ -1720,8 +1720,8 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* { InterInstruction * ains = new InterInstruction(); ains->mCode = IC_CONSTANT; - ains->mTType = IT_POINTER; - ains->mTTemp = proc->AddTemporary(ains->mTType); + ains->mDst.mType = IT_POINTER; + ains->mDst.mTemp = proc->AddTemporary(ains->mDst.mType); ains->mMemory = IM_FRAME; if (pdec) { @@ -1772,10 +1772,10 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction* cins = new InterInstruction(); cins->mCode = IC_COPY; cins->mMemory = IM_INDIRECT; - cins->mSType[0] = IT_POINTER; - cins->mSTemp[0] = vr.mTemp; - cins->mSType[1] = IT_POINTER; - cins->mSTemp[1] = ains->mTTemp; + cins->mSrc[0].mType = IT_POINTER; + cins->mSrc[0].mTemp = vr.mTemp; + cins->mSrc[1].mType = IT_POINTER; + cins->mSrc[1].mTemp = ains->mDst.mTemp; cins->mOperandSize = vr.mType->mSize; block->Append(cins); @@ -1803,10 +1803,10 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction* wins = new InterInstruction(); wins->mCode = IC_STORE; wins->mMemory = IM_INDIRECT; - wins->mSType[0] = InterTypeOf(vr.mType);; - wins->mSTemp[0] = vr.mTemp; - wins->mSType[1] = IT_POINTER; - wins->mSTemp[1] = ains->mTTemp; + wins->mSrc[0].mType = InterTypeOf(vr.mType);; + wins->mSrc[0].mTemp = vr.mTemp; + wins->mSrc[1].mType = IT_POINTER; + wins->mSrc[1].mTemp = ains->mDst.mTemp; if (pdec) { if (pdec->mBase->mType == DT_TYPE_ARRAY) @@ -1836,12 +1836,12 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* cins->mCode = IC_CALL_NATIVE; else cins->mCode = IC_CALL; - cins->mSType[0] = IT_POINTER; - cins->mSTemp[0] = vl.mTemp; + cins->mSrc[0].mType = IT_POINTER; + cins->mSrc[0].mTemp = vl.mTemp; if (ftype->mBase->mType != DT_TYPE_VOID) { - cins->mTType = InterTypeOf(ftype->mBase); - cins->mTTemp = proc->AddTemporary(cins->mTType); + cins->mDst.mType = InterTypeOf(ftype->mBase); + cins->mDst.mTemp = proc->AddTemporary(cins->mDst.mType); } block->Append(cins); @@ -1853,7 +1853,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* xins->mIntValue = atotal; block->Append(xins); - return ExValue(ftype->mBase, cins->mTTemp); + return ExValue(ftype->mBase, cins->mDst.mTemp); } } @@ -1870,8 +1870,8 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction* ins = new InterInstruction(); ins->mCode = IC_CONSTANT; - ins->mTType = IT_POINTER; - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mDst.mType = IT_POINTER; + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); ins->mOperandSize = dec->mSize; ins->mIntValue = 0; ins->mMemory = IM_GLOBAL; @@ -1881,8 +1881,8 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * jins = new InterInstruction(); jins->mCode = IC_ASSEMBLER; - jins->mSType[0] = IT_POINTER; - jins->mSTemp[0] = ins->mTTemp; + jins->mSrc[0].mType = IT_POINTER; + jins->mSrc[0].mTemp = ins->mDst.mTemp; block->Append(jins); } @@ -1905,23 +1905,23 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* vr = CoerceType(proc, block, vr, procType->mBase); - ins->mSType[0] = InterTypeOf(vr.mType); - ins->mSTemp[0] = vr.mTemp; + ins->mSrc[0].mType = InterTypeOf(vr.mType); + ins->mSrc[0].mTemp = vr.mTemp; if (inlineMapper) { InterInstruction* ains = new InterInstruction(); ains->mCode = IC_CONSTANT; - ains->mTType = IT_POINTER; - ains->mTTemp = proc->AddTemporary(ins->mTType); + ains->mDst.mType = IT_POINTER; + ains->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); ains->mOperandSize = procType->mBase->mSize; ains->mIntValue = 0; ains->mVarIndex = inlineMapper->mResult;; ains->mMemory = IM_LOCAL; block->Append(ains); - ins->mSType[1] = ains->mTType; - ins->mSTemp[1] = ains->mTTemp; + ins->mSrc[1].mType = ains->mDst.mType; + ins->mSrc[1].mTemp = ains->mDst.mTemp; ins->mMemory = IM_INDIRECT; ins->mCode = IC_STORE; ins->mOperandSize = ains->mOperandSize; @@ -2001,23 +2001,23 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * zins = new InterInstruction(); zins->mCode = IC_CONSTANT; - zins->mTType = InterTypeOf(vl.mType); - zins->mTTemp = proc->AddTemporary(zins->mTType); + zins->mDst.mType = InterTypeOf(vl.mType); + zins->mDst.mTemp = proc->AddTemporary(zins->mDst.mType); zins->mIntValue = 0; block->Append(zins); InterInstruction * ins = new InterInstruction(); ins->mCode = IC_RELATIONAL_OPERATOR; ins->mOperator = IA_CMPEQ; - ins->mSType[0] = InterTypeOf(vl.mType); - ins->mSTemp[0] = zins->mTTemp; - ins->mSType[1] = InterTypeOf(vl.mType); - ins->mSTemp[1] = vl.mTemp; - ins->mTType = IT_BOOL; - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mSrc[0].mType = InterTypeOf(vl.mType); + ins->mSrc[0].mTemp = zins->mDst.mTemp; + ins->mSrc[1].mType = InterTypeOf(vl.mType); + ins->mSrc[1].mTemp = vl.mTemp; + ins->mDst.mType = IT_BOOL; + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); block->Append(ins); - return ExValue(TheBoolTypeDeclaration, ins->mTTemp); + return ExValue(TheBoolTypeDeclaration, ins->mDst.mTemp); } case EX_CONDITIONAL: @@ -2081,18 +2081,18 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * rins = new InterInstruction(); rins->mCode = IC_LOAD_TEMPORARY; - rins->mSType[0] = InterTypeOf(vr.mType); - rins->mSTemp[0] = vr.mTemp; - rins->mTType = ttype; - rins->mTTemp = ttemp; + rins->mSrc[0].mType = InterTypeOf(vr.mType); + rins->mSrc[0].mTemp = vr.mTemp; + rins->mDst.mType = ttype; + rins->mDst.mTemp = ttemp; fblock->Append(rins); InterInstruction * lins = new InterInstruction(); lins->mCode = IC_LOAD_TEMPORARY; - lins->mSType[0] = InterTypeOf(vl.mType); - lins->mSTemp[0] = vl.mTemp; - lins->mTType = ttype; - lins->mTTemp = ttemp; + lins->mSrc[0].mType = InterTypeOf(vl.mType); + lins->mSrc[0].mTemp = vl.mTemp; + lins->mDst.mType = ttype; + lins->mDst.mTemp = ttemp; tblock->Append(lins); tblock->Append(jins0); @@ -2119,10 +2119,10 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* vr = Dereference(proc, block, vr); ins->mCode = IC_CONVERSION_OPERATOR; ins->mOperator = IA_INT2FLOAT; - ins->mSType[0] = InterTypeOf(vr.mType); - ins->mSTemp[0] = vr.mTemp; - ins->mTType = InterTypeOf(exp->mLeft->mDecType); - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mSrc[0].mType = InterTypeOf(vr.mType); + ins->mSrc[0].mTemp = vr.mTemp; + ins->mDst.mType = InterTypeOf(exp->mLeft->mDecType); + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); block->Append(ins); } else if (exp->mLeft->mDecType->IsIntegerType() && vr.mType->mType == DT_TYPE_FLOAT) @@ -2130,10 +2130,10 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* vr = Dereference(proc, block, vr); ins->mCode = IC_CONVERSION_OPERATOR; ins->mOperator = IA_FLOAT2INT; - ins->mSType[0] = InterTypeOf(vr.mType); - ins->mSTemp[0] = vr.mTemp; - ins->mTType = InterTypeOf(exp->mLeft->mDecType); - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mSrc[0].mType = InterTypeOf(vr.mType); + ins->mSrc[0].mTemp = vr.mTemp; + ins->mDst.mType = InterTypeOf(exp->mLeft->mDecType); + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); block->Append(ins); } else if (exp->mLeft->mDecType->mType == DT_TYPE_POINTER && vr.mType->mType == DT_TYPE_POINTER) @@ -2150,14 +2150,14 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* { vr = Dereference(proc, block, vr); ins->mCode = IC_TYPECAST; - ins->mSType[0] = InterTypeOf(vr.mType); - ins->mSTemp[0] = vr.mTemp; - ins->mTType = InterTypeOf(exp->mLeft->mDecType); - ins->mTTemp = proc->AddTemporary(ins->mTType); + ins->mSrc[0].mType = InterTypeOf(vr.mType); + ins->mSrc[0].mTemp = vr.mTemp; + ins->mDst.mType = InterTypeOf(exp->mLeft->mDecType); + ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); block->Append(ins); } - return ExValue(exp->mLeft->mDecType, ins->mTTemp); + return ExValue(exp->mLeft->mDecType, ins->mDst.mTemp); } break; @@ -2183,15 +2183,15 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction* tins = new InterInstruction(); tins->mCode = IC_CONSTANT; tins->mIntValue = 1; - tins->mTType = IT_BOOL; - tins->mTTemp = ttemp; + tins->mDst.mType = IT_BOOL; + tins->mDst.mTemp = ttemp; tblock->Append(tins); InterInstruction* fins = new InterInstruction(); fins->mCode = IC_CONSTANT; fins->mIntValue = 0; - fins->mTType = IT_BOOL; - fins->mTTemp = ttemp; + fins->mDst.mType = IT_BOOL; + fins->mDst.mTemp = ttemp; fblock->Append(fins); tblock->Append(jins0); @@ -2375,19 +2375,19 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * cins = new InterInstruction(); cins->mCode = IC_RELATIONAL_OPERATOR; cins->mOperator = IA_CMPEQ; - cins->mSType[0] = InterTypeOf(vr.mType);; - cins->mSTemp[0] = vr.mTemp; - cins->mSType[1] = InterTypeOf(vl.mType);; - cins->mSTemp[1] = vl.mTemp; - cins->mTType = IT_BOOL; - cins->mTTemp = proc->AddTemporary(cins->mTType); + cins->mSrc[0].mType = InterTypeOf(vr.mType);; + cins->mSrc[0].mTemp = vr.mTemp; + cins->mSrc[1].mType = InterTypeOf(vl.mType);; + cins->mSrc[1].mTemp = vl.mTemp; + cins->mDst.mType = IT_BOOL; + cins->mDst.mTemp = proc->AddTemporary(cins->mDst.mType); sblock->Append(cins); InterInstruction * bins = new InterInstruction(); bins->mCode = IC_BRANCH; - bins->mSType[0] = IT_BOOL; - bins->mSTemp[0] = cins->mTTemp; + bins->mSrc[0].mType = IT_BOOL; + bins->mSrc[0].mTemp = cins->mDst.mTemp; sblock->Append(bins); sblock->Close(nblock, cblock); @@ -2596,8 +2596,8 @@ void InterCodeGenerator::TranslateLogic(Declaration* procType, InterCodeProcedur InterInstruction * ins = new InterInstruction(); ins->mCode = IC_BRANCH; - ins->mSType[0] = InterTypeOf(vr.mType); - ins->mSTemp[0] = vr.mTemp; + ins->mSrc[0].mType = InterTypeOf(vr.mType); + ins->mSrc[0].mTemp = vr.mTemp; block->Append(ins); block->Close(tblock, fblock); diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 944ce53..a6401d6 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -2186,8 +2186,8 @@ void NativeCodeBasicBlock::LoadConstantToReg(InterCodeProcedure * proc, const In } else if (ins->mMemory == IM_PROCEDURE) { - NativeCodeInstruction lins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSIntConst[0], ins->mLinkerObject, NCIF_LOWER); - NativeCodeInstruction hins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSIntConst[0], ins->mLinkerObject, NCIF_UPPER); + NativeCodeInstruction lins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mLinkerObject, NCIF_LOWER); + NativeCodeInstruction hins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mLinkerObject, NCIF_UPPER); mIns.Push(lins); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); @@ -2210,7 +2210,7 @@ void NativeCodeBasicBlock::LoadConstantToReg(InterCodeProcedure * proc, const In { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mIntValue & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - if (InterTypeSize[ins->mTType] > 1) + if (InterTypeSize[ins->mDst.mType] > 1) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mIntValue >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); @@ -2221,7 +2221,7 @@ void NativeCodeBasicBlock::LoadConstantToReg(InterCodeProcedure * proc, const In void NativeCodeBasicBlock::LoadConstant(InterCodeProcedure* proc, const InterInstruction * ins) { - LoadConstantToReg(proc, ins, ins->mTType, BC_REG_TMP + proc->mTempOffset[ins->mTTemp]); + LoadConstantToReg(proc, ins, ins->mDst.mType, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]); } void NativeCodeBasicBlock::CheckFrameIndex(int& reg, int& index, int size) @@ -2242,40 +2242,40 @@ void NativeCodeBasicBlock::CheckFrameIndex(int& reg, int& index, int size) void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstruction * ins) { - if (ins->mSType[0] == IT_FLOAT) + if (ins->mSrc[0].mType == IT_FLOAT) { - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { union { float f; unsigned int v; } cc; - cc.f = ins->mSFloatConst[0]; + cc.f = ins->mSrc[0].mFloatConst; if (ins->mMemory == IM_GLOBAL) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, cc.v & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1], ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (cc.v >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (cc.v >> 16) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 2, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 2, ins->mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (cc.v >> 24) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 3, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3, ins->mLinkerObject)); } else if (ins->mMemory == IM_ABSOLUTE) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, cc.v & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (cc.v >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (cc.v >> 16) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 2)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (cc.v >> 24) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3)); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; int reg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; @@ -2299,7 +2299,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr } else if (ins->mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSIntConst[1] + 2; + int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, cc.v & 0xff)); @@ -2317,9 +2317,9 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr } else { - int sreg = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; + int sreg = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; - if (ins->mSFinal[0] && CheckPredAccuStore(sreg)) + if (ins->mSrc[0].mFinal && CheckPredAccuStore(sreg)) { // cull previous store from accu to temp using direcrt forwarding from accu mIns.SetSize(mIns.Size() - 8); @@ -2329,28 +2329,28 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr if (ins->mMemory == IM_GLOBAL) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1], ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 2, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 2, ins->mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 3, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3, ins->mLinkerObject)); } else if (ins->mMemory == IM_ABSOLUTE) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 2)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3)); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; int reg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; @@ -2374,7 +2374,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr } else if (ins->mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSIntConst[1] + 2; + int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg)); @@ -2393,67 +2393,67 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr } else { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { if (ins->mMemory == IM_INDIRECT) { - 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_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 16) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 16) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 24) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 24) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); } } else { if (ins->mMemory == IM_INDIRECT) { - 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_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); } } } } - else if (ins->mSType[0] == IT_POINTER) + else if (ins->mSrc[0].mType == IT_POINTER) { - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { if (ins->mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1], ins->mLinkerObject)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mLinkerObject)); } else if (ins->mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1])); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1)); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; int reg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; @@ -2463,21 +2463,21 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr CheckFrameIndex(reg, index, 2); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); } else if (ins->mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSIntConst[1] + 2; + int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); } } @@ -2485,21 +2485,21 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins->mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1], ins->mLinkerObject)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mLinkerObject)); } else if (ins->mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1])); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1)); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; int reg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; @@ -2509,74 +2509,74 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr CheckFrameIndex(reg, index, 2); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); } else if (ins->mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSIntConst[1] + 2; + int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); } } } else { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { if (ins->mMemory == IM_INDIRECT) { - 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_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); } } else { if (ins->mMemory == IM_INDIRECT) { - 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_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); } } } } else { - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { if (ins->mOperandSize == 1) { if (ins->mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1], ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mLinkerObject)); } else if (ins->mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst)); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; int reg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; @@ -2586,15 +2586,15 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr CheckFrameIndex(reg, index, 1); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); } else if (ins->mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSIntConst[1] + 2; + int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); } } @@ -2602,21 +2602,21 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins->mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1], ins->mLinkerObject)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mLinkerObject)); } else if (ins->mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1])); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1)); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; int reg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; @@ -2626,21 +2626,21 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr CheckFrameIndex(reg, index, 2); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); } else if (ins->mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSIntConst[1] + 2; + int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); } } @@ -2648,29 +2648,29 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins->mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1], ins->mLinkerObject)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1, ins->mLinkerObject)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 16) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 2, ins->mLinkerObject)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 24) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 3, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 16) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 2, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 24) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3, ins->mLinkerObject)); } else if (ins->mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1])); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 16) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 24) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 16) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 24) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3)); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; int reg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; @@ -2680,33 +2680,33 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr CheckFrameIndex(reg, index, 4); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 16) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 16) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 24) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 24) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); } else if (ins->mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSIntConst[1] + 2; + int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 16) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 16) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 24) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 24) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); } } @@ -2717,17 +2717,17 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins->mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1], ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mLinkerObject)); } else if (ins->mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst)); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; int reg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; @@ -2737,15 +2737,15 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr CheckFrameIndex(reg, index, 1); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); } else if (ins->mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSIntConst[1] + 2; + int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); } } @@ -2753,21 +2753,21 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins->mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1], ins->mLinkerObject)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mLinkerObject)); } else if (ins->mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1])); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1)); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; int reg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (ins->mMemory == IM_LOCAL) @@ -2778,21 +2778,21 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr CheckFrameIndex(reg, index, 2); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); } else if (ins->mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSIntConst[1] + 2; + int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); } } @@ -2800,29 +2800,29 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins->mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1], ins->mLinkerObject)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1, ins->mLinkerObject)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 2, ins->mLinkerObject)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 3, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 2, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3, ins->mLinkerObject)); } else if (ins->mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1])); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSIntConst[1] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3)); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[1]; + int index = ins->mSrc[1].mIntConst; int reg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (ins->mMemory == IM_LOCAL) @@ -2833,33 +2833,33 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr CheckFrameIndex(reg, index, 4); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); } else if (ins->mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSIntConst[1] + 2; + int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); } } @@ -2867,32 +2867,32 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr } else { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { if (ins->mMemory == IM_INDIRECT) { - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSIntConst[1])); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst)); - 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_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); if (ins->mOperandSize == 2) { mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); } else if (ins->mOperandSize == 4) { mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 16) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 16) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 24) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 24) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); } } } @@ -2900,28 +2900,28 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins->mMemory == IM_INDIRECT) { - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSIntConst[1])); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst)); - 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_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); if (ins->mOperandSize == 2) { mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); } else if (ins->mOperandSize == 2) { mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); } } } @@ -2935,23 +2935,23 @@ void NativeCodeBasicBlock::LoadStoreIndirectValue(InterCodeProcedure* proc, cons int size = wins->mOperandSize; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[rins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[wins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[rins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[wins->mSrc[1].mTemp])); for (int i = 1; i < size; i++) { mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[rins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[wins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[rins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[wins->mSrc[1].mTemp])); } } void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterInstruction * rins, const InterInstruction * wins) { - if (rins->mTType == IT_FLOAT) + if (rins->mDst.mType == IT_FLOAT) { } - else if (rins->mTType == IT_POINTER) + else if (rins->mDst.mType == IT_POINTER) { } @@ -2959,19 +2959,19 @@ void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterI { if (wins->mOperandSize == 1) { - if (rins->mSTemp[0] < 0) + if (rins->mSrc[0].mTemp < 0) { if (rins->mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, rins->mSIntConst[0], rins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, rins->mSrc[0].mIntConst, rins->mLinkerObject)); } else if (rins->mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, rins->mSIntConst[0])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, rins->mSrc[0].mIntConst)); } else if (rins->mMemory == IM_LOCAL || rins->mMemory == IM_PARAM) { - int index = rins->mSIntConst[0]; + int index = rins->mSrc[0].mIntConst; int areg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (rins->mMemory == IM_LOCAL) index += proc->mLocalVars[rins->mVarIndex]->mOffset; @@ -2988,24 +2988,24 @@ void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterI { if (rins->mMemory == IM_INDIRECT) { - 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_LDY, ASMIM_IMMEDIATE, rins->mSrc[0].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[rins->mSrc[0].mTemp])); } } - if (wins->mSTemp[1] < 0) + if (wins->mSrc[1].mTemp < 0) { if (wins->mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, wins->mSIntConst[1], wins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, wins->mSrc[1].mIntConst, wins->mLinkerObject)); } else if (wins->mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, wins->mSIntConst[1])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, wins->mSrc[1].mIntConst)); } else if (wins->mMemory == IM_LOCAL || wins->mMemory == IM_PARAM) { - int index = wins->mSIntConst[1]; + int index = wins->mSrc[1].mIntConst; int areg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (wins->mMemory == IM_LOCAL) index += proc->mLocalVars[wins->mVarIndex]->mOffset; @@ -3019,7 +3019,7 @@ void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterI } else if (wins->mMemory == IM_FRAME) { - int index = wins->mVarIndex + wins->mSIntConst[1] + 2; + int index = wins->mVarIndex + wins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); @@ -3029,8 +3029,8 @@ void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterI { if (wins->mMemory == IM_INDIRECT) { - 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_LDY, ASMIM_IMMEDIATE, wins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[wins->mSrc[1].mTemp])); } } } @@ -3072,46 +3072,46 @@ void NativeCodeBasicBlock::LoadOpStoreIndirectValue(InterCodeProcedure* proc, co { if (i != 0) mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[rins->mSTemp[0]])); - if (oins->mSTemp[oindex] < 0) - mIns.Push(NativeCodeInstruction(at, ASMIM_IMMEDIATE, (oins->mSIntConst[oindex] >> (8 * i)) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[rins->mSrc[0].mTemp])); + if (oins->mSrc[oindex].mTemp < 0) + mIns.Push(NativeCodeInstruction(at, ASMIM_IMMEDIATE, (oins->mSrc[oindex].mIntConst >> (8 * i)) & 0xff)); else - mIns.Push(NativeCodeInstruction(at, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[oins->mSTemp[oindex]] + i)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[wins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(at, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[oins->mSrc[oindex].mTemp] + i)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[wins->mSrc[1].mTemp])); } } void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterInstruction * ins, int reg, const NativeCodeInstruction* ainsl, const NativeCodeInstruction* ainsh) { - if (ins->mTType == IT_FLOAT) + if (ins->mDst.mType == IT_FLOAT) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { if (ins->mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0], ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 1, ins->mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 2, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 2, ins->mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 3, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 3, ins->mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 3)); } else if (ins->mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 3)); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[0]; + int index = ins->mSrc[0].mIntConst; int areg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; @@ -3138,28 +3138,28 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI { if (ins->mMemory == IM_INDIRECT) { - 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_LDY, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 2)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 3)); } } } - else if (ins->mTType == IT_POINTER) + else if (ins->mDst.mType == IT_POINTER) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { if (ins->mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0], ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mLinkerObject)); if (ainsl) { if (ainsl->mType == ASMIT_ADC) @@ -3169,13 +3169,13 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI mIns.Push(*ainsl); } mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 1, ins->mLinkerObject)); if (ainsh) mIns.Push(*ainsh); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } else if (ins->mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst)); if (ainsl) { if (ainsl->mType == ASMIT_ADC) @@ -3185,13 +3185,13 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI mIns.Push(*ainsl); } mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 1)); if (ainsh) mIns.Push(*ainsh); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[0]; + int index = ins->mSrc[0].mIntConst; int areg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; @@ -3221,8 +3221,8 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI { if (ins->mMemory == IM_INDIRECT) { - int src = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSIntConst[0])); + int src = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, src)); if (ainsl) { @@ -3247,21 +3247,21 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI } else { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { if (ins->mOperandSize == 1) { if (ins->mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0], ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mLinkerObject)); } else if (ins->mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst)); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[0]; + int index = ins->mSrc[0].mIntConst; int areg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; @@ -3284,7 +3284,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI } mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - if (InterTypeSize[ins->mTType] > 1) + if (InterTypeSize[ins->mDst.mType] > 1) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); if (ainsh) mIns.Push(*ainsh); @@ -3295,7 +3295,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI { if (ins->mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0], ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mLinkerObject)); if (ainsl) { if (ainsl->mType == ASMIT_ADC) @@ -3305,13 +3305,13 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI mIns.Push(*ainsl); } mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 1, ins->mLinkerObject)); if (ainsh) mIns.Push(*ainsh); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } else if (ins->mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst)); if (ainsl) { if (ainsl->mType == ASMIT_ADC) @@ -3321,13 +3321,13 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI mIns.Push(*ainsl); } mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 1)); if (ainsh) mIns.Push(*ainsh); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[0]; + int index = ins->mSrc[0].mIntConst; int areg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; @@ -3357,29 +3357,29 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI { if (ins->mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0], ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 1, ins->mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 2, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 2, ins->mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 3, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 3, ins->mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 3)); } else if (ins->mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSIntConst[0] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 3)); } else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) { - int index = ins->mSIntConst[0]; + int index = ins->mSrc[0].mIntConst; int areg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; if (ins->mMemory == IM_LOCAL) index += proc->mLocalVars[ins->mVarIndex]->mOffset; @@ -3409,8 +3409,8 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI { if (ins->mOperandSize == 1) { - 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_LDY, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); if (ainsl) { if (ainsl->mType == ASMIT_ADC) @@ -3420,7 +3420,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI mIns.Push(*ainsl); } mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - if (InterTypeSize[ins->mTType] > 1) + if (InterTypeSize[ins->mDst.mType] > 1) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); if (ainsh) mIns.Push(*ainsh); @@ -3429,9 +3429,9 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI } else if (ins->mOperandSize == 2) { - int src = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; + int src = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSIntConst[0])); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, src)); if (ainsl) { @@ -3442,7 +3442,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI mIns.Push(*ainsl); } - if (InterTypeSize[ins->mTType] > 1) + if (InterTypeSize[ins->mDst.mType] > 1) { if (reg == src) mIns.Push(NativeCodeInstruction(ASMIT_TAX, ASMIM_IMPLIED)); @@ -3461,9 +3461,9 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI } else if (ins->mOperandSize == 4) { - int src = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; + int src = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSIntConst[0])); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, src)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); @@ -3484,12 +3484,12 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI void NativeCodeBasicBlock::LoadValue(InterCodeProcedure* proc, const InterInstruction * ins) { - LoadValueToReg(proc, ins, BC_REG_TMP + proc->mTempOffset[ins->mTTemp], nullptr, nullptr); + LoadValueToReg(proc, ins, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp], nullptr, nullptr); } NativeCodeBasicBlock * NativeCodeBasicBlock::CopyValue(InterCodeProcedure* proc, const InterInstruction * ins, NativeCodeProcedure* nproc) { - int sreg = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]], dreg = BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]; + int sreg = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp], dreg = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; int size = ins->mOperandSize; if (size < 4) @@ -3584,9 +3584,9 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc LoadValueToReg(proc, sins, BC_REG_ACCU, nullptr, nullptr); else { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[index]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[index].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[index]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[index].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); } @@ -3636,6 +3636,37 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); ShiftRegisterLeft(proc, BC_REG_ACCU, lshift); return BC_REG_ACCU; +#if 0 + case 25: + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ASMIT_TAX, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ASMIT_TAY, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ASMIT_CLC, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ASMIT_TXA, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_TAX, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ASMIT_TYA, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_TXA, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_CLC, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + ShiftRegisterLeft(proc, BC_REG_ACCU, lshift); + return BC_REG_ACCU; +#endif default: mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, mul)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); @@ -3666,16 +3697,16 @@ static int Binlog(unsigned n) } NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* proc, NativeCodeProcedure* nproc, const InterInstruction * ins, const InterInstruction * sins1, const InterInstruction * sins0) { - int treg = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + int treg = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; - if (ins->mTType == IT_FLOAT) + if (ins->mDst.mType == IT_FLOAT) { - int sreg0 = ins->mSTemp[0] < 0 ? -1 : BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]; + int sreg0 = ins->mSrc[0].mTemp < 0 ? -1 : BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { union { float f; unsigned int v; } cc; - cc.f = ins->mSFloatConst[1]; + cc.f = ins->mSrc[1].mFloatConst; mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, cc.v & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); @@ -3690,29 +3721,29 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p { LoadValueToReg(proc, sins1, BC_REG_ACCU, nullptr, nullptr); } - else if (ins->mSFinal[1] && CheckPredAccuStore(BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])) + else if (ins->mSrc[1].mFinal && CheckPredAccuStore(BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])) { // cull previous store from accu to temp using direcrt forwarding mIns.SetSize(mIns.Size() - 8); - if (sreg0 == BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]) + if (sreg0 == BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]) sreg0 = BC_REG_ACCU; } else { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 0)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); } - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { union { float f; unsigned int v; } cc; - cc.f = ins->mSFloatConst[0]; + cc.f = ins->mSrc[0].mFloatConst; mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, cc.v & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); @@ -3771,15 +3802,15 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p } mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 3)); } - else if (ins->mTType == IT_INT32) + else if (ins->mDst.mType == IT_INT32) { switch (ins->mOperator) { @@ -3789,8 +3820,8 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p case IA_AND: case IA_XOR: { - if (sins1) LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]], nullptr, nullptr); - if (sins0) LoadValueToReg(proc, sins0, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]], nullptr, nullptr); + if (sins1) LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp], nullptr, nullptr); + if (sins0) LoadValueToReg(proc, sins0, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp], nullptr, nullptr); AsmInsType atype; switch (ins->mOperator) @@ -3816,14 +3847,14 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p for (int i = 0; i < 4; i++) { - if (ins->mSTemp[1] < 0) - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> (8 * i)) & 0xff)); + if (ins->mSrc[1].mTemp < 0) + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> (8 * i)) & 0xff)); else - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + i)); - if (ins->mSTemp[0] < 0) - mIns.Push(NativeCodeInstruction(atype, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> (8 * i)) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + i)); + if (ins->mSrc[0].mTemp < 0) + mIns.Push(NativeCodeInstruction(atype, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> (8 * i)) & 0xff)); else - mIns.Push(NativeCodeInstruction(atype, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + i)); + mIns.Push(NativeCodeInstruction(atype, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + i)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + i)); } } break; @@ -3836,51 +3867,51 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p { if (sins1) LoadValueToReg(proc, sins1, BC_REG_ACCU, nullptr, nullptr); - else if (ins->mSTemp[1] < 0) + else if (ins->mSrc[1].mTemp < 0) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[1] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 16) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 16) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 24) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 24) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); } else { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); } if (sins0) LoadValueToReg(proc, sins0, BC_REG_WORK, nullptr, nullptr); - else if (ins->mSTemp[0] < 0) + else if (ins->mSrc[0].mTemp < 0) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 16) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 16) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 24) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 24) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 3)); } else { - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 3)); } @@ -3929,40 +3960,40 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p } break; case IA_SHL: { - if (sins1) LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]], nullptr, nullptr); - if (sins0) LoadValueToReg(proc, sins0, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]], nullptr, nullptr); + if (sins1) LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp], nullptr, nullptr); + if (sins0) LoadValueToReg(proc, sins0, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp], nullptr, nullptr); - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - int shift = ins->mSIntConst[0] & 31; + int shift = ins->mSrc[0].mIntConst & 31; if (shift == 0) { - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 3)); } } else if (shift == 1) { - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 3)); } @@ -3979,15 +4010,15 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p NativeCodeBasicBlock* lblock = nproc->AllocateBlock(); NativeCodeBasicBlock* eblock = nproc->AllocateBlock(); - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 3)); } else mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, treg + 3)); @@ -4011,29 +4042,29 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p NativeCodeBasicBlock* lblock = nproc->AllocateBlock(); NativeCodeBasicBlock* eblock = nproc->AllocateBlock(); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_AND, ASMIM_IMMEDIATE, 0x1f)); mIns.Push(NativeCodeInstruction(ASMIT_TAX, ASMIM_IMPLIED)); - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[1] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 16) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 16) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 24) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 24) & 0xff)); } - else if (ins->mSTemp[1] != ins->mTTemp) + else if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 3)); } else { @@ -4057,40 +4088,40 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p case IA_SHR: { - if (sins1) LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]], nullptr, nullptr); - if (sins0) LoadValueToReg(proc, sins0, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]], nullptr, nullptr); + if (sins1) LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp], nullptr, nullptr); + if (sins0) LoadValueToReg(proc, sins0, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp], nullptr, nullptr); - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - int shift = ins->mSIntConst[0] & 31; + int shift = ins->mSrc[0].mIntConst & 31; if (shift == 0) { - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 3)); } } else if (shift == 1) { - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_LSR, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_ROR, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_ROR, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 0)); mIns.Push(NativeCodeInstruction(ASMIT_ROR, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 0)); } @@ -4107,15 +4138,15 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p NativeCodeBasicBlock* lblock = nproc->AllocateBlock(); NativeCodeBasicBlock* eblock = nproc->AllocateBlock(); - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 3)); } else mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, treg + 3)); @@ -4139,29 +4170,29 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p NativeCodeBasicBlock* lblock = nproc->AllocateBlock(); NativeCodeBasicBlock* eblock = nproc->AllocateBlock(); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_AND, ASMIM_IMMEDIATE, 0x1f)); mIns.Push(NativeCodeInstruction(ASMIT_TAX, ASMIM_IMPLIED)); - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[1] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 16) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 16) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 24) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 24) & 0xff)); } - else if (ins->mSTemp[1] != ins->mTTemp) + else if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 3)); } else { @@ -4185,41 +4216,41 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p case IA_SAR: { - if (sins1) LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]], nullptr, nullptr); - if (sins0) LoadValueToReg(proc, sins0, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]], nullptr, nullptr); + if (sins1) LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp], nullptr, nullptr); + if (sins0) LoadValueToReg(proc, sins0, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp], nullptr, nullptr); - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - int shift = ins->mSIntConst[0] & 31; + int shift = ins->mSrc[0].mIntConst & 31; if (shift == 0) { - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 3)); } } else if (shift == 1) { - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, 0x80)); mIns.Push(NativeCodeInstruction(ASMIT_ROR, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_ROR, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_ROR, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 0)); mIns.Push(NativeCodeInstruction(ASMIT_ROR, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 0)); } @@ -4238,15 +4269,15 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p NativeCodeBasicBlock* lblock = nproc->AllocateBlock(); NativeCodeBasicBlock* eblock = nproc->AllocateBlock(); - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 3)); } else mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, treg + 3)); @@ -4271,29 +4302,29 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p NativeCodeBasicBlock* lblock = nproc->AllocateBlock(); NativeCodeBasicBlock* eblock = nproc->AllocateBlock(); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_AND, ASMIM_IMMEDIATE, 0x1f)); mIns.Push(NativeCodeInstruction(ASMIT_TAX, ASMIM_IMPLIED)); - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[1] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 16) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 16) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 24) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 24) & 0xff)); } - else if (ins->mSTemp[1] != ins->mTTemp) + else if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 3)); } else { @@ -4327,19 +4358,19 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p case IA_XOR: { if (ins->mOperator == IA_ADD && ( - ins->mSTemp[0] < 0 && ins->mSIntConst[0] == 1 && !sins1 && ins->mSTemp[1] == ins->mTTemp || - ins->mSTemp[1] < 0 && ins->mSIntConst[1] == 1 && !sins0 && ins->mSTemp[0] == ins->mTTemp)) + ins->mSrc[0].mTemp < 0 && ins->mSrc[0].mIntConst == 1 && !sins1 && ins->mSrc[1].mTemp == ins->mDst.mTemp || + ins->mSrc[1].mTemp < 0 && ins->mSrc[1].mIntConst == 1 && !sins0 && ins->mSrc[0].mTemp == ins->mDst.mTemp)) { mIns.Push(NativeCodeInstruction(ASMIT_INC, ASMIM_ZERO_PAGE, treg)); - if (InterTypeSize[ins->mTType] > 1) + if (InterTypeSize[ins->mDst.mType] > 1) { mIns.Push(NativeCodeInstruction(ASMIT_BNE, ASMIM_RELATIVE, 2)); mIns.Push(NativeCodeInstruction(ASMIT_INC, ASMIM_ZERO_PAGE, treg + 1)); } } - else if (ins->mOperator == IA_ADD && InterTypeSize[ins->mTType] == 1 && ( - ins->mSTemp[0] < 0 && ins->mSIntConst[0] == -1 && !sins1 && ins->mSTemp[1] == ins->mTTemp || - ins->mSTemp[1] < 0 && ins->mSIntConst[1] == -1 && !sins0 && ins->mSTemp[0] == ins->mTTemp)) + else if (ins->mOperator == IA_ADD && InterTypeSize[ins->mDst.mType] == 1 && ( + ins->mSrc[0].mTemp < 0 && ins->mSrc[0].mIntConst == -1 && !sins1 && ins->mSrc[1].mTemp == ins->mDst.mTemp || + ins->mSrc[1].mTemp < 0 && ins->mSrc[1].mIntConst == -1 && !sins0 && ins->mSrc[0].mTemp == ins->mDst.mTemp)) { mIns.Push(NativeCodeInstruction(ASMIT_DEC, ASMIM_ZERO_PAGE, treg)); } @@ -4364,43 +4395,43 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p break; } - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - insl = NativeCodeInstruction(atype, ASMIM_IMMEDIATE, ins->mSIntConst[1] & 0xff); - insh = NativeCodeInstruction(atype, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 8) & 0xff); + insl = NativeCodeInstruction(atype, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst & 0xff); + insh = NativeCodeInstruction(atype, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 8) & 0xff); if (sins0) LoadValueToReg(proc, sins0, treg, &insl, &insh); else { if (ins->mOperator == IA_ADD) mIns.Push(NativeCodeInstruction(ASMIT_CLC, ASMIM_IMPLIED)); - 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->mSrc[0].mTemp])); mIns.Push(insl); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - if (InterTypeSize[ins->mTType] > 1) + if (InterTypeSize[ins->mDst.mType] > 1) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(insh); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); } } } - else if (ins->mSTemp[0] < 0) + else if (ins->mSrc[0].mTemp < 0) { - insl = NativeCodeInstruction(atype, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff); - insh = NativeCodeInstruction(atype, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff); + insl = NativeCodeInstruction(atype, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff); + insh = NativeCodeInstruction(atype, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff); if (sins1) LoadValueToReg(proc, sins1, treg, &insl, &insh); else { if (ins->mOperator == IA_ADD) mIns.Push(NativeCodeInstruction(ASMIT_CLC, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(insl); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - if (InterTypeSize[ins->mTType] > 1) + if (InterTypeSize[ins->mDst.mType] > 1) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(insh); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); } @@ -4413,7 +4444,7 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p insl = NativeCodeInstruction(atype, ASMIM_ZERO_PAGE, treg); insh = NativeCodeInstruction(atype, ASMIM_ZERO_PAGE, treg + 1); - if (sins1->mTTemp == ins->mTTemp) + if (sins1->mDst.mTemp == ins->mDst.mTemp) { LoadValueToReg(proc, sins1, treg, nullptr, nullptr); LoadValueToReg(proc, sins0, treg, &insl, &insh); @@ -4426,15 +4457,15 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p } else if (sins1) { - insl = NativeCodeInstruction(atype, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]); - insh = NativeCodeInstruction(atype, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1); + insl = NativeCodeInstruction(atype, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]); + insh = NativeCodeInstruction(atype, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1); LoadValueToReg(proc, sins1, treg, &insl, &insh); } else if (sins0) { - insl = NativeCodeInstruction(atype, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]]); - insh = NativeCodeInstruction(atype, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1); + insl = NativeCodeInstruction(atype, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]); + insh = NativeCodeInstruction(atype, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1); LoadValueToReg(proc, sins0, treg, &insl, &insh); } @@ -4442,13 +4473,13 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p { if (ins->mOperator == IA_ADD) mIns.Push(NativeCodeInstruction(ASMIT_CLC, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); - mIns.Push(NativeCodeInstruction(atype, 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->mSrc[1].mTemp])); + mIns.Push(NativeCodeInstruction(atype, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - if (InterTypeSize[ins->mTType] > 1) + if (InterTypeSize[ins->mDst.mType] > 1) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); - mIns.Push(NativeCodeInstruction(atype, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(atype, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); } } @@ -4459,44 +4490,44 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p { NativeCodeInstruction insl, insh; - if (InterTypeSize[ins->mTType] == 1 && - ins->mSTemp[1] < 0 && ins->mSIntConst[1] == 1 && !sins0 && ins->mSTemp[0] == ins->mTTemp) + if (InterTypeSize[ins->mDst.mType] == 1 && + ins->mSrc[1].mTemp < 0 && ins->mSrc[1].mIntConst == 1 && !sins0 && ins->mSrc[0].mTemp == ins->mDst.mTemp) { mIns.Push(NativeCodeInstruction(ASMIT_DEC, ASMIM_ZERO_PAGE, treg)); } - else if (ins->mSTemp[0] < 0) + else if (ins->mSrc[0].mTemp < 0) { - insl = NativeCodeInstruction(ASMIT_SBC, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff); - insh = NativeCodeInstruction(ASMIT_SBC, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff); + insl = NativeCodeInstruction(ASMIT_SBC, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff); + insh = NativeCodeInstruction(ASMIT_SBC, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff); if (sins1) LoadValueToReg(proc, sins1, treg, &insl, &insh); else { mIns.Push(NativeCodeInstruction(ASMIT_SEC, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(insl); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - if (InterTypeSize[ins->mTType] > 1) + if (InterTypeSize[ins->mDst.mType] > 1) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(insh); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); } } } - else if (ins->mSTemp[1] < 0) + else if (ins->mSrc[1].mTemp < 0) { if (sins0) { LoadValueToReg(proc, sins0, treg, nullptr, nullptr); mIns.Push(NativeCodeInstruction(ASMIT_SEC, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[1] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, treg)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - if (InterTypeSize[ins->mTType] > 1) + if (InterTypeSize[ins->mDst.mType] > 1) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, treg + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); } @@ -4504,13 +4535,13 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p else { mIns.Push(NativeCodeInstruction(ASMIT_SEC, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[1] & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - if (InterTypeSize[ins->mTType] > 1) + if (InterTypeSize[ins->mDst.mType] > 1) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); } } @@ -4526,8 +4557,8 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p } else { - insl = NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]); - insh = NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1); + insl = NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]); + insh = NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1); } if (sins1) @@ -4537,12 +4568,12 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p else { mIns.Push(NativeCodeInstruction(ASMIT_SEC, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(insl); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - if (InterTypeSize[ins->mTType] > 1) + if (InterTypeSize[ins->mDst.mType] > 1) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(insh); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); } @@ -4557,47 +4588,47 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p { int reg = BC_REG_ACCU; - if (ins->mOperator == IA_MUL && ins->mSTemp[1] < 0 && (ins->mSIntConst[1] & ~0xff) == 0) + if (ins->mOperator == IA_MUL && ins->mSrc[1].mTemp < 0 && (ins->mSrc[1].mIntConst & ~0xff) == 0) { - reg = ShortMultiply(proc, nproc, ins, sins0, 0, ins->mSIntConst[1] & 0xff); + reg = ShortMultiply(proc, nproc, ins, sins0, 0, ins->mSrc[1].mIntConst & 0xff); } - else if (ins->mOperator == IA_MUL && ins->mSTemp[0] < 0 && (ins->mSIntConst[0] & ~0xff) == 0) + else if (ins->mOperator == IA_MUL && ins->mSrc[0].mTemp < 0 && (ins->mSrc[0].mIntConst & ~0xff) == 0) { - reg = ShortMultiply(proc, nproc, ins, sins1, 1, ins->mSIntConst[0] & 0xff); + reg = ShortMultiply(proc, nproc, ins, sins1, 1, ins->mSrc[0].mIntConst & 0xff); } else { if (sins1) LoadValueToReg(proc, sins1, BC_REG_ACCU, nullptr, nullptr); - else if (ins->mSTemp[1] < 0) + else if (ins->mSrc[1].mTemp < 0) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[1] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); } else { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); } if (sins0) LoadValueToReg(proc, sins0, BC_REG_WORK, nullptr, nullptr); - else if (ins->mSTemp[0] < 0) + else if (ins->mSrc[0].mTemp < 0) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 1)); } else { - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 1)); } @@ -4635,43 +4666,43 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p } mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, reg + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, reg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); } break; case IA_SHL: { - if (ins->mSTemp[0] < 0 && (ins->mSIntConst[0] & 15) == 1 && sins1) + if (ins->mSrc[0].mTemp < 0 && (ins->mSrc[0].mIntConst & 15) == 1 && sins1) { NativeCodeInstruction insl(ASMIT_ASL, ASMIM_IMPLIED); NativeCodeInstruction insh(ASMIT_ROL, ASMIM_IMPLIED); LoadValueToReg(proc, sins1, treg, &insl, &insh); return this; } - if (sins1) LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]], nullptr, nullptr); - if (sins0) LoadValueToReg(proc, sins0, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]], nullptr, nullptr); + if (sins1) LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp], nullptr, nullptr); + if (sins0) LoadValueToReg(proc, sins0, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp], nullptr, nullptr); - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - int shift = ins->mSIntConst[0] & 15; + int shift = ins->mSrc[0].mIntConst & 15; if (shift == 0) { - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); } } else if (shift == 1) { - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); } @@ -4683,7 +4714,7 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p } else if (shift >= 8) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); for (int i = 8; i < shift; i++) mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); @@ -4692,12 +4723,12 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p } else { - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); } else { @@ -4713,11 +4744,11 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); } } - else if (ins->mSTemp[1] < 0 && IsPowerOf2(ins->mSIntConst[1] & 0xffff)) + else if (ins->mSrc[1].mTemp < 0 && IsPowerOf2(ins->mSrc[1].mIntConst & 0xffff)) { - int l = Binlog(ins->mSIntConst[1] & 0xffff); + int l = Binlog(ins->mSrc[1].mIntConst & 0xffff); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_AND, ASMIM_IMMEDIATE, 0x0f)); mIns.Push(NativeCodeInstruction(ASMIT_TAX, ASMIM_IMPLIED)); @@ -4733,21 +4764,21 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p } else { - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_AND, ASMIM_IMMEDIATE, 0x0f)); mIns.Push(NativeCodeInstruction(ASMIT_TAX, ASMIM_IMPLIED)); - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[1] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 8) & 0xff)); } - else if (ins->mSTemp[1] != ins->mTTemp) + else if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); } else { @@ -4767,30 +4798,30 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p } break; case IA_SHR: { - if (sins1) LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]], nullptr, nullptr); - if (sins0) LoadValueToReg(proc, sins0, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]], nullptr, nullptr); + if (sins1) LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp], nullptr, nullptr); + if (sins0) LoadValueToReg(proc, sins0, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp], nullptr, nullptr); - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - int shift = ins->mSIntConst[0] & 15; + int shift = ins->mSrc[0].mIntConst & 15; if (shift == 0) { - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); } } else if (shift == 1) { - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_LSR, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_ROR, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); } @@ -4802,7 +4833,7 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p } else if (shift >= 8) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); for (int i = 8; i < shift; i++) mIns.Push(NativeCodeInstruction(ASMIT_LSR, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); @@ -4811,12 +4842,12 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p } else { - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_LSR, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); } else { @@ -4832,11 +4863,11 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg )); } } - else if (ins->mSTemp[1] < 0 && IsPowerOf2(ins->mSIntConst[1] & 0xffff)) + else if (ins->mSrc[1].mTemp < 0 && IsPowerOf2(ins->mSrc[1].mIntConst & 0xffff)) { - int l = Binlog(ins->mSIntConst[1] & 0xffff); + int l = Binlog(ins->mSrc[1].mIntConst & 0xffff); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_AND, ASMIM_IMMEDIATE, 0x0f)); mIns.Push(NativeCodeInstruction(ASMIT_TAX, ASMIM_IMPLIED)); @@ -4849,21 +4880,21 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p } else { - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_AND, ASMIM_IMMEDIATE, 0x0f)); mIns.Push(NativeCodeInstruction(ASMIT_TAX, ASMIM_IMPLIED)); - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[1] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 8) & 0xff)); } - else if (ins->mSTemp[1] != ins->mTTemp) + else if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); } else { @@ -4883,25 +4914,25 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p } break; case IA_SAR: { - if (sins1) LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]], nullptr, nullptr); - if (sins0) LoadValueToReg(proc, sins0, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]], nullptr, nullptr); + if (sins1) LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp], nullptr, nullptr); + if (sins0) LoadValueToReg(proc, sins0, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp], nullptr, nullptr); - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - int shift = ins->mSIntConst[0] & 15; + int shift = ins->mSrc[0].mIntConst & 15; if (shift == 0) { - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); } } else if (shift >= 8) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); for (int i = 8; i < shift; i++) mIns.Push(NativeCodeInstruction(ASMIT_LSR, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_IMMEDIATE, 0x80 >> (shift - 8))); @@ -4913,11 +4944,11 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p } else { - if (ins->mSTemp[1] != ins->mTTemp) + if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); } else { @@ -4934,11 +4965,11 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); } } - else if (ins->mSTemp[1] < 0 && IsPowerOf2(ins->mSIntConst[1] & 0xffff)) + else if (ins->mSrc[1].mTemp < 0 && IsPowerOf2(ins->mSrc[1].mIntConst & 0xffff)) { - int l = Binlog(ins->mSIntConst[1] & 0xffff); + int l = Binlog(ins->mSrc[1].mIntConst & 0xffff); - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_AND, ASMIM_IMMEDIATE, 0x0f)); mIns.Push(NativeCodeInstruction(ASMIT_TAX, ASMIM_IMPLIED)); @@ -4964,21 +4995,21 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p } else { - 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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_AND, ASMIM_IMMEDIATE, 0x0f)); mIns.Push(NativeCodeInstruction(ASMIT_TAX, ASMIM_IMPLIED)); - if (ins->mSTemp[1] < 0) + if (ins->mSrc[1].mTemp < 0) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[1] & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 8) & 0xff)); } - else if (ins->mSTemp[1] != ins->mTTemp) + else if (ins->mSrc[1].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); } else { @@ -5006,43 +5037,43 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p void NativeCodeBasicBlock::UnaryOperator(InterCodeProcedure* proc, NativeCodeProcedure* nproc, const InterInstruction * ins) { - int treg = BC_REG_TMP + proc->mTempOffset[ins->mTTemp]; + int treg = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; - if (ins->mTType == IT_FLOAT) + if (ins->mDst.mType == IT_FLOAT) { switch (ins->mOperator) { case IA_NEG: case IA_ABS: - if (ins->mSTemp[0] != ins->mTTemp) + if (ins->mSrc[0].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 3)); } else - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 3)); if (ins->mOperator == IA_NEG) mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_IMMEDIATE, 0x80)); else mIns.Push(NativeCodeInstruction(ASMIT_AND, ASMIM_IMMEDIATE, 0x7f)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 3)); break; case IA_FLOOR: case IA_CEIL: - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 0)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); NativeCodeGenerator::Runtime& frx(nproc->mGenerator->ResolveRuntime(Ident::Unique("fsplita"))); @@ -5060,13 +5091,13 @@ void NativeCodeBasicBlock::UnaryOperator(InterCodeProcedure* proc, NativeCodePro } mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 3)); break; } } @@ -5077,36 +5108,36 @@ void NativeCodeBasicBlock::UnaryOperator(InterCodeProcedure* proc, NativeCodePro case IA_NEG: mIns.Push(NativeCodeInstruction(ASMIT_SEC, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); - mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); + mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); - mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - if (ins->mTType == IT_INT32) + if (ins->mDst.mType == IT_INT32) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); - mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); - mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 3)); } break; case IA_NOT: mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); + mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1)); - if (ins->mTType == IT_INT32) + if (ins->mDst.mType == IT_INT32) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 2)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, treg + 3)); } break; @@ -5120,90 +5151,90 @@ void NativeCodeBasicBlock::NumericConversion(InterCodeProcedure* proc, NativeCod { case IA_FLOAT2INT: { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 0)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); NativeCodeGenerator::Runtime& frt(nproc->mGenerator->ResolveRuntime(Ident::Unique("ftoi"))); mIns.Push(NativeCodeInstruction(ASMIT_JSR, ASMIM_ABSOLUTE, frt.mOffset, frt.mLinkerObject, NCIF_RUNTIME)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); } break; case IA_INT2FLOAT: { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 0)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); NativeCodeGenerator::Runtime& frt(nproc->mGenerator->ResolveRuntime(Ident::Unique("ffromi"))); mIns.Push(NativeCodeInstruction(ASMIT_JSR, ASMIM_ABSOLUTE, frt.mOffset, frt.mLinkerObject, NCIF_RUNTIME)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 3)); } break; case IA_EXT8TO16S: - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); - if (ins->mSTemp[0] != ins->mTTemp) - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + if (ins->mSrc[0].mTemp != ins->mDst.mTemp) + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0x00)); mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_IMMEDIATE, 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_IMMEDIATE, 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); break; case IA_EXT8TO16U: - if (ins->mSTemp[0] != ins->mTTemp) + if (ins->mSrc[0].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp])); } mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); break; case IA_EXT16TO32S: - if (ins->mSTemp[0] != ins->mTTemp) + if (ins->mSrc[0].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp])); } - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - if (ins->mSTemp[0] != ins->mTTemp) - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + if (ins->mSrc[0].mTemp != ins->mDst.mTemp) + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0x00)); mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_IMMEDIATE, 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_IMMEDIATE, 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 3)); break; case IA_EXT16TO32U: - if (ins->mSTemp[0] != ins->mTTemp) + if (ins->mSrc[0].mTemp != ins->mDst.mTemp) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp])); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); } mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 3)); break; } } @@ -5212,7 +5243,7 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In { InterOperator op = ins->mOperator; - if (ins->mSType[0] == IT_FLOAT) + if (ins->mSrc[0].mType == IT_FLOAT) { int li = 0, ri = 1; if (op == IA_CMPLEU || op == IA_CMPGU || op == IA_CMPLES || op == IA_CMPGS) @@ -5220,10 +5251,10 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In li = 1; ri = 0; } - if (ins->mSTemp[li] < 0) + if (ins->mSrc[li].mTemp < 0) { union { float f; unsigned int v; } cc; - cc.f = ins->mSFloatConst[li]; + cc.f = ins->mSrc[li].mFloatConst; mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, cc.v & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); @@ -5234,27 +5265,27 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (cc.v >> 24) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); } - else if (ins->mSFinal[li] && CheckPredAccuStore(BC_REG_TMP + proc->mTempOffset[ins->mSTemp[li]])) + else if (ins->mSrc[li].mFinal && CheckPredAccuStore(BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp])) { // cull previous store from accu to temp using direcrt forwarding mIns.SetSize(mIns.Size() - 8); } else { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[li]] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 0)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[li]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[li]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[li]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); } - if (ins->mSTemp[ri] < 0) + if (ins->mSrc[ri].mTemp < 0) { union { float f; unsigned int v; } cc; - cc.f = ins->mSFloatConst[ri]; + cc.f = ins->mSrc[ri].mFloatConst; mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, cc.v & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); @@ -5267,13 +5298,13 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In } else { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[ri]] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 0)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[ri]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[ri]] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[ri]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 3)); } @@ -5302,7 +5333,7 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In break; } } - else if (ins->mSType[0] == IT_INT32) + else if (ins->mSrc[0].mType == IT_INT32) { int li = 1, ri = 0; if (op == IA_CMPLEU || op == IA_CMPGU || op == IA_CMPLES || op == IA_CMPGS) @@ -5312,36 +5343,36 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In if (op >= IA_CMPGES && ins->mOperator <= IA_CMPLS) { - if (ins->mSTemp[ri] >= 0) + if (ins->mSrc[ri].mTemp >= 0) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[ri]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_IMMEDIATE, 0x80)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK)); } - if (ins->mSTemp[li] < 0) - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ((ins->mSIntConst[li] >> 24) & 0xff) ^ 0x80)); + if (ins->mSrc[li].mTemp < 0) + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ((ins->mSrc[li].mIntConst >> 24) & 0xff) ^ 0x80)); else { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[li]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 3)); mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_IMMEDIATE, 0x80)); } - if (ins->mSTemp[ri] < 0) - mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, ((ins->mSIntConst[ri] >> 24) & 0xff) ^ 0x80)); + if (ins->mSrc[ri].mTemp < 0) + mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, ((ins->mSrc[ri].mIntConst >> 24) & 0xff) ^ 0x80)); else mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_WORK)); } else { - if (ins->mSTemp[li] < 0) - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[li] >> 24) & 0xff)); + if (ins->mSrc[li].mTemp < 0) + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[li].mIntConst >> 24) & 0xff)); else - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[li]] + 3)); - if (ins->mSTemp[ri] < 0) - mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, (ins->mSIntConst[ri] >> 24) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 3)); + if (ins->mSrc[ri].mTemp < 0) + mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, (ins->mSrc[ri].mIntConst >> 24) & 0xff)); else - mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[ri]] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 3)); } NativeCodeBasicBlock* eblock3 = nproc->AllocateBlock(); @@ -5351,36 +5382,36 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In this->Close(nblock, eblock3, ASMIT_BNE); - if (ins->mSTemp[li] < 0) - eblock3->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[li] >> 16) & 0xff)); + if (ins->mSrc[li].mTemp < 0) + eblock3->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[li].mIntConst >> 16) & 0xff)); else - eblock3->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[li]] + 2)); - if (ins->mSTemp[ri] < 0) - eblock3->mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, (ins->mSIntConst[ri] >> 16) & 0xff)); + eblock3->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 2)); + if (ins->mSrc[ri].mTemp < 0) + eblock3->mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, (ins->mSrc[ri].mIntConst >> 16) & 0xff)); else - eblock3->mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[ri]] + 2)); + eblock3->mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 2)); eblock3->Close(nblock, eblock2, ASMIT_BNE); - if (ins->mSTemp[li] < 0) - eblock2->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[li] >> 8) & 0xff)); + if (ins->mSrc[li].mTemp < 0) + eblock2->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[li].mIntConst >> 8) & 0xff)); else - eblock2->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[li]] + 1)); - if (ins->mSTemp[ri] < 0) - eblock2->mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, (ins->mSIntConst[ri] >> 8) & 0xff)); + eblock2->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 1)); + if (ins->mSrc[ri].mTemp < 0) + eblock2->mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, (ins->mSrc[ri].mIntConst >> 8) & 0xff)); else - eblock2->mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[ri]] + 1)); + eblock2->mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 1)); eblock2->Close(nblock, eblock1, ASMIT_BNE); - if (ins->mSTemp[li] < 0) - eblock1->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[li] & 0xff)); + if (ins->mSrc[li].mTemp < 0) + eblock1->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[li].mIntConst & 0xff)); else - eblock1->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[li]])); - if (ins->mSTemp[ri] < 0) - eblock1->mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, ins->mSIntConst[ri] & 0xff)); + eblock1->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp])); + if (ins->mSrc[ri].mTemp < 0) + eblock1->mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, ins->mSrc[ri].mIntConst & 0xff)); else - eblock1->mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[ri]])); + eblock1->mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp])); switch (op) { @@ -5409,12 +5440,12 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In } } - else if (ins->mSTemp[1] < 0 && ins->mSIntConst[1] == 0 || ins->mSTemp[0] < 0 && ins->mSIntConst[0] == 0) + else if (ins->mSrc[1].mTemp < 0 && ins->mSrc[1].mIntConst == 0 || ins->mSrc[0].mTemp < 0 && ins->mSrc[0].mIntConst == 0) { - int rt = ins->mSTemp[1]; + int rt = ins->mSrc[1].mTemp; if (rt < 0) { - rt = ins->mSTemp[0]; + rt = ins->mSrc[0].mTemp; switch (op) { case IA_CMPLEU: @@ -5494,14 +5525,14 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In } } #if 1 - else if (ins->mSTemp[1] < 0 && ins->mSIntConst[1] < 256 && ins->mSIntConst[1] > 0 || ins->mSTemp[0] < 0 && ins->mSIntConst[0] < 256 && ins->mSIntConst[0] > 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) { - int rt = ins->mSTemp[1]; - int ival = ins->mSIntConst[0]; + int rt = ins->mSrc[1].mTemp; + int ival = ins->mSrc[0].mIntConst; if (rt < 0) { - rt = ins->mSTemp[0]; - ival = ins->mSIntConst[1]; + rt = ins->mSrc[0].mTemp; + ival = ins->mSrc[1].mIntConst; switch (op) { case IA_CMPLEU: @@ -5669,25 +5700,25 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In int iconst = 0; bool rconst = false; - if (ins->mSTemp[li] < 0 && (op == IA_CMPGES || op == IA_CMPLS) && int16(ins->mSIntConst[li]) > - 32768) + if (ins->mSrc[li].mTemp < 0 && (op == IA_CMPGES || op == IA_CMPLS) && int16(ins->mSrc[li].mIntConst) > - 32768) { - iconst = ins->mSIntConst[li] - 1; + iconst = ins->mSrc[li].mIntConst - 1; rconst = true; li = ri; ri = 1 - li; NativeCodeBasicBlock* t = trueJump; trueJump = falseJump; falseJump = t; } - else if (ins->mSTemp[li] < 0 && (op == IA_CMPLES || op == IA_CMPGS) && int16(ins->mSIntConst[li]) < 32767) + else if (ins->mSrc[li].mTemp < 0 && (op == IA_CMPLES || op == IA_CMPGS) && int16(ins->mSrc[li].mIntConst) < 32767) { - iconst = ins->mSIntConst[li] + 1; + iconst = ins->mSrc[li].mIntConst + 1; rconst = true; li = ri; ri = 1 - li; NativeCodeBasicBlock* t = trueJump; trueJump = falseJump; falseJump = t; } - else if (ins->mSTemp[ri] < 0) + else if (ins->mSrc[ri].mTemp < 0) { - iconst = ins->mSIntConst[ri]; + iconst = ins->mSrc[ri].mIntConst; rconst = true; } @@ -5695,16 +5726,16 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In { if (!rconst) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[ri]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_IMMEDIATE, 0x80)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK)); } - if (ins->mSTemp[li] < 0) - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ((ins->mSIntConst[li] >> 8) & 0xff) ^ 0x80)); + if (ins->mSrc[li].mTemp < 0) + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ((ins->mSrc[li].mIntConst >> 8) & 0xff) ^ 0x80)); else { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[li]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_IMMEDIATE, 0x80)); } @@ -5715,26 +5746,26 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In } else { - if (ins->mSTemp[li] < 0) - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[li] >> 8) & 0xff)); + if (ins->mSrc[li].mTemp < 0) + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[li].mIntConst >> 8) & 0xff)); else - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[li]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp] + 1)); if (rconst) mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, (iconst >> 8) & 0xff)); else - mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[ri]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp] + 1)); } this->Close(nblock, eblock, ASMIT_BNE); - if (ins->mSTemp[li] < 0) - eblock->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[li] & 0xff)); + if (ins->mSrc[li].mTemp < 0) + eblock->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[li].mIntConst & 0xff)); else - eblock->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[li]])); + eblock->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp])); if (rconst) eblock->mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, iconst & 0xff)); else - eblock->mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[ri]])); + eblock->mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp])); switch (op) { @@ -5769,94 +5800,94 @@ void NativeCodeBasicBlock::LoadEffectiveAddress(InterCodeProcedure* proc, const { if (sins1) { - if (ins->mSTemp[0] < 0 && ins->mSIntConst[0] == 0) - LoadValueToReg(proc, sins1, ins->mTTemp, nullptr, nullptr); + if (ins->mSrc[0].mTemp < 0 && ins->mSrc[0].mIntConst == 0) + LoadValueToReg(proc, sins1, ins->mDst.mTemp, nullptr, nullptr); else { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - NativeCodeInstruction ainsl(ASMIT_ADC, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff); - NativeCodeInstruction ainsh(ASMIT_ADC, ASMIM_IMMEDIATE, (ins->mSIntConst[1] >> 8) & 0xff); + NativeCodeInstruction ainsl(ASMIT_ADC, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff); + NativeCodeInstruction ainsh(ASMIT_ADC, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 8) & 0xff); - LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mTTemp], &ainsl, &ainsh); + LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp], &ainsl, &ainsh); } else { - NativeCodeInstruction ainsl(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]]); - NativeCodeInstruction ainsh(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1); + NativeCodeInstruction ainsl(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]); + NativeCodeInstruction ainsh(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1); - LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mTTemp], &ainsl, &ainsh); + LoadValueToReg(proc, sins1, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp], &ainsl, &ainsh); } } } - else if (ins->mSTemp[1] < 0) + else if (ins->mSrc[1].mTemp < 0) { mIns.Push(NativeCodeInstruction(ASMIT_CLC, ASMIM_IMPLIED)); if (ins->mMemory == IM_GLOBAL) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mIntValue, ins->mLinkerObject, NCIF_LOWER)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mIntValue, ins->mLinkerObject, NCIF_UPPER)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); } else if (ins->mMemory == IM_ABSOLUTE) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mIntValue & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mIntValue >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); } else if (ins->mMemory == IM_PROCEDURE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSIntConst[0], ins->mLinkerObject, NCIF_LOWER)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp])); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSIntConst[0], ins->mLinkerObject, NCIF_UPPER)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mLinkerObject, NCIF_LOWER)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mLinkerObject, NCIF_UPPER)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); } } else { - if (ins->mSTemp[0] >= 0 || ins->mSIntConst[0] != 0) + if (ins->mSrc[0].mTemp >= 0 || ins->mSrc[0].mIntConst != 0) mIns.Push(NativeCodeInstruction(ASMIT_CLC, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]])); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp])); - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - if (ins->mSIntConst[0]) - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); + if (ins->mSrc[0].mIntConst) + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); } else - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]])); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp])); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[1]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1)); - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - if (ins->mSIntConst[0]) - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); + if (ins->mSrc[0].mIntConst) + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); } else - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); } } void NativeCodeBasicBlock::CallFunction(InterCodeProcedure* proc, NativeCodeProcedure * nproc, const InterInstruction * ins) { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - NativeCodeInstruction lins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSIntConst[0], ins->mLinkerObject, NCIF_LOWER); - NativeCodeInstruction hins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSIntConst[0], ins->mLinkerObject, NCIF_UPPER); + NativeCodeInstruction lins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mLinkerObject, NCIF_LOWER); + NativeCodeInstruction hins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mLinkerObject, NCIF_UPPER); mIns.Push(lins); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU)); @@ -5865,43 +5896,43 @@ void NativeCodeBasicBlock::CallFunction(InterCodeProcedure* proc, NativeCodeProc } else { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 0)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSTemp[0]] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); } NativeCodeGenerator::Runtime& frt(nproc->mGenerator->ResolveRuntime(Ident::Unique("bcexec"))); mIns.Push(NativeCodeInstruction(ASMIT_JSR, ASMIM_ABSOLUTE, frt.mOffset, frt.mLinkerObject, NCIF_RUNTIME)); - if (ins->mTTemp >= 0) + if (ins->mDst.mTemp >= 0) { - if (ins->mTType == IT_FLOAT) + if (ins->mDst.mType == IT_FLOAT) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 3)); } else { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 0)); - if (InterTypeSize[ins->mTType] > 1) + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 0)); + if (InterTypeSize[ins->mDst.mType] > 1) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); } - if (InterTypeSize[ins->mTType] > 2) + if (InterTypeSize[ins->mDst.mType] > 2) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 3)); } } } @@ -5913,36 +5944,36 @@ void NativeCodeBasicBlock::CallAssembler(InterCodeProcedure* proc, const InterIn ins->mLinkerObject->mFlags |= LOBJF_NO_FRAME; assert(ins->mLinkerObject); - mIns.Push(NativeCodeInstruction(ASMIT_JSR, ASMIM_ABSOLUTE, ins->mSIntConst[0], ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_JSR, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mLinkerObject)); - if (ins->mTTemp >= 0) + if (ins->mDst.mTemp >= 0) { - if (ins->mTType == IT_FLOAT) + if (ins->mDst.mType == IT_FLOAT) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 3)); } else { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 0)); - if (InterTypeSize[ins->mTType] > 1) + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 0)); + if (InterTypeSize[ins->mDst.mType] > 1) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1)); } - if (InterTypeSize[ins->mTType] > 2) + if (InterTypeSize[ins->mDst.mType] > 2) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 2)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mTTemp] + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 3)); } } } @@ -7994,8 +8025,8 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode case IC_LOAD: if (i + 1 < iblock->mInstructions.Size() && iblock->mInstructions[i + 1]->mCode == IC_STORE && - iblock->mInstructions[i + 1]->mSTemp[0] == ins->mTTemp && - iblock->mInstructions[i + 1]->mSFinal[0] && + iblock->mInstructions[i + 1]->mSrc[0].mTemp == ins->mDst.mTemp && + iblock->mInstructions[i + 1]->mSrc[0].mFinal && iblock->mInstructions[i + 1]->mOperandSize == 1) { block->LoadStoreValue(iproc, ins, iblock->mInstructions[i + 1]); @@ -8003,38 +8034,38 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode } else if (i + 1 < iblock->mInstructions.Size() && iblock->mInstructions[i + 1]->mCode == IC_STORE && - iblock->mInstructions[i + 1]->mSTemp[0] == ins->mTTemp && - iblock->mInstructions[i + 1]->mSFinal[0] && + iblock->mInstructions[i + 1]->mSrc[0].mTemp == ins->mDst.mTemp && + iblock->mInstructions[i + 1]->mSrc[0].mFinal && ins->mMemory == IM_INDIRECT && iblock->mInstructions[i + 1]->mMemory == IM_INDIRECT && - ins->mSIntConst[0] == 0 && iblock->mInstructions[i + 1]->mSIntConst[1] == 0) + ins->mSrc[0].mIntConst == 0 && iblock->mInstructions[i + 1]->mSrc[1].mIntConst == 0) { block->LoadStoreIndirectValue(iproc, ins, iblock->mInstructions[i + 1]); i++; } else if (i + 2 < iblock->mInstructions.Size() && - (ins->mTType == IT_INT8 || ins->mTType == IT_INT16 || ins->mTType == IT_INT32) && + (ins->mDst.mType == IT_INT8 || ins->mDst.mType == IT_INT16 || ins->mDst.mType == IT_INT32) && iblock->mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && (iblock->mInstructions[i + 1]->mOperator == IA_ADD || iblock->mInstructions[i + 1]->mOperator == IA_SUB || iblock->mInstructions[i + 1]->mOperator == IA_AND || iblock->mInstructions[i + 1]->mOperator == IA_OR || iblock->mInstructions[i + 1]->mOperator == IA_XOR) && - iblock->mInstructions[i + 1]->mSTemp[0] == ins->mTTemp && iblock->mInstructions[i + 1]->mSFinal[0] && + iblock->mInstructions[i + 1]->mSrc[0].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[0].mFinal && iblock->mInstructions[i + 2]->mCode == IC_STORE && - iblock->mInstructions[i + 2]->mSTemp[0] == iblock->mInstructions[i + 1]->mTTemp && iblock->mInstructions[i + 2]->mSFinal[0] && + iblock->mInstructions[i + 2]->mSrc[0].mTemp == iblock->mInstructions[i + 1]->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[0].mFinal && ins->mMemory == IM_INDIRECT && iblock->mInstructions[i + 2]->mMemory == IM_INDIRECT && - ins->mSIntConst[0] == 0 && iblock->mInstructions[i + 2]->mSIntConst[1] == 0) + ins->mSrc[0].mIntConst == 0 && iblock->mInstructions[i + 2]->mSrc[1].mIntConst == 0) { block->LoadOpStoreIndirectValue(iproc, ins, iblock->mInstructions[i + 1], 1, iblock->mInstructions[i + 2]); i += 2; } else if (i + 2 < iblock->mInstructions.Size() && - (ins->mTType == IT_INT8 || ins->mTType == IT_INT16 || ins->mTType == IT_INT32) && + (ins->mDst.mType == IT_INT8 || ins->mDst.mType == IT_INT16 || ins->mDst.mType == IT_INT32) && iblock->mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && (iblock->mInstructions[i + 1]->mOperator == IA_ADD || iblock->mInstructions[i + 1]->mOperator == IA_SUB || iblock->mInstructions[i + 1]->mOperator == IA_AND || iblock->mInstructions[i + 1]->mOperator == IA_OR || iblock->mInstructions[i + 1]->mOperator == IA_XOR) && - iblock->mInstructions[i + 1]->mSTemp[1] == ins->mTTemp && iblock->mInstructions[i + 1]->mSFinal[1] && + iblock->mInstructions[i + 1]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[1].mFinal && iblock->mInstructions[i + 2]->mCode == IC_STORE && - iblock->mInstructions[i + 2]->mSTemp[0] == iblock->mInstructions[i + 1]->mTTemp && iblock->mInstructions[i + 2]->mSFinal[0] && + iblock->mInstructions[i + 2]->mSrc[0].mTemp == iblock->mInstructions[i + 1]->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[0].mFinal && ins->mMemory == IM_INDIRECT && iblock->mInstructions[i + 2]->mMemory == IM_INDIRECT && - ins->mSIntConst[0] == 0 && iblock->mInstructions[i + 2]->mSIntConst[1] == 0) + ins->mSrc[0].mIntConst == 0 && iblock->mInstructions[i + 2]->mSrc[1].mIntConst == 0) { block->LoadOpStoreIndirectValue(iproc, ins, iblock->mInstructions[i + 1], 0, iblock->mInstructions[i + 2]); i += 2; @@ -8042,7 +8073,7 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode else if (i + 1 < iblock->mInstructions.Size() && ins->mOperandSize >= 2 && iblock->mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && - iblock->mInstructions[i + 1]->mSTemp[0] == ins->mTTemp && iblock->mInstructions[i + 1]->mSFinal[0]) + iblock->mInstructions[i + 1]->mSrc[0].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[0].mFinal) { block = block->BinaryOperator(iproc, this, iblock->mInstructions[i + 1], nullptr, ins); i++; @@ -8050,7 +8081,7 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode else if (i + 1 < iblock->mInstructions.Size() && ins->mOperandSize >= 2 && iblock->mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && - iblock->mInstructions[i + 1]->mSTemp[1] == ins->mTTemp && iblock->mInstructions[i + 1]->mSFinal[1]) + iblock->mInstructions[i + 1]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[1].mFinal) { block = block->BinaryOperator(iproc, this, iblock->mInstructions[i + 1], ins, nullptr); i++; @@ -8058,10 +8089,10 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode else if (i + 2 < iblock->mInstructions.Size() && ins->mOperandSize >= 2 && iblock->mInstructions[i + 1]->mCode == IC_LOAD && iblock->mInstructions[i + 1]->mOperandSize == 2 && - iblock->mInstructions[i + 1]->mTTemp != ins->mTTemp && + iblock->mInstructions[i + 1]->mDst.mTemp != ins->mDst.mTemp && iblock->mInstructions[i + 2]->mCode == IC_BINARY_OPERATOR && - iblock->mInstructions[i + 2]->mSTemp[0] == iblock->mInstructions[i + 1]->mTTemp && iblock->mInstructions[i + 2]->mSFinal[0] && - iblock->mInstructions[i + 2]->mSTemp[1] == ins->mTTemp && iblock->mInstructions[i + 2]->mSFinal[1]) + iblock->mInstructions[i + 2]->mSrc[0].mTemp == iblock->mInstructions[i + 1]->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[0].mFinal && + iblock->mInstructions[i + 2]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[1].mFinal) { block = block->BinaryOperator(iproc, this, iblock->mInstructions[i + 2], ins, iblock->mInstructions[i + 1]); i += 2; @@ -8069,10 +8100,10 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode else if (i + 2 < iblock->mInstructions.Size() && ins->mOperandSize >= 2 && iblock->mInstructions[i + 1]->mCode == IC_LOAD && iblock->mInstructions[i + 1]->mOperandSize == 2 && - iblock->mInstructions[i + 1]->mTTemp != ins->mTTemp && + iblock->mInstructions[i + 1]->mDst.mTemp != ins->mDst.mTemp && iblock->mInstructions[i + 2]->mCode == IC_BINARY_OPERATOR && - iblock->mInstructions[i + 2]->mSTemp[1] == iblock->mInstructions[i + 1]->mTTemp && iblock->mInstructions[i + 2]->mSFinal[1] && - iblock->mInstructions[i + 2]->mSTemp[0] == ins->mTTemp && iblock->mInstructions[i + 2]->mSFinal[0]) + iblock->mInstructions[i + 2]->mSrc[1].mTemp == iblock->mInstructions[i + 1]->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[1].mFinal && + iblock->mInstructions[i + 2]->mSrc[0].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[0].mFinal) { block = block->BinaryOperator(iproc, this, iblock->mInstructions[i + 2], iblock->mInstructions[i + 1], ins); i += 2; @@ -8080,7 +8111,7 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode else if (i + 1 < iblock->mInstructions.Size() && ins->mOperandSize >= 2 && iblock->mInstructions[i + 1]->mCode == IC_LEA && - iblock->mInstructions[i + 1]->mSTemp[1] == ins->mTTemp && iblock->mInstructions[i + 1]->mSFinal[1]) + iblock->mInstructions[i + 1]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[1].mFinal) { block->LoadEffectiveAddress(iproc, iblock->mInstructions[i + 1], ins, nullptr); i++; @@ -8093,21 +8124,21 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode break; case IC_LOAD_TEMPORARY: { - if (ins->mSTemp[0] != ins->mTTemp) + if (ins->mSrc[0].mTemp != ins->mDst.mTemp) { - block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]])); - block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mTTemp])); - if (InterTypeSize[ins->mTType] > 1) + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp])); + block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mDst.mTemp])); + if (InterTypeSize[ins->mDst.mType] > 1) { - block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]] + 1)); - block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mTTemp] + 1)); + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mDst.mTemp] + 1)); } - if (ins->mSType[0] == IT_FLOAT) + if (ins->mSrc[0].mType == IT_FLOAT) { - block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]] + 2)); - block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mTTemp] + 2)); - block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]] + 3)); - block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mTTemp] + 3)); + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp] + 2)); + block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mDst.mTemp] + 2)); + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp] + 3)); + block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mDst.mTemp] + 3)); } } } break; @@ -8155,7 +8186,7 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode } break; case IC_RELATIONAL_OPERATOR: - if (i + 1 < iblock->mInstructions.Size() && iblock->mInstructions[i + 1]->mCode == IC_BRANCH && iblock->mInstructions[i + 1]->mSFinal[0]) + if (i + 1 < iblock->mInstructions.Size() && iblock->mInstructions[i + 1]->mCode == IC_BRANCH && iblock->mInstructions[i + 1]->mSrc[0].mFinal) { block->RelationalOperator(iproc, ins, this, CompileBlock(iproc, iblock->mTrueJump), CompileBlock(iproc, iblock->mFalseJump)); return; @@ -8175,11 +8206,11 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode fblock->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); fblock->Close(rblock, nullptr, ASMIT_JMP); - rblock->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mTTemp])); - if (InterTypeSize[ins->mTType] > 1) + rblock->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mDst.mTemp])); + if (InterTypeSize[ins->mDst.mType] > 1) { rblock->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); - rblock->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mTTemp] + 1)); + rblock->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mDst.mTemp] + 1)); } block = rblock; @@ -8188,12 +8219,12 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode case IC_RETURN_VALUE: { - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - if (ins->mSType[0] == IT_FLOAT) + if (ins->mSrc[0].mType == IT_FLOAT) { union { float f; unsigned int v; } cc; - cc.f = ins->mSFloatConst[0]; + cc.f = ins->mSrc[0].mFloatConst; block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, cc.v & 0xff)); block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); @@ -8206,30 +8237,30 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode } else { - block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSIntConst[0] & 0xff)); + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 8) & 0xff)); + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - if (ins->mSType[0] == IT_INT32) + if (ins->mSrc[0].mType == IT_INT32) { - block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 16) & 0xff)); + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 16) & 0xff)); block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 2)); - block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSIntConst[0] >> 24) & 0xff)); + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 24) & 0xff)); block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); } } } else { - block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]])); + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp])); block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU)); - block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]] + 1)); + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp] + 1)); block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - if (ins->mSType[0] == IT_FLOAT || ins->mSType[0] == IT_INT32) + if (ins->mSrc[0].mType == IT_FLOAT || ins->mSrc[0].mType == IT_INT32) { - block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]] + 2)); + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp] + 2)); block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 2)); - block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]] + 3)); + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp] + 3)); block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 3)); } } @@ -8243,28 +8274,28 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode return; case IC_TYPECAST: - if (ins->mSTemp[0] != ins->mTTemp) + if (ins->mSrc[0].mTemp != ins->mDst.mTemp) { - block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]])); - block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mTTemp])); - block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]] + 1)); - block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mTTemp] + 1)); + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp])); + block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mDst.mTemp])); + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp] + 1)); + block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mDst.mTemp] + 1)); } break; case IC_BRANCH: - if (ins->mSTemp[0] < 0) + if (ins->mSrc[0].mTemp < 0) { - if (ins->mSIntConst[0] == 0) + if (ins->mSrc[0].mIntConst == 0) block->Close(CompileBlock(iproc, iblock->mFalseJump), nullptr, ASMIT_JMP); else block->Close(CompileBlock(iproc, iblock->mTrueJump), nullptr, ASMIT_JMP); } else { - block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]])); - if (InterTypeSize[ins->mSType[0]] > 1) - block->mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSTemp[0]] + 1)); + block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp])); + if (InterTypeSize[ins->mSrc[0].mType] > 1) + block->mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + iproc->mTempOffset[ins->mSrc[0].mTemp] + 1)); block->Close(CompileBlock(iproc, iblock->mTrueJump), CompileBlock(iproc, iblock->mFalseJump), ASMIT_BNE); }