diff --git a/autotest/asmtest.c b/autotest/asmtest.c index 6161875..28731ac 100644 --- a/autotest/asmtest.c +++ b/autotest/asmtest.c @@ -4,16 +4,12 @@ int asum(int a, int b) { __asm { - ldy #a clc - lda (fp), y - ldy #b - adc (fp), y + lda a + adc b sta accu - ldy #a + 1 - lda (fp), y - ldy #b + 1 - adc (fp), y + lda a + 1 + adc b + 1 sta accu + 1 } } @@ -24,16 +20,12 @@ int bsum(int a, int b) __asm { - ldy #a clc - lda (fp), y - ldy #b - adc (fp), y + lda a + adc b sta accu - ldy #a + 1 - lda (fp), y - ldy #b + 1 - adc (fp), y + lda a + 1 + adc b + 1 sta accu + 1 } } diff --git a/include/stdio.c b/include/stdio.c index e5bac92..f7fa2ab 100644 --- a/include/stdio.c +++ b/include/stdio.c @@ -4,9 +4,7 @@ void putchar(char c) { __asm { - ldy #2 - lda (fp), y - cmp #10 + lda c bne w1 lda #13 w1: @@ -27,14 +25,8 @@ char getchar(void) void puts(const char * str) { __asm { - ldy #str - lda (fp), y - sta 0x02 - iny - lda (fp), y - sta 0x03 ldy #0 - lda (0x02), y + lda (str), y beq done loop: cmp #10 @@ -42,12 +34,12 @@ void puts(const char * str) lda #13 w1: jsr 0xffd2 - inc 0x02 + inc str bne next - inc 0x03 + inc str + 1 next: ldy #0 - lda (0x02), y + lda (str), y bne loop done: } @@ -56,25 +48,19 @@ void puts(const char * str) char * gets(char * str) { __asm { - ldy #2 - lda (fp), y - sta 0x02 - iny - lda (fp), y - sta 0x03 loop: jsr 0xffcf ldy #0 cmp #13 beq done - sta (0x02), y - inc 0x02 + sta (str), y + inc str bne loop - inc 0x03 + inc srt + 1 bne loop done: lda #0 - sta (0x02), y + sta (str), y } return str; diff --git a/include/stdlib.c b/include/stdlib.c index 9e4b79a..c903cd9 100644 --- a/include/stdlib.c +++ b/include/stdlib.c @@ -306,12 +306,11 @@ float atof(const char * s) void exit(int status) { - __asm { - ldy #status - lda (fp), y + __asm + { + lda status sta accu + 0 - iny - lda (fp), y + lda status + 1 sta accu + 1 pla pla diff --git a/include/string.c b/include/string.c index 5e5353e..7711d77 100644 --- a/include/string.c +++ b/include/string.c @@ -1,6 +1,7 @@ #include "string.h" -#if 1 +#if 0 +/* char * strcpy(char * dst, const char * src) { __asm @@ -33,6 +34,7 @@ char * strcpy(char * dst, const char * src) } } +*/ #else char * strcpy(char * dst, const char * src) { @@ -45,7 +47,8 @@ char * strcpy(char * dst, const char * src) } #endif -#if 1 +#if 0 +/* int strcmp(const char * ptr1, const char * ptr2) { __asm @@ -63,7 +66,7 @@ int strcmp(const char * ptr1, const char * ptr2) iny lda (fp), y sta $1c - + ldy #0 L1: lda ($1f), y beq W1 @@ -91,6 +94,7 @@ int strcmp(const char * ptr1, const char * ptr2) sta accu + 1 } } +*/ #else int strcmp(const char * ptr1, const char * ptr2) { @@ -136,39 +140,24 @@ void * memset(void * dst, int value, int size) { __asm { - ldy #dst - lda (fp), y - sta $1f - iny - lda (fp), y - sta $20 + lda value - ldy #size - lda (fp), y - sta $1b - iny - lda (fp), y - sta $1c - - ldy #value - lda (fp), y - - ldx $1c + ldx size + 1 beq _w1 ldy #0 _loop1: - sta ($1f), y + sta (dst), y iny bne _loop1 - inc $20 + inc dst + 1 dex bne _loop1 _w1: - ldy $1b + ldy size beq _w2 _loop2: dey - sta ($1f), y + sta (dst), y bne _loop2 _w2: } diff --git a/oscar64/ByteCodeGenerator.cpp b/oscar64/ByteCodeGenerator.cpp index 97a459c..70bcbe9 100644 --- a/oscar64/ByteCodeGenerator.cpp +++ b/oscar64/ByteCodeGenerator.cpp @@ -658,7 +658,7 @@ void ByteCodeBasicBlock::LoadConstant(InterCodeProcedure* proc, const InterInstr if (ins->mDst.mType == IT_FLOAT) { union { float f; int v; } cc; - cc.f = ins->mFloatValue; + cc.f = ins->mConst.mFloatConst; ByteCodeInstruction bins(BC_CONST_32); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = cc.v; @@ -666,48 +666,48 @@ void ByteCodeBasicBlock::LoadConstant(InterCodeProcedure* proc, const InterInstr } else if (ins->mDst.mType == IT_POINTER) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mConst.mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_LEA_ABS); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; - bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mIntValue; + bins.mLinkerObject = ins->mConst.mLinkerObject; + bins.mValue = ins->mConst.mIntConst; bins.mRelocate = true; mIns.Push(bins); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mConst.mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_LEA_ABS); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; - bins.mValue = ins->mIntValue; + bins.mValue = ins->mConst.mIntConst; mIns.Push(bins); } - else if (ins->mMemory == IM_LOCAL) + else if (ins->mConst.mMemory == IM_LOCAL) { ByteCodeInstruction bins(BC_LEA_LOCAL); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; - bins.mValue = ins->mIntValue + proc->mLocalVars[ins->mVarIndex]->mOffset; + bins.mValue = ins->mConst.mIntConst + proc->mLocalVars[ins->mConst.mVarIndex]->mOffset; mIns.Push(bins); } - else if (ins->mMemory == IM_PARAM) + else if (ins->mConst.mMemory == IM_PARAM) { ByteCodeInstruction bins(BC_LEA_LOCAL); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; - bins.mValue = ins->mIntValue + ins->mVarIndex + proc->mLocalSize + 2; + bins.mValue = ins->mConst.mIntConst + ins->mConst.mVarIndex + proc->mLocalSize + 2; mIns.Push(bins); } - else if (ins->mMemory == IM_FRAME) + else if (ins->mConst.mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_LEA_FRAME); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; - bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + bins.mValue = ins->mConst.mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } - else if (ins->mMemory == IM_PROCEDURE) + else if (ins->mConst.mMemory == IM_PROCEDURE) { ByteCodeInstruction bins(BC_CONST_16); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mConst.mLinkerObject; bins.mValue = 0; bins.mRelocate = true; mIns.Push(bins); @@ -717,21 +717,21 @@ void ByteCodeBasicBlock::LoadConstant(InterCodeProcedure* proc, const InterInstr { ByteCodeInstruction bins(BC_CONST_8); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; - bins.mValue = ins->mIntValue; + bins.mValue = ins->mConst.mIntConst; mIns.Push(bins); } else if (ins->mDst.mType == IT_INT32) { ByteCodeInstruction bins(BC_CONST_32); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; - bins.mValue = ins->mIntValue; + bins.mValue = ins->mConst.mIntConst; mIns.Push(bins); } else { ByteCodeInstruction bins(BC_CONST_16); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; - bins.mValue = ins->mIntValue; + bins.mValue = ins->mConst.mIntConst; mIns.Push(bins); } @@ -748,7 +748,7 @@ void ByteCodeBasicBlock::CopyValue(InterCodeProcedure* proc, const InterInstruct dins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(dins); ByteCodeInstruction cins(BC_COPY); - cins.mValue = ins->mOperandSize; + cins.mValue = ins->mConst.mOperandSize; mIns.Push(cins); } @@ -762,29 +762,29 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI { FloatConstToAccu(ins->mSrc[0].mFloatConst); - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_STORE_ABS_32); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[1].mLinkerObject; bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_32); bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { int index = ins->mSrc[1].mIntConst; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; if (index <= 252) { @@ -807,40 +807,40 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(bins); } } - else if (ins->mMemory == IM_FRAME) + else if (ins->mSrc[1].mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_STORE_FRAME_32); bins.mRegister = BC_REG_ACCU; bins.mRegisterFinal = ins->mSrc[0].mFinal; - bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + bins.mValue = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } else { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_STORE_ABS_32); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[1].mLinkerObject; 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) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_32); 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) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { int index = ins->mSrc[1].mIntConst; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; if (index <= 252) { @@ -863,12 +863,12 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(bins); } } - else if (ins->mMemory == IM_FRAME) + else if (ins->mSrc[1].mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_STORE_FRAME_32); 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; + bins.mValue = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } @@ -879,7 +879,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI { FloatConstToAccu(ins->mSrc[0].mFloatConst); - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[1].mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; @@ -893,7 +893,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI } else { - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[1].mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; @@ -916,29 +916,29 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI { IntConstToAccu(ins->mSrc[0].mIntConst); - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_STORE_ABS_16); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[1].mLinkerObject; bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_16); bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { int index = ins->mSrc[1].mIntConst; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; if (index <= 254) { @@ -959,26 +959,26 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(bins); } } - else if (ins->mMemory == IM_FRAME) + else if (ins->mSrc[1].mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_STORE_FRAME_16); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + bins.mValue = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } else { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_STORE_ABS_16); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[1].mLinkerObject; 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) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_16); bins.mValue = ins->mSrc[1].mIntConst; @@ -986,13 +986,13 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { int index = ins->mSrc[1].mIntConst; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; if (index <= 254) { @@ -1015,12 +1015,12 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(bins); } } - else if (ins->mMemory == IM_FRAME) + else if (ins->mSrc[1].mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_STORE_FRAME_16); 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; + bins.mValue = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } @@ -1031,7 +1031,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI { IntConstToAccu(ins->mSrc[0].mIntConst); - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[1].mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; @@ -1045,7 +1045,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI } else { - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[1].mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; @@ -1066,36 +1066,36 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI { if (ins->mSrc[0].mTemp < 0) { - if (ins->mOperandSize <= 2) + if (InterTypeSize[ins->mSrc[0].mType] <= 2) IntConstToAccu(ins->mSrc[0].mIntConst); else LongConstToAccu(ins->mSrc[0].mIntConst); - if (ins->mOperandSize == 1) + if (InterTypeSize[ins->mSrc[0].mType] == 1) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_STORE_ABS_8); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[1].mLinkerObject; bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_8); bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { int index = ins->mSrc[1].mIntConst; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; if (index <= 255) { @@ -1116,39 +1116,39 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(bins); } } - else if (ins->mMemory == IM_FRAME) + else if (ins->mSrc[1].mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_STORE_FRAME_8); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + bins.mValue = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } - else if (ins->mOperandSize == 2) + else if (InterTypeSize[ins->mSrc[0].mType] == 2) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_STORE_ABS_16); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[1].mLinkerObject; bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_16); bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { int index = ins->mSrc[1].mIntConst; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; if (index <= 254) { @@ -1169,39 +1169,39 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(bins); } } - else if (ins->mMemory == IM_FRAME) + else if (ins->mSrc[1].mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_STORE_FRAME_16); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + bins.mValue = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } - else if (ins->mOperandSize == 4) + else if (InterTypeSize[ins->mSrc[0].mType] == 4) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_STORE_ABS_32); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[1].mLinkerObject; bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_32); bins.mValue = ins->mSrc[1].mIntConst; bins.mRegister = BC_REG_ACCU; mIns.Push(bins); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { int index = ins->mSrc[1].mIntConst; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; if (index <= 252) { @@ -1222,30 +1222,30 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(bins); } } - else if (ins->mMemory == IM_FRAME) + else if (ins->mSrc[1].mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_STORE_FRAME_32); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + bins.mValue = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } } else { - if (ins->mOperandSize == 1) + if (InterTypeSize[ins->mSrc[0].mType] == 1) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_STORE_ABS_8); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[1].mLinkerObject; 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) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_8); bins.mValue = ins->mSrc[1].mIntConst; @@ -1253,13 +1253,13 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { int index = ins->mSrc[1].mIntConst; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; if (index <= 255) { @@ -1282,28 +1282,28 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(bins); } } - else if (ins->mMemory == IM_FRAME) + else if (ins->mSrc[1].mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_STORE_FRAME_8); 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; + bins.mValue = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } - else if (ins->mOperandSize == 2) + else if (InterTypeSize[ins->mSrc[0].mType] == 2) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_STORE_ABS_16); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[1].mLinkerObject; 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) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_16); bins.mValue = ins->mSrc[1].mIntConst; @@ -1311,13 +1311,13 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { int index = ins->mSrc[1].mIntConst; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; if (index <= 254) { @@ -1340,28 +1340,28 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(bins); } } - else if (ins->mMemory == IM_FRAME) + else if (ins->mSrc[1].mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_STORE_FRAME_16); 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; + bins.mValue = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } - else if (ins->mOperandSize == 4) + else if (InterTypeSize[ins->mSrc[0].mType] == 4) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_STORE_ABS_32); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[1].mLinkerObject; 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) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_STORE_ABS_32); bins.mValue = ins->mSrc[1].mIntConst; @@ -1369,13 +1369,13 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI bins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(bins); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { int index = ins->mSrc[1].mIntConst; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; if (index <= 252) { @@ -1398,12 +1398,12 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(bins); } } - else if (ins->mMemory == IM_FRAME) + else if (ins->mSrc[1].mMemory == IM_FRAME) { ByteCodeInstruction bins(BC_STORE_FRAME_32); 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; + bins.mValue = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(bins); } } @@ -1413,32 +1413,32 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI { if (ins->mSrc[0].mTemp < 0) { - if (ins->mOperandSize <= 2) + if (InterTypeSize[ins->mSrc[0].mType] <= 2) IntConstToAccu(ins->mSrc[0].mIntConst); else LongConstToAccu(ins->mSrc[0].mIntConst); - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[1].mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); - if (ins->mOperandSize == 1) + if (InterTypeSize[ins->mSrc[0].mType] == 1) { ByteCodeInstruction bins(BC_STORE_ADDR_8); bins.mRegister = BC_REG_ACCU; bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } - else if (ins->mOperandSize == 2) + else if (InterTypeSize[ins->mSrc[0].mType] == 2) { ByteCodeInstruction bins(BC_STORE_ADDR_16); bins.mRegister = BC_REG_ACCU; bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } - else if (ins->mOperandSize == 4) + else if (InterTypeSize[ins->mSrc[0].mType] == 4) { ByteCodeInstruction bins(BC_STORE_ADDR_32); bins.mRegister = BC_REG_ACCU; @@ -1449,13 +1449,13 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI } else { - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[1].mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; lins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(lins); - if (ins->mOperandSize == 1) + if (InterTypeSize[ins->mSrc[0].mType] == 1) { ByteCodeInstruction bins(BC_STORE_ADDR_8); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; @@ -1463,7 +1463,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } - else if (ins->mOperandSize == 2) + else if (InterTypeSize[ins->mSrc[0].mType] == 2) { ByteCodeInstruction bins(BC_STORE_ADDR_16); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; @@ -1471,7 +1471,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } - else if (ins->mOperandSize == 4) + else if (InterTypeSize[ins->mSrc[0].mType] == 4) { ByteCodeInstruction bins(BC_STORE_ADDR_32); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; @@ -1491,29 +1491,29 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn { if (ins->mSrc[0].mTemp < 0) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[0].mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_LOAD_ABS_32); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[0].mLinkerObject; 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) + else if (ins->mSrc[0].mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_LOAD_ABS_32); 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) + else if (ins->mSrc[0].mMemory == IM_LOCAL || ins->mSrc[0].mMemory == IM_PARAM) { int index = ins->mSrc[0].mIntConst; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mSrc[0].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[0].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[0].mVarIndex + proc->mLocalSize + 2; if (index <= 254) { @@ -1537,7 +1537,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn } else { - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[0].mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; @@ -1554,29 +1554,29 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn { if (ins->mSrc[0].mTemp < 0) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[0].mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_LOAD_ABS_16); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[0].mLinkerObject; 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) + else if (ins->mSrc[0].mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_LOAD_ABS_16); 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) + else if (ins->mSrc[0].mMemory == IM_LOCAL || ins->mSrc[0].mMemory == IM_PARAM) { int index = ins->mSrc[0].mIntConst; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mSrc[0].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[0].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[0].mVarIndex + proc->mLocalSize + 2; if (index <= 254) { @@ -1600,7 +1600,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn } else { - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[0].mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; @@ -1617,31 +1617,31 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn { if (ins->mSrc[0].mTemp < 0) { - if (ins->mOperandSize == 1) + if (InterTypeSize[ins->mDst.mType] == 1) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[0].mMemory == IM_GLOBAL) { 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.mLinkerObject = ins->mSrc[0].mLinkerObject; 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) + else if (ins->mSrc[0].mMemory == IM_ABSOLUTE) { 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) + else if (ins->mSrc[0].mMemory == IM_LOCAL || ins->mSrc[0].mMemory == IM_PARAM) { int index = ins->mSrc[0].mIntConst; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mSrc[0].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[0].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[0].mVarIndex + proc->mLocalSize + 2; if (index <= 255) { @@ -1663,31 +1663,31 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn } } } - else if (ins->mOperandSize == 2) + else if (InterTypeSize[ins->mDst.mType] == 2) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[0].mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_LOAD_ABS_16); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[0].mLinkerObject; 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) + else if (ins->mSrc[0].mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_LOAD_ABS_16); 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) + else if (ins->mSrc[0].mMemory == IM_LOCAL || ins->mSrc[0].mMemory == IM_PARAM) { int index = ins->mSrc[0].mIntConst; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mSrc[0].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[0].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[0].mVarIndex + proc->mLocalSize + 2; if (index <= 254) { @@ -1709,31 +1709,31 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn } } } - else if (ins->mOperandSize == 4) + else if (InterTypeSize[ins->mDst.mType] == 4) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[0].mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_LOAD_ABS_32); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[0].mLinkerObject; 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) + else if (ins->mSrc[0].mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_LOAD_ABS_32); 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) + else if (ins->mSrc[0].mMemory == IM_LOCAL || ins->mSrc[0].mMemory == IM_PARAM) { int index = ins->mSrc[0].mIntConst; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mSrc[0].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[0].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[0].mVarIndex + proc->mLocalSize + 2; if (index <= 252) { @@ -1758,28 +1758,28 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn } else { - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[0].mMemory == IM_INDIRECT) { ByteCodeInstruction lins(BC_ADDR_REG); lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; lins.mRegisterFinal = ins->mSrc[0].mFinal; mIns.Push(lins); - if (ins->mOperandSize == 1) + if (InterTypeSize[ins->mDst.mType] == 1) { 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) + else if (InterTypeSize[ins->mDst.mType] == 2) { ByteCodeInstruction bins(BC_LOAD_ADDR_16); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mValue = ins->mSrc[0].mIntConst; mIns.Push(bins); } - else if (ins->mOperandSize == 4) + else if (InterTypeSize[ins->mDst.mType] == 4) { ByteCodeInstruction bins(BC_LOAD_ADDR_32); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; @@ -1819,27 +1819,27 @@ void ByteCodeBasicBlock::LoadEffectiveAddress(InterCodeProcedure* proc, const In } else if (ins->mSrc[1].mTemp < 0) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { ByteCodeInstruction bins(BC_LEA_ABS); bins.mRegister = BC_REG_ACCU; - bins.mLinkerObject = ins->mLinkerObject; - bins.mValue = ins->mIntValue; + bins.mLinkerObject = ins->mSrc[1].mLinkerObject; + bins.mValue = ins->mSrc[1].mIntConst; bins.mRelocate = true; mIns.Push(bins); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { ByteCodeInstruction bins(BC_LEA_ABS); bins.mRegister = BC_REG_ACCU; - bins.mValue = ins->mIntValue; + bins.mValue = ins->mSrc[1].mIntConst; mIns.Push(bins); } - else if (ins->mMemory == IM_PROCEDURE) + else if (ins->mSrc[1].mMemory == IM_PROCEDURE) { ByteCodeInstruction bins(BC_CONST_16); bins.mRegister = BC_REG_ACCU; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[1].mLinkerObject; bins.mValue = 0; bins.mRelocate = true; mIns.Push(bins); @@ -1874,7 +1874,7 @@ void ByteCodeBasicBlock::CallFunction(InterCodeProcedure* proc, const InterInstr { ByteCodeInstruction bins(BC_LEA_ABS); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[0].mLinkerObject; bins.mValue = 0; bins.mRegister = BC_REG_ADDR; mIns.Push(bins); @@ -1904,10 +1904,10 @@ void ByteCodeBasicBlock::CallAssembler(InterCodeProcedure* proc, const InterInst { ByteCodeInstruction bins(BC_JSR); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[0].mLinkerObject; bins.mValue = ins->mSrc[0].mIntConst; for (int i = 1; i < ins->mNumOperands; i++) - ins->mLinkerObject->mTemporaries[i - 1] = BC_REG_TMP + proc->mTempOffset[ins->mSrc[i].mTemp]; + ins->mSrc[0].mLinkerObject->mTemporaries[i - 1] = BC_REG_TMP + proc->mTempOffset[ins->mSrc[i].mTemp]; mIns.Push(bins); } @@ -1925,7 +1925,7 @@ void ByteCodeBasicBlock::CallNative(InterCodeProcedure* proc, const InterInstruc { ByteCodeInstruction bins(BC_JSR); bins.mRelocate = true; - bins.mLinkerObject = ins->mLinkerObject; + bins.mLinkerObject = ins->mSrc[0].mLinkerObject; bins.mValue = ins->mSrc[0].mIntConst; mIns.Push(bins); } @@ -2908,14 +2908,14 @@ void ByteCodeBasicBlock::Compile(InterCodeProcedure* iproc, ByteCodeProcedure* p case IC_PUSH_FRAME: { ByteCodeInstruction bins(BC_PUSH_FRAME); - bins.mValue = ins->mIntValue + 2; + bins.mValue = ins->mConst.mIntConst + 2; mIns.Push(bins); } break; case IC_POP_FRAME: { ByteCodeInstruction bins(BC_POP_FRAME); - bins.mValue = ins->mIntValue + 2; + bins.mValue = ins->mConst.mIntConst + 2; mIns.Push(bins); } break; diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 4d4fc4e..459a64e 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -69,7 +69,8 @@ void ValueSet::FlushCallAliases(void) while (i < mNum) { - if ((mInstructions[i]->mCode == IC_LOAD || mInstructions[i]->mCode == IC_STORE) && mInstructions[i]->mMemory != IM_PARAM && mInstructions[i]->mMemory != IM_LOCAL) + if ((mInstructions[i]->mCode == IC_LOAD && mInstructions[i]->mSrc[0].mMemory != IM_PARAM && mInstructions[i]->mSrc[0].mMemory != IM_LOCAL) || + (mInstructions[i]->mCode == IC_STORE && mInstructions[i]->mSrc[1].mMemory != IM_PARAM && mInstructions[i]->mSrc[1].mMemory != IM_LOCAL)) { // // potential alias load @@ -241,32 +242,38 @@ static void ConversionConstantFold(InterInstruction * ins, InterInstruction * ci { case IA_INT2FLOAT: ins->mCode = IC_CONSTANT; - ins->mFloatValue = (double)(cins->mIntValue); + ins->mConst.mFloatConst = (double)(cins->mConst.mIntConst); + ins->mConst.mType = IT_FLOAT; ins->mSrc[0].mTemp = -1; break; case IA_FLOAT2INT: ins->mCode = IC_CONSTANT; - ins->mIntValue = (int)(cins->mFloatValue); + ins->mConst.mIntConst = (int)(cins->mConst.mFloatConst); + ins->mConst.mType = IT_INT16; ins->mSrc[0].mTemp = -1; break; case IA_EXT8TO16S: ins->mCode = IC_CONSTANT; - ins->mIntValue = (int8)(cins->mIntValue); + ins->mConst.mIntConst = (int8)(cins->mConst.mIntConst); + ins->mConst.mType = IT_INT16; ins->mSrc[0].mTemp = -1; break; case IA_EXT8TO16U: ins->mCode = IC_CONSTANT; - ins->mIntValue = (uint8)(cins->mIntValue); + ins->mConst.mIntConst = (uint8)(cins->mConst.mIntConst); + ins->mConst.mType = IT_INT16; ins->mSrc[0].mTemp = -1; break; case IA_EXT16TO32S: ins->mCode = IC_CONSTANT; - ins->mIntValue = (int16)(cins->mIntValue); + ins->mConst.mIntConst = (int16)(cins->mConst.mIntConst); + ins->mConst.mType = IT_INT32; ins->mSrc[0].mTemp = -1; break; case IA_EXT16TO32U: ins->mCode = IC_CONSTANT; - ins->mIntValue = (uint16)(cins->mIntValue); + ins->mConst.mIntConst = (uint16)(cins->mConst.mIntConst); + ins->mConst.mType = IT_INT32; ins->mSrc[0].mTemp = -1; break; } @@ -292,41 +299,65 @@ 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) + while (ins && ins->mCode == IC_LEA && ins->mSrc[1].mMemory == IM_INDIRECT) ins = tvalue[ins->mSrc[1].mTemp]; - if (ins && (ins->mCode == IC_CONSTANT || ins->mCode == IC_LEA)) + if (ins) { - mem = ins->mMemory; - vindex = ins->mVarIndex; - offset = ins->mIntValue; + if (ins->mCode == IC_CONSTANT) + { + mem = ins->mConst.mMemory; + vindex = ins->mConst.mVarIndex; + offset = ins->mConst.mIntConst; + } + else if (ins->mCode == IC_LEA) + { + mem = ins->mSrc[1].mMemory; + vindex = ins->mSrc[1].mVarIndex; + offset = ins->mSrc[1].mIntConst; - return true; + return true; + } } - else - return false; + + return false; } -static bool MemRange(const InterInstruction * ins, const GrowingInstructionPtrArray& tvalue, InterMemory& mem, int& vindex, int& offset) +static bool MemRange(const InterInstruction * ins, const GrowingInstructionPtrArray& tvalue, InterMemory& mem, int& vindex, int& offset, int& size) { - if (ins->mMemory == IM_INDIRECT) + if (ins->mCode == IC_LOAD && ins->mSrc[0].mMemory == IM_INDIRECT) { - if (ins->mCode == IC_LOAD) - return MemPtrRange(tvalue[ins->mSrc[0].mTemp], tvalue, mem, vindex, offset); - else - return MemPtrRange(tvalue[ins->mSrc[1].mTemp], tvalue, mem, vindex, offset); + size = ins->mSrc[0].mOperandSize; + return MemPtrRange(tvalue[ins->mSrc[0].mTemp], tvalue, mem, vindex, offset); } + else if (ins->mSrc[1].mMemory == IM_INDIRECT) + { + size = ins->mSrc[1].mOperandSize; + return MemPtrRange(tvalue[ins->mSrc[1].mTemp], tvalue, mem, vindex, offset); + } + if (ins) { - mem = ins->mMemory; - vindex = ins->mVarIndex; - offset = ins->mIntValue; + if (ins->mCode == IC_LOAD) + { + mem = ins->mSrc[0].mMemory; + vindex = ins->mSrc[0].mVarIndex; + offset = ins->mSrc[0].mIntConst; + size = ins->mSrc[0].mOperandSize; + } + else + { + mem = ins->mSrc[1].mMemory; + vindex = ins->mSrc[1].mVarIndex; + offset = ins->mSrc[1].mIntConst; + size = ins->mSrc[1].mOperandSize; + } return true; } - else - return false; + + return false; } static bool StoreAliasing(const InterInstruction * lins, const InterInstruction* sins, const GrowingInstructionPtrArray& tvalue, const NumberSet& aliasedLocals, const NumberSet& aliasedParams) @@ -334,14 +365,15 @@ static bool StoreAliasing(const InterInstruction * lins, const InterInstruction* InterMemory lmem, smem; int lvindex, svindex; int loffset, soffset; + int lsize, ssize; - if (MemRange(lins, tvalue, lmem, lvindex, loffset)) + if (MemRange(lins, tvalue, lmem, lvindex, loffset, lsize)) { - if (MemRange(sins, tvalue, smem, svindex, soffset)) + if (MemRange(sins, tvalue, smem, svindex, soffset, ssize)) { if (smem == lmem && svindex == lvindex) { - if (soffset + sins->mOperandSize >= loffset && loffset + lins->mOperandSize >= soffset) + if (soffset + ssize >= loffset && loffset + lsize >= soffset) return true; } @@ -422,7 +454,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr while (i < mNum && (mInstructions[i]->mCode != IC_LOAD || mInstructions[i]->mSrc[0].mTemp != ins->mSrc[0].mTemp || - mInstructions[i]->mOperandSize != ins->mOperandSize)) + mInstructions[i]->mSrc[0].mOperandSize != ins->mSrc[0].mOperandSize)) { i++; } @@ -440,7 +472,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr while (i < mNum && (mInstructions[i]->mCode != IC_STORE || mInstructions[i]->mSrc[1].mTemp != ins->mSrc[0].mTemp || - mInstructions[i]->mOperandSize != ins->mOperandSize)) + mInstructions[i]->mSrc[1].mOperandSize != ins->mSrc[0].mOperandSize)) { i++; } @@ -452,7 +484,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr ins->mCode = IC_CONSTANT; ins->mSrc[0].mTemp = -1; ins->mSrc[0].mType = mInstructions[i]->mSrc[0].mType; - ins->mIntValue = mInstructions[i]->mSrc[0].mIntConst; + ins->mConst.mIntConst = mInstructions[i]->mSrc[0].mIntConst; } else { @@ -509,7 +541,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr while (i < mNum && (mInstructions[i]->mCode != IC_CONSTANT || mInstructions[i]->mDst.mType != ins->mDst.mType || - mInstructions[i]->mFloatValue != ins->mFloatValue)) + mInstructions[i]->mConst.mFloatConst != ins->mConst.mFloatConst)) { i++; } @@ -519,10 +551,10 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr while (i < mNum && (mInstructions[i]->mCode != IC_CONSTANT || mInstructions[i]->mDst.mType != ins->mDst.mType || - mInstructions[i]->mIntValue != ins->mIntValue || - mInstructions[i]->mMemory != ins->mMemory || - mInstructions[i]->mVarIndex != ins->mVarIndex || - mInstructions[i]->mLinkerObject != ins->mLinkerObject)) + mInstructions[i]->mConst.mIntConst != ins->mConst.mIntConst || + mInstructions[i]->mConst.mMemory != ins->mConst.mMemory || + mInstructions[i]->mConst.mVarIndex != ins->mConst.mVarIndex || + mInstructions[i]->mConst.mLinkerObject != ins->mConst.mLinkerObject)) { i++; } @@ -533,7 +565,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr while (i < mNum && (mInstructions[i]->mCode != IC_CONSTANT || mInstructions[i]->mDst.mType != ins->mDst.mType || - mInstructions[i]->mIntValue != ins->mIntValue)) + mInstructions[i]->mConst.mIntConst != ins->mConst.mIntConst)) { i++; } @@ -585,7 +617,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr 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->mSrc[1].mTemp]->mFloatValue, tvalue[ins->mSrc[0].mTemp]->mFloatValue); + ins->mConst.mFloatConst = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mConst.mFloatConst, tvalue[ins->mSrc[0].mTemp]->mConst.mFloatConst); ins->mSrc[0].mTemp = -1; ins->mSrc[1].mTemp = -1; @@ -593,7 +625,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr while (i < mNum && (mInstructions[i]->mCode != IC_CONSTANT || mInstructions[i]->mDst.mType != ins->mDst.mType || - mInstructions[i]->mFloatValue != ins->mFloatValue)) + mInstructions[i]->mConst.mFloatConst != ins->mConst.mFloatConst)) { i++; } @@ -643,7 +675,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr 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->mSrc[1].mTemp]->mIntValue, tvalue[ins->mSrc[0].mTemp]->mIntValue); + ins->mConst.mIntConst = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mConst.mIntConst, tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst); ins->mSrc[0].mTemp = -1; ins->mSrc[1].mTemp = -1; @@ -656,9 +688,9 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr { 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->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->mOperator == IA_SHL || ins->mOperator == IA_SHR || ins->mOperator == IA_SAR) && tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst == 0 || + (ins->mOperator == IA_MUL || ins->mOperator == IA_DIVU || ins->mOperator == IA_DIVS) && tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst == 1 || + (ins->mOperator == IA_AND) && tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst == -1) { ins->mCode = IC_LOAD_TEMPORARY; ins->mSrc[0].mTemp = ins->mSrc[1].mTemp; @@ -670,10 +702,10 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr return; } - else if ((ins->mOperator == IA_MUL || ins->mOperator == IA_AND) && tvalue[ins->mSrc[0].mTemp]->mIntValue == 0) + else if ((ins->mOperator == IA_MUL || ins->mOperator == IA_AND) && tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst == 0) { ins->mCode = IC_CONSTANT; - ins->mIntValue = 0; + ins->mConst.mIntConst = 0; ins->mSrc[0].mTemp = -1; ins->mSrc[1].mTemp = -1; @@ -684,9 +716,9 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr } 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->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) + if ((ins->mOperator == IA_ADD || ins->mOperator == IA_OR || ins->mOperator == IA_XOR) && tvalue[ins->mSrc[1].mTemp]->mConst.mIntConst == 0 || + (ins->mOperator == IA_MUL) && tvalue[ins->mSrc[1].mTemp]->mConst.mIntConst == 1 || + (ins->mOperator == IA_AND) && tvalue[ins->mSrc[1].mTemp]->mConst.mIntConst == -1) { ins->mCode = IC_LOAD_TEMPORARY; ins->mSrc[1].mTemp = -1; @@ -697,10 +729,10 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr 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->mSrc[1].mTemp]->mIntValue == 0) + ins->mOperator == IA_SHL || ins->mOperator == IA_SHR || ins->mOperator == IA_SAR) && tvalue[ins->mSrc[1].mTemp]->mConst.mIntConst == 0) { ins->mCode = IC_CONSTANT; - ins->mIntValue = 0; + ins->mConst.mIntConst = 0; ins->mSrc[0].mTemp = -1; ins->mSrc[1].mTemp = -1; @@ -708,7 +740,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr return; } - else if (ins->mOperator == IA_SUB && tvalue[ins->mSrc[1].mTemp]->mIntValue == 0) + else if (ins->mOperator == IA_SUB && tvalue[ins->mSrc[1].mTemp]->mConst.mIntConst == 0) { ins->mCode = IC_UNARY_OPERATOR; ins->mOperator = IA_NEG; @@ -724,7 +756,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr if (ins->mOperator == IA_SUB || ins->mOperator == IA_XOR) { ins->mCode = IC_CONSTANT; - ins->mIntValue = 0; + ins->mConst.mIntConst = 0; ins->mSrc[0].mTemp = -1; ins->mSrc[1].mTemp = -1; @@ -780,7 +812,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr while (i < mNum && (mInstructions[i]->mCode != IC_CONSTANT || mInstructions[i]->mDst.mType != ins->mDst.mType || - mInstructions[i]->mFloatValue != ins->mFloatValue)) + mInstructions[i]->mConst.mFloatConst != ins->mConst.mFloatConst)) { i++; } @@ -835,14 +867,14 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr 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->mSrc[0].mTemp]->mFloatValue); + ins->mConst.mFloatConst = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[0].mTemp]->mConst.mFloatConst); ins->mSrc[0].mTemp = -1; i = 0; while (i < mNum && (mInstructions[i]->mCode != IC_CONSTANT || mInstructions[i]->mDst.mType != ins->mDst.mType || - mInstructions[i]->mFloatValue != ins->mFloatValue)) + mInstructions[i]->mConst.mFloatConst != ins->mConst.mFloatConst)) { i++; } @@ -890,14 +922,14 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr 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->mSrc[0].mTemp]->mIntValue); + ins->mConst.mIntConst = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst); ins->mSrc[0].mTemp = -1; i = 0; while (i < mNum && (mInstructions[i]->mCode != IC_CONSTANT || mInstructions[i]->mDst.mType != ins->mDst.mType || - mInstructions[i]->mIntValue != ins->mIntValue)) + mInstructions[i]->mConst.mIntConst != ins->mConst.mIntConst)) { i++; } @@ -949,7 +981,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr 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->mSrc[1].mTemp]->mFloatValue, tvalue[ins->mSrc[0].mTemp]->mFloatValue); + ins->mConst.mIntConst = ConstantRelationalFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mConst.mFloatConst, tvalue[ins->mSrc[0].mTemp]->mConst.mFloatConst); ins->mSrc[0].mTemp = -1; ins->mSrc[1].mTemp = -1; @@ -963,7 +995,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr 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->mSrc[1].mTemp]->mIntValue, tvalue[ins->mSrc[0].mTemp]->mIntValue); + ins->mConst.mIntConst = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mConst.mIntConst, tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst); ins->mSrc[0].mTemp = -1; ins->mSrc[1].mTemp = -1; @@ -980,14 +1012,14 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr case IA_CMPLES: case IA_CMPGEU: case IA_CMPLEU: - ins->mIntValue = 1; + ins->mConst.mIntConst = 1; break; case IA_CMPNE: case IA_CMPGS: case IA_CMPLS: case IA_CMPGU: case IA_CMPLU: - ins->mIntValue = 0; + ins->mConst.mIntConst = 0; break; } ins->mSrc[0].mTemp = -1; @@ -1001,7 +1033,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr case IC_BRANCH: if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - if (tvalue[ins->mSrc[0].mTemp]->mIntValue) + if (tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst) ins->mCode = IC_JUMP; else ins->mCode = IC_JUMPF; @@ -1019,13 +1051,8 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr InterInstruction::InterInstruction(void) { mCode = IC_NONE; + mOperator = IA_NONE; - mMemory = IM_NONE; - mOperandSize = 0; - mVarIndex = -1; - mIntValue = 0; - mFloatValue = 0; - mLinkerObject = nullptr; mNumOperands = 3; mInUse = false; @@ -1095,16 +1122,16 @@ void InterInstruction::CollectLocalAddressTemps(GrowingIntArray& localTable, Gro { if (mCode == IC_CONSTANT) { - if (mDst.mType == IT_POINTER && mMemory == IM_LOCAL) - localTable[mDst.mTemp] = mVarIndex; - else if (mDst.mType == IT_POINTER && (mMemory == IM_PARAM || mMemory == IM_FPARAM)) - paramTable[mDst.mTemp] = mVarIndex; + if (mDst.mType == IT_POINTER && mConst.mMemory == IM_LOCAL) + localTable[mDst.mTemp] = mConst.mVarIndex; + else if (mDst.mType == IT_POINTER && (mConst.mMemory == IM_PARAM || mConst.mMemory == IM_FPARAM)) + paramTable[mDst.mTemp] = mConst.mVarIndex; } else if (mCode == IC_LEA) { - if (mMemory == IM_LOCAL) + if (mSrc[1].mMemory == IM_LOCAL) localTable[mDst.mTemp] = localTable[mSrc[1].mTemp]; - else if (mMemory == IM_PARAM || mMemory == IM_FPARAM) + else if (mSrc[1].mMemory == IM_PARAM || mSrc[1].mMemory == IM_FPARAM) paramTable[mDst.mTemp] = paramTable[mSrc[1].mTemp]; } else if (mCode == IC_LOAD_TEMPORARY) @@ -1136,18 +1163,18 @@ void InterInstruction::FilterTempUsage(NumberSet& requiredTemps, NumberSet& prov void InterInstruction::FilterVarsUsage(const GrowingVariableArray& localVars, NumberSet& requiredVars, NumberSet& providedVars) { - if (mCode == IC_LOAD && mMemory == IM_LOCAL) + if (mCode == IC_LOAD && mSrc[0].mMemory == IM_LOCAL) { assert(mSrc[0].mTemp < 0); - if (!providedVars[mVarIndex]) - requiredVars += mVarIndex; + if (!providedVars[mSrc[0].mVarIndex]) + requiredVars += mSrc[0].mVarIndex; } - else if (mCode == IC_STORE && mMemory == IM_LOCAL) + else if (mCode == IC_STORE && mSrc[1].mMemory == IM_LOCAL) { assert(mSrc[1].mTemp < 0); - if (!providedVars[mVarIndex] && (mSrc[1].mIntConst != 0 || mOperandSize != localVars[mVarIndex]->mSize)) - requiredVars += mVarIndex; - providedVars += mVarIndex; + if (!providedVars[mSrc[1].mVarIndex] && (mSrc[1].mIntConst != 0 || mSrc[1].mOperandSize != localVars[mSrc[1].mVarIndex]->mSize)) + requiredVars += mSrc[1].mVarIndex; + providedVars += mSrc[1].mVarIndex; } } @@ -1173,10 +1200,10 @@ bool InterInstruction::PropagateConstTemps(const GrowingInstructionPtrArray& cte if (mSrc[0].mTemp >= 0 && ctemps[mSrc[0].mTemp]) { InterInstruction* ains = ctemps[mSrc[0].mTemp]; - mSrc[0].mIntConst = ains->mIntValue; - mLinkerObject = ains->mLinkerObject; - mVarIndex = ains->mVarIndex; - mMemory = ains->mMemory; + mSrc[0].mIntConst = ains->mConst.mIntConst; + mSrc[0].mLinkerObject = ains->mConst.mLinkerObject; + mSrc[0].mVarIndex = ains->mConst.mVarIndex; + mSrc[0].mMemory = ains->mConst.mMemory; mSrc[0].mTemp = -1; return true; } @@ -1185,10 +1212,10 @@ bool InterInstruction::PropagateConstTemps(const GrowingInstructionPtrArray& cte if (mSrc[1].mTemp >= 0 && ctemps[mSrc[1].mTemp]) { InterInstruction* ains = ctemps[mSrc[1].mTemp]; - mSrc[1].mIntConst = ains->mIntValue; - mLinkerObject = ains->mLinkerObject; - mVarIndex = ains->mVarIndex; - mMemory = ains->mMemory; + mSrc[1].mIntConst = ains->mConst.mIntConst; + mSrc[1].mLinkerObject = ains->mConst.mLinkerObject; + mSrc[1].mVarIndex = ains->mConst.mVarIndex; + mSrc[1].mMemory = ains->mConst.mMemory; mSrc[1].mTemp = -1; return true; } @@ -1198,11 +1225,11 @@ bool InterInstruction::PropagateConstTemps(const GrowingInstructionPtrArray& cte { InterInstruction* ains = ctemps[mSrc[0].mTemp]; mCode = IC_CONSTANT; - mIntValue = ains->mIntValue; - mFloatValue = ains->mFloatValue; - mLinkerObject = ains->mLinkerObject; - mVarIndex = ains->mVarIndex; - mMemory = ains->mMemory; + mConst.mIntConst = ains->mConst.mIntConst; + mConst.mFloatConst = ains->mConst.mFloatConst; + mConst.mLinkerObject = ains->mConst.mLinkerObject; + mConst.mVarIndex = ains->mConst.mVarIndex; + mConst.mMemory = ains->mConst.mMemory; mSrc[0].mTemp = -1; return true; } @@ -1298,21 +1325,21 @@ bool InterInstruction::RemoveUnusedStoreInstructions(const GrowingVariableArray& if (mCode == IC_LOAD) { - if (mMemory == IM_LOCAL) + if (mSrc[0].mMemory == IM_LOCAL) { - requiredTemps += mVarIndex; + requiredTemps += mSrc[0].mVarIndex; } } else if (mCode == IC_STORE) { - if (mMemory == IM_LOCAL) + if (mSrc[1].mMemory == IM_LOCAL) { - if (localVars[mVarIndex]->mAliased) + if (localVars[mSrc[1].mVarIndex]->mAliased) ; - else if (requiredTemps[mVarIndex]) + else if (requiredTemps[mSrc[1].mVarIndex]) { - if (mSrc[1].mIntConst == 0 && mOperandSize == localVars[mVarIndex]->mSize) - requiredTemps -= mVarIndex; + if (mSrc[1].mIntConst == 0 && mSrc[1].mOperandSize == localVars[mSrc[1].mVarIndex]->mSize) + requiredTemps -= mSrc[1].mVarIndex; } else { @@ -1480,60 +1507,60 @@ void InterInstruction::CollectSimpleLocals(FastNumberSet& complexLocals, FastNum switch (mCode) { case IC_LOAD: - if (mMemory == IM_LOCAL && mSrc[0].mTemp < 0) + if (mSrc[0].mMemory == IM_LOCAL && mSrc[0].mTemp < 0) { - if (localTypes[mVarIndex] == IT_NONE || localTypes[mVarIndex] == mDst.mType) + if (localTypes[mSrc[0].mVarIndex] == IT_NONE || localTypes[mSrc[0].mVarIndex] == mDst.mType) { - localTypes[mVarIndex] = mDst.mType; - simpleLocals += mVarIndex; + localTypes[mSrc[0].mVarIndex] = mDst.mType; + simpleLocals += mSrc[0].mVarIndex; } else - complexLocals += mVarIndex; + complexLocals += mSrc[0].mVarIndex; } - else if ((mMemory == IM_PARAM || mMemory == IM_FPARAM) && mSrc[0].mTemp < 0) + else if ((mSrc[0].mMemory == IM_PARAM || mSrc[0].mMemory == IM_FPARAM) && mSrc[0].mTemp < 0) { - if (paramTypes[mVarIndex] == IT_NONE || paramTypes[mVarIndex] == mDst.mType) + if (paramTypes[mSrc[0].mVarIndex] == IT_NONE || paramTypes[mSrc[0].mVarIndex] == mDst.mType) { - paramTypes[mVarIndex] = mDst.mType; - simpleParams += mVarIndex; + paramTypes[mSrc[0].mVarIndex] = mDst.mType; + simpleParams += mSrc[0].mVarIndex; } else - complexParams += mVarIndex; + complexParams += mSrc[0].mVarIndex; } break; case IC_STORE: - if (mMemory == IM_LOCAL && mSrc[1].mTemp < 0) + if (mSrc[1].mMemory == IM_LOCAL && mSrc[1].mTemp < 0) { - if (localTypes[mVarIndex] == IT_NONE || localTypes[mVarIndex] == mSrc[0].mType) + if (localTypes[mSrc[1].mVarIndex] == IT_NONE || localTypes[mSrc[1].mVarIndex] == mSrc[0].mType) { - localTypes[mVarIndex] = mSrc[0].mType; - simpleLocals += mVarIndex; + localTypes[mSrc[1].mVarIndex] = mSrc[0].mType; + simpleLocals += mSrc[1].mVarIndex; } else - complexLocals += mVarIndex; + complexLocals += mSrc[1].mVarIndex; } - else if ((mMemory == IM_PARAM || mMemory == IM_FPARAM) && mSrc[1].mTemp < 0) + else if ((mSrc[1].mMemory == IM_PARAM || mSrc[1].mMemory == IM_FPARAM) && mSrc[1].mTemp < 0) { - if (paramTypes[mVarIndex] == IT_NONE || paramTypes[mVarIndex] == mSrc[0].mType) + if (paramTypes[mSrc[1].mVarIndex] == IT_NONE || paramTypes[mSrc[1].mVarIndex] == mSrc[0].mType) { - paramTypes[mVarIndex] = mSrc[0].mType; - simpleParams += mVarIndex; + paramTypes[mSrc[1].mVarIndex] = mSrc[0].mType; + simpleParams += mSrc[1].mVarIndex; } else - complexParams += mVarIndex; + complexParams += mSrc[1].mVarIndex; } break; case IC_LEA: - if (mMemory == IM_LOCAL && mSrc[1].mTemp < 0) - complexLocals += mVarIndex; - else if ((mMemory == IM_PARAM || mMemory == IM_FPARAM) && mSrc[1].mTemp < 0) - complexParams += mVarIndex; + if (mSrc[1].mMemory == IM_LOCAL && mSrc[1].mTemp < 0) + complexLocals += mSrc[1].mVarIndex; + else if ((mSrc[1].mMemory == IM_PARAM || mSrc[1].mMemory == IM_FPARAM) && mSrc[1].mTemp < 0) + complexParams += mSrc[1].mVarIndex; break; case IC_CONSTANT: - if (mDst.mType == IT_POINTER && mMemory == IM_LOCAL) - complexLocals += mVarIndex; - else if (mDst.mType == IT_POINTER && (mMemory == IM_PARAM || mMemory == IM_FPARAM)) - complexParams += mVarIndex; + if (mDst.mType == IT_POINTER && mConst.mMemory == IM_LOCAL) + complexLocals += mConst.mVarIndex; + else if (mDst.mType == IT_POINTER && (mConst.mMemory == IM_PARAM || mConst.mMemory == IM_FPARAM)) + complexParams += mConst.mVarIndex; break; } } @@ -1543,7 +1570,7 @@ void InterInstruction::SimpleLocalToTemp(int vindex, int temp) switch (mCode) { case IC_LOAD: - if (mMemory == IM_LOCAL && mSrc[0].mTemp < 0 && vindex == this->mVarIndex) + if (mSrc[0].mMemory == IM_LOCAL && mSrc[0].mTemp < 0 && vindex == mSrc[0].mVarIndex) { mCode = IC_LOAD_TEMPORARY; mSrc[0].mTemp = temp; @@ -1554,13 +1581,13 @@ void InterInstruction::SimpleLocalToTemp(int vindex, int temp) } break; case IC_STORE: - if (mMemory == IM_LOCAL && mSrc[1].mTemp < 0 && vindex == this->mVarIndex) + if (mSrc[1].mMemory == IM_LOCAL && mSrc[1].mTemp < 0 && vindex == mSrc[1].mVarIndex) { if (mSrc[0].mTemp < 0) { mCode = IC_CONSTANT; - mIntValue = mSrc[0].mIntConst; - mFloatValue = mSrc[0].mFloatConst; + mConst.mIntConst = mSrc[0].mIntConst; + mConst.mFloatConst = mSrc[0].mFloatConst; } else { @@ -1601,16 +1628,16 @@ void InterInstruction::Disassemble(FILE* file) fprintf(file, "CONV"); break; case IC_STORE: - fprintf(file, "STORE%c%d", memchars[mMemory], mOperandSize); + fprintf(file, "STORE%c%d", memchars[mSrc[1].mMemory], mSrc[1].mOperandSize); break; case IC_LOAD: - fprintf(file, "LOAD%c%d", memchars[mMemory], mOperandSize); + fprintf(file, "LOAD%c%d", memchars[mSrc[0].mMemory], mSrc[0].mOperandSize); break; case IC_COPY: - fprintf(file, "COPY%c", memchars[mMemory]); + fprintf(file, "COPY%c%c", memchars[mSrc[0].mMemory], memchars[mSrc[1].mMemory]); break; case IC_LEA: - fprintf(file, "LEA%c", memchars[mMemory]); + fprintf(file, "LEA%c", memchars[mSrc[1].mMemory]); break; case IC_TYPECAST: fprintf(file, "CAST"); @@ -1628,10 +1655,10 @@ void InterInstruction::Disassemble(FILE* file) fprintf(file, "JUMPF"); break; case IC_PUSH_FRAME: - fprintf(file, "PUSHF\t%d", int(mIntValue)); + fprintf(file, "PUSHF\t%d", int(mConst.mIntConst)); break; case IC_POP_FRAME: - fprintf(file, "POPF\t%d", int(mIntValue)); + fprintf(file, "POPF\t%d", int(mConst.mIntConst)); break; case IC_CALL: fprintf(file, "CALL"); @@ -1662,25 +1689,25 @@ void InterInstruction::Disassemble(FILE* file) 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(mSrc[1].mIntConst)); + fprintf(file, "V%d+%d, ", mSrc[1].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(mSrc[0].mIntConst)); + fprintf(file, "V%d+%d", mSrc[0].mVarIndex, int(mSrc[0].mIntConst)); if (this->mCode == IC_CONSTANT) { if (mDst.mType == IT_POINTER) { - fprintf(file, "C%c%d(%d:%d)", memchars[mMemory], mOperandSize, mVarIndex, int(mIntValue)); + fprintf(file, "C%c%d(%d:%d)", memchars[mConst.mMemory], mConst.mOperandSize, mConst.mVarIndex, int(mConst.mIntConst)); } else if (mDst.mType == IT_FLOAT) - fprintf(file, "C%f", mFloatValue); + fprintf(file, "C%f", mConst.mFloatConst); else { #ifdef _WIN32 - fprintf(file, "C%I64d", mIntValue); + fprintf(file, "C%I64d", mConst.mIntConst); #else - fprintf(file, "C%lld", mIntValue); + fprintf(file, "C%lld", mConst.mIntConst); #endif } } @@ -1814,10 +1841,10 @@ static void OptimizeAddress(InterInstruction * ins, const GrowingInstructionPtrA if (ains->mCode == IC_CONSTANT) { - ins->mSrc[offset].mIntConst = ains->mIntValue; - ins->mLinkerObject = ains->mLinkerObject; - ins->mVarIndex = ains->mVarIndex; - ins->mMemory = ains->mMemory; + ins->mSrc[offset].mIntConst = ains->mConst.mIntConst; + ins->mSrc[offset].mLinkerObject = ains->mConst.mLinkerObject; + ins->mSrc[offset].mVarIndex = ains->mConst.mVarIndex; + ins->mSrc[offset].mMemory = ains->mConst.mMemory; ins->mSrc[offset].mTemp = -1; } else if (ains->mCode == IC_LEA && ains->mSrc[0].mTemp < 0 && ains->mSrc[1].mTemp >= 0 && tvalue[ains->mSrc[1].mTemp]) @@ -1848,11 +1875,11 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI case IC_ASSEMBLER: if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - 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].mMemory = tvalue[ins->mSrc[0].mTemp]->mConst.mMemory; + ins->mSrc[0].mLinkerObject = tvalue[ins->mSrc[0].mTemp]->mConst.mLinkerObject; + ins->mSrc[0].mVarIndex = tvalue[ins->mSrc[0].mTemp]->mConst.mVarIndex; + ins->mSrc[0].mOperandSize = tvalue[ins->mSrc[0].mTemp]->mConst.mOperandSize; + ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst; ins->mSrc[0].mTemp = -1; } @@ -1864,21 +1891,21 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI { case IT_FLOAT: ins->mCode = IC_CONSTANT; - ins->mFloatValue = tvalue[ins->mSrc[0].mTemp]->mFloatValue; + ins->mConst.mFloatConst = tvalue[ins->mSrc[0].mTemp]->mConst.mFloatConst; ins->mSrc[0].mTemp = -1; break; case IT_POINTER: ins->mCode = IC_CONSTANT; - 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->mConst.mMemory = tvalue[ins->mSrc[0].mTemp]->mConst.mMemory; + ins->mConst.mLinkerObject = tvalue[ins->mSrc[0].mTemp]->mConst.mLinkerObject; + ins->mConst.mVarIndex = tvalue[ins->mSrc[0].mTemp]->mConst.mVarIndex; + ins->mConst.mIntConst = tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst; + ins->mConst.mOperandSize = tvalue[ins->mSrc[0].mTemp]->mConst.mOperandSize; ins->mSrc[0].mTemp = -1; break; default: ins->mCode = IC_CONSTANT; - ins->mIntValue = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mConst.mIntConst = tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst; ins->mSrc[0].mTemp = -1; break; } @@ -1894,13 +1921,13 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI switch (ins->mSrc[0].mType) { case IT_FLOAT: - ins->mSrc[0].mFloatConst = tvalue[ins->mSrc[0].mTemp]->mFloatValue; + ins->mSrc[0].mFloatConst = tvalue[ins->mSrc[0].mTemp]->mConst.mFloatConst; ins->mSrc[0].mTemp = -1; break; case IT_POINTER: break; default: - ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst; ins->mSrc[0].mTemp = -1; break; } @@ -1914,15 +1941,15 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI { ins->mCode = IC_CONSTANT; 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->mConst.mMemory = tvalue[ins->mSrc[1].mTemp]->mConst.mMemory; + ins->mConst.mLinkerObject = tvalue[ins->mSrc[1].mTemp]->mConst.mLinkerObject; + ins->mConst.mVarIndex = tvalue[ins->mSrc[1].mTemp]->mConst.mVarIndex; + ins->mConst.mIntConst = tvalue[ins->mSrc[1].mTemp]->mConst.mIntConst + tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst; + ins->mConst.mOperandSize = tvalue[ins->mSrc[1].mTemp]->mConst.mOperandSize; ins->mSrc[0].mTemp = -1; ins->mSrc[1].mTemp = -1; } - else if (tvalue[ins->mSrc[0].mTemp]->mIntValue == 0) + else if (tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst == 0) { ins->mCode = IC_LOAD_TEMPORARY; ins->mSrc[0].mType = ins->mSrc[1].mType; @@ -1932,17 +1959,17 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI } else { - ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst; ins->mSrc[0].mTemp = -1; } } - 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) + 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]->mConst.mMemory == IM_GLOBAL) { - 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].mMemory = tvalue[ins->mSrc[1].mTemp]->mConst.mMemory; + ins->mSrc[1].mLinkerObject = tvalue[ins->mSrc[1].mTemp]->mConst.mLinkerObject; + ins->mSrc[1].mVarIndex = tvalue[ins->mSrc[1].mTemp]->mConst.mVarIndex; + ins->mSrc[1].mIntConst = tvalue[ins->mSrc[1].mTemp]->mConst.mIntConst; + ins->mSrc[1].mOperandSize = tvalue[ins->mSrc[1].mTemp]->mConst.mOperandSize; ins->mSrc[1].mTemp = -1; } break; @@ -1958,9 +1985,9 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI { ins->mCode = IC_CONSTANT; ins->mDst.mType = IT_POINTER; - ins->mMemory = IM_ABSOLUTE; - ins->mVarIndex = 0; - ins->mIntValue = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mConst.mMemory = IM_ABSOLUTE; + ins->mConst.mVarIndex = 0; + ins->mConst.mIntConst = tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst; ins->mSrc[0].mTemp = -1; } } @@ -1975,7 +2002,7 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI case IT_POINTER: break; default: - ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst; ins->mSrc[0].mTemp = -1; break; } @@ -1990,13 +2017,13 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI 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->mSrc[1].mTemp]->mFloatValue, tvalue[ins->mSrc[0].mTemp]->mFloatValue); + ins->mConst.mFloatConst = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mConst.mFloatConst, tvalue[ins->mSrc[0].mTemp]->mConst.mFloatConst); ins->mSrc[0].mTemp = -1; ins->mSrc[1].mTemp = -1; } else { - ins->mSrc[1].mFloatConst = tvalue[ins->mSrc[1].mTemp]->mFloatValue; + ins->mSrc[1].mFloatConst = tvalue[ins->mSrc[1].mTemp]->mConst.mFloatConst; ins->mSrc[1].mTemp = -1; if (ins->mOperator == IA_ADD && ins->mSrc[1].mFloatConst == 0) @@ -2014,7 +2041,7 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI else if (ins->mSrc[1].mFloatConst == 0.0) { ins->mCode = IC_CONSTANT; - ins->mFloatValue = 0.0; + ins->mConst.mFloatConst = 0.0; ins->mSrc[0].mTemp = -1; ins->mSrc[1].mTemp = -1; } @@ -2029,7 +2056,7 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI } else if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - ins->mSrc[0].mFloatConst = tvalue[ins->mSrc[0].mTemp]->mFloatValue; + ins->mSrc[0].mFloatConst = tvalue[ins->mSrc[0].mTemp]->mConst.mFloatConst; ins->mSrc[0].mTemp = -1; if (ins->mOperator == IA_ADD && ins->mSrc[0].mFloatConst == 0) @@ -2051,7 +2078,7 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI else if (ins->mSrc[0].mFloatConst == 0.0) { ins->mCode = IC_CONSTANT; - ins->mFloatValue = 0.0; + ins->mConst.mFloatConst = 0.0; ins->mSrc[0].mTemp = -1; ins->mSrc[1].mTemp = -1; } @@ -2072,13 +2099,13 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI 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->mSrc[1].mTemp]->mIntValue, tvalue[ins->mSrc[0].mTemp]->mIntValue); + ins->mConst.mIntConst = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mConst.mIntConst, tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst); ins->mSrc[0].mTemp = -1; ins->mSrc[1].mTemp = -1; } else { - ins->mSrc[1].mIntConst = tvalue[ins->mSrc[1].mTemp]->mIntValue; + ins->mSrc[1].mIntConst = tvalue[ins->mSrc[1].mTemp]->mConst.mIntConst; ins->mSrc[1].mTemp = -1; #if 1 if (ins->mOperator == IA_ADD && ins->mSrc[1].mIntConst == 0) @@ -2124,7 +2151,7 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI } else if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst; ins->mSrc[0].mTemp = -1; if (ins->mOperator == IA_ADD && ins->mSrc[0].mIntConst == 0) @@ -2212,7 +2239,7 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI 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->mSrc[0].mTemp]->mFloatValue); + ins->mConst.mFloatConst = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[0].mTemp]->mConst.mFloatConst); ins->mSrc[0].mTemp = -1; } break; @@ -2230,7 +2257,7 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI 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->mSrc[1].mTemp]->mFloatValue, tvalue[ins->mSrc[0].mTemp]->mFloatValue); + ins->mConst.mIntConst = ConstantRelationalFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mConst.mFloatConst, tvalue[ins->mSrc[0].mTemp]->mConst.mFloatConst); ins->mDst.mType = IT_BOOL; ins->mSrc[0].mTemp = -1; ins->mSrc[1].mTemp = -1; @@ -2239,17 +2266,18 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI { if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT) { - ins->mSrc[1].mFloatConst = tvalue[ins->mSrc[1].mTemp]->mFloatValue; + ins->mSrc[1].mFloatConst = tvalue[ins->mSrc[1].mTemp]->mConst.mFloatConst; ins->mSrc[1].mTemp = -1; } else if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - ins->mSrc[0].mFloatConst = tvalue[ins->mSrc[0].mTemp]->mFloatValue; + ins->mSrc[0].mFloatConst = tvalue[ins->mSrc[0].mTemp]->mConst.mFloatConst; ins->mSrc[0].mTemp = -1; } } break; case IT_POINTER: +#if 0 if (ins->mOperator == IA_CMPEQ || ins->mOperator == IA_CMPNE) { if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) @@ -2263,13 +2291,14 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI ins->mSrc[1].mTemp = -1; } } +#endif break; default: 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->mSrc[1].mTemp]->mIntValue, tvalue[ins->mSrc[0].mTemp]->mIntValue); + ins->mConst.mIntConst = ConstantFolding(ins->mOperator, tvalue[ins->mSrc[1].mTemp]->mConst.mIntConst, tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst); ins->mSrc[0].mTemp = -1; ins->mSrc[1].mTemp = -1; } @@ -2277,12 +2306,12 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI { if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT) { - ins->mSrc[1].mIntConst = tvalue[ins->mSrc[1].mTemp]->mIntValue; + ins->mSrc[1].mIntConst = tvalue[ins->mSrc[1].mTemp]->mConst.mIntConst; ins->mSrc[1].mTemp = -1; } else if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst; ins->mSrc[0].mTemp = -1; } } @@ -2292,7 +2321,7 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI case IC_BRANCH: if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT) { - ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mIntValue; + ins->mSrc[0].mIntConst = tvalue[ins->mSrc[0].mTemp]->mConst.mIntConst; ins->mSrc[0].mTemp = -1; } break; @@ -2761,7 +2790,7 @@ void InterCodeBasicBlock::PerformValueForwarding(const GrowingInstructionPtrArra cai->mCode = IC_CONSTANT; cai->mDst.mTemp = spareTemps++; cai->mDst.mType = IT_INT16; - cai->mIntValue = ai0->mIntValue * mi1->mIntValue; + cai->mConst.mIntConst = ai0->mConst.mIntConst * mi1->mConst.mIntConst; mInstructions.Insert(i, cai); ltvalue[cai->mDst.mTemp] = nullptr; @@ -2812,7 +2841,7 @@ void InterCodeBasicBlock::PerformValueForwarding(const GrowingInstructionPtrArra cai->mCode = IC_CONSTANT; cai->mDst.mTemp = spareTemps++; cai->mDst.mType = IT_INT16; - cai->mIntValue = ai0->mIntValue + mi0->mIntValue; + cai->mConst.mIntConst = ai0->mConst.mIntConst + mi0->mConst.mIntConst; mInstructions.Insert(i, cai); ltvalue[cai->mDst.mTemp] = nullptr; @@ -2840,11 +2869,11 @@ void InterCodeBasicBlock::PerformValueForwarding(const GrowingInstructionPtrArra if (li1->mCode != IC_CONSTANT && li0->mCode == IC_BINARY_OPERATOR && li0->mOperator == IA_ADD) { InterInstruction* ai0 = ltvalue[li0->mSrc[0].mTemp], * ai1 = ltvalue[li0->mSrc[1].mTemp]; - if (ai0 && ai1 && ai0->mCode == IC_CONSTANT && ai0->mIntValue >= 0) + if (ai0 && ai1 && ai0->mCode == IC_CONSTANT && ai0->mConst.mIntConst >= 0) { InterInstruction* nai = new InterInstruction(); nai->mCode = IC_LEA; - nai->mMemory = IM_INDIRECT; + nai->mSrc[1].mMemory = IM_INDIRECT; nai->mSrc[0].mTemp = li0->mSrc[1].mTemp; nai->mSrc[0].mType = IT_INT16; nai->mSrc[1].mTemp = ins->mSrc[1].mTemp; @@ -2868,13 +2897,13 @@ void InterCodeBasicBlock::PerformValueForwarding(const GrowingInstructionPtrArra else if (li0->mCode == IC_CONSTANT && li1->mCode == IC_LEA) { InterInstruction* ai0 = ltvalue[li1->mSrc[0].mTemp], * ai1 = ltvalue[li1->mSrc[1].mTemp]; - if (ai0 && ai1 && ai0->mCode == IC_CONSTANT && ai0->mIntValue >= 0) + if (ai0 && ai1 && ai0->mCode == IC_CONSTANT && ai0->mConst.mIntConst >= 0) { InterInstruction* cai = new InterInstruction(); cai->mCode = IC_CONSTANT; cai->mDst.mTemp = spareTemps++; cai->mDst.mType = IT_INT16; - cai->mIntValue = ai0->mIntValue + li0->mIntValue; + cai->mConst.mIntConst = ai0->mConst.mIntConst + li0->mConst.mIntConst; mInstructions.Insert(i, cai); ins->mSrc[0].mTemp = cai->mDst.mTemp; @@ -3175,15 +3204,27 @@ void InterCodeBasicBlock::MapVariables(GrowingVariableArray& globalVars, Growing switch (mInstructions[i]->mCode) { case IC_CONSTANT: - if (mInstructions[i]->mDst.mType != IT_POINTER) - break; + if (mInstructions[i]->mDst.mType == IT_POINTER) + { + if (mInstructions[i]->mConst.mMemory == IM_LOCAL) + { + localVars[mInstructions[i]->mConst.mVarIndex]->mUsed = true; + } + } + break; case IC_STORE: + if (mInstructions[i]->mSrc[1].mMemory == IM_LOCAL) + { + localVars[mInstructions[i]->mSrc[1].mVarIndex]->mUsed = true; + } + break; + case IC_LOAD: case IC_CALL_NATIVE: - if (mInstructions[i]->mMemory == IM_LOCAL) + if (mInstructions[i]->mSrc[0].mMemory == IM_LOCAL) { - localVars[mInstructions[i]->mVarIndex]->mUsed = true; + localVars[mInstructions[i]->mSrc[0].mVarIndex]->mUsed = true; } break; } @@ -3209,8 +3250,8 @@ void InterCodeBasicBlock::CollectOuterFrame(int level, int& size, bool &inner, b level++; if (level == 1) { - if (mInstructions[i]->mIntValue > size) - size = mInstructions[i]->mIntValue; + if (mInstructions[i]->mConst.mIntConst > size) + size = mInstructions[i]->mConst.mIntConst; mInstructions[i]->mCode = IC_NONE; } else @@ -3280,16 +3321,40 @@ static bool CanBypassStore(const InterInstruction * sins, const InterInstruction if (bins->mCode == IC_COPY || bins->mCode == IC_PUSH_FRAME) return false; + InterMemory sm = IM_NONE, bm = IM_NONE; + int bi = -1, si = -1; + if (sins->mCode == IC_LOAD) + { + sm = sins->mSrc[0].mMemory; + si = sins->mSrc[0].mVarIndex; + } + else if (sins->mCode == IC_LEA || sins->mCode == IC_STORE) + { + sm = sins->mSrc[1].mMemory; + si = sins->mSrc[1].mVarIndex; + } + + if (bins->mCode == IC_LOAD) + { + bm = bins->mSrc[0].mMemory; + bi = bins->mSrc[0].mVarIndex; + } + else if (bins->mCode == IC_LEA || bins->mCode == IC_STORE) + { + bm = bins->mSrc[1].mMemory; + bi = bins->mSrc[1].mVarIndex; + } + // Check ambiguity if (bins->mCode == IC_STORE || bins->mCode == IC_LOAD) { - if (sins->mMemory == IM_LOCAL) + if (sm == IM_LOCAL) { - if (bins->mMemory == IM_PARAM || bins->mMemory == IM_GLOBAL || bins->mMemory == IM_FPARAM) + if (bm == IM_PARAM || bm == IM_GLOBAL || bm == IM_FPARAM) ; - else if (bins->mMemory == IM_LOCAL) + else if (bm == IM_LOCAL) { - if (bins->mVarIndex == sins->mVarIndex) + if (bi == si) return false; } else @@ -3299,7 +3364,7 @@ static bool CanBypassStore(const InterInstruction * sins, const InterInstruction return false; } - if (sins->mMemory == IM_FRAME && (bins->mCode == IC_PUSH_FRAME || bins->mCode == IC_POP_FRAME)) + if (sm == IM_FRAME && (bins->mCode == IC_PUSH_FRAME || bins->mCode == IC_POP_FRAME)) return false; // Side effects @@ -3307,8 +3372,12 @@ static bool CanBypassStore(const InterInstruction * sins, const InterInstruction return false; // True data dependency - if (bins->mDst.mTemp >= 0 && (bins->mDst.mTemp == sins->mSrc[0].mTemp || bins->mDst.mTemp == sins->mSrc[1].mTemp)) - return false; + if (bins->mDst.mTemp >= 0) + { + for (int i = 0; i < sins->mNumOperands; i++) + if (bins->mDst.mTemp == sins->mSrc[i].mTemp) + return false; + } return true; } @@ -3375,10 +3444,10 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa { if (sins->mSrc[1].mTemp >= 0) { - if (ins->mMemory != IM_PARAM || aliasedParams[ins->mVarIndex]) + if (ins->mSrc[0].mMemory != IM_PARAM || aliasedParams[ins->mSrc[0].mVarIndex]) ins->mInvariant = false; } - else if (ins->mMemory == sins->mMemory && ins->mVarIndex == sins->mVarIndex && ins->mLinkerObject == sins->mLinkerObject) + else if (ins->mSrc[0].mMemory == sins->mSrc[1].mMemory && ins->mSrc[0].mVarIndex == sins->mSrc[1].mVarIndex && ins->mSrc[0].mLinkerObject == sins->mSrc[1].mLinkerObject) { ins->mInvariant = false; } @@ -3671,24 +3740,41 @@ void InterCodeBasicBlock::CollectVariables(GrowingVariableArray& globalVars, Gro { bool found = false; - switch (mInstructions[i]->mCode) + InterInstruction* ins = mInstructions[i]; + + switch (ins->mCode) { - case IC_STORE: - case IC_LOAD: case IC_CONSTANT: - case IC_CALL_NATIVE: - case IC_ASSEMBLER: - if (mInstructions[i]->mMemory == IM_LOCAL) + if (ins->mConst.mMemory == IM_LOCAL) { - int varIndex = mInstructions[i]->mVarIndex; + int varIndex = ins->mConst.mVarIndex; if (!localVars[varIndex]) localVars[varIndex] = new InterVariable; - int size = mInstructions[i]->mOperandSize + mInstructions[i]->mIntValue; + int size = ins->mConst.mOperandSize + ins->mConst.mIntConst; if (size > localVars[varIndex]->mSize) localVars[varIndex]->mSize = size; - if (mInstructions[i]->mCode == IC_CONSTANT) - localVars[varIndex]->mAliased = true; + localVars[varIndex]->mAliased = true; + } + break; + + case IC_STORE: + case IC_LOAD: + case IC_CALL_NATIVE: + case IC_ASSEMBLER: + + for(int j=0; jmNumOperands; j++) + { + if (ins->mSrc[j].mMemory == IM_LOCAL) + { + int varIndex = ins->mSrc[j].mVarIndex; + if (!localVars[varIndex]) + localVars[varIndex] = new InterVariable; + + int size = ins->mSrc[j].mOperandSize + ins->mSrc[j].mIntConst; + if (size > localVars[varIndex]->mSize) + localVars[varIndex]->mSize = size; + } } break; } diff --git a/oscar64/InterCode.h b/oscar64/InterCode.h index 27059fc..3b295e4 100644 --- a/oscar64/InterCode.h +++ b/oscar64/InterCode.h @@ -289,15 +289,27 @@ public: class InterOperand { public: - int mTemp; - InterType mType; - bool mFinal; - int64 mIntConst; - double mFloatConst; + int mTemp; + InterType mType; + bool mFinal; + int64 mIntConst; + double mFloatConst; + int mVarIndex, mOperandSize; + LinkerObject * mLinkerObject; + InterMemory mMemory; InterOperand(void) - : mTemp(INVALID_TEMPORARY), mType(IT_NONE), mFinal(false), mIntConst(0), mFloatConst(0) + : mTemp(INVALID_TEMPORARY), mType(IT_NONE), mFinal(false), mIntConst(0), mFloatConst(0), mVarIndex(-1), mOperandSize(0), mLinkerObject(nullptr), mMemory(IM_NONE) {} +#if 0 + bool Same(const InterOperand& op) const + { + if (mType != op.mType || mTemp != op.mTemp) + return false; + + return true; + } +#endif }; class InterInstruction @@ -306,14 +318,10 @@ public: InterCode mCode; InterOperand mSrc[8]; InterOperand mDst; - InterMemory mMemory; + InterOperand mConst; InterOperator mOperator; - int mOperandSize, mNumOperands; - int mVarIndex; - int64 mIntValue; - double mFloatValue; + int mNumOperands; Location mLocation; - LinkerObject * mLinkerObject; bool mInUse, mInvariant, mVolatile; diff --git a/oscar64/InterCodeGenerator.cpp b/oscar64/InterCodeGenerator.cpp index 6947ba7..b431f29 100644 --- a/oscar64/InterCodeGenerator.cpp +++ b/oscar64/InterCodeGenerator.cpp @@ -43,12 +43,12 @@ InterCodeGenerator::ExValue InterCodeGenerator::Dereference(InterCodeProcedure* { InterInstruction * ins = new InterInstruction(); ins->mCode = IC_LOAD; - ins->mMemory = IM_INDIRECT; + ins->mSrc[0].mMemory = IM_INDIRECT; 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; + ins->mSrc[0].mOperandSize = v.mReference == 1 ? v.mType->mSize : 2; if (v.mType->mFlags & DTF_VOLATILE) ins->mVolatile = true; block->Append(ins); @@ -575,13 +575,13 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* { if (dec->mInteger < -128 || dec->mInteger > 127) mErrors->Error(dec->mLocation, EWARN_CONSTANT_TRUNCATED, "Integer constant truncated"); - ins->mIntValue = int8(dec->mInteger); + ins->mConst.mIntConst = int8(dec->mInteger); } else { if (dec->mInteger < 0 || dec->mInteger > 255) mErrors->Error(dec->mLocation, EWARN_CONSTANT_TRUNCATED, "Unsigned integer constant truncated"); - ins->mIntValue = uint8(dec->mInteger); + ins->mConst.mIntConst = uint8(dec->mInteger); } } else if (ins->mDst.mType == IT_INT16) @@ -590,13 +590,13 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* { if (dec->mInteger < -32768 || dec->mInteger > 32767) mErrors->Error(dec->mLocation, EWARN_CONSTANT_TRUNCATED, "Integer constant truncated"); - ins->mIntValue = int16(dec->mInteger); + ins->mConst.mIntConst = int16(dec->mInteger); } else { if (dec->mInteger < 0 || dec->mInteger > 65535) mErrors->Error(dec->mLocation, EWARN_CONSTANT_TRUNCATED, "Unsigned integer constant truncated"); - ins->mIntValue = uint16(dec->mInteger); + ins->mConst.mIntConst = uint16(dec->mInteger); } } else if (ins->mDst.mType == IT_INT32) @@ -605,18 +605,18 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* { if (dec->mInteger < -2147483648LL || dec->mInteger > 2147483647LL) mErrors->Error(dec->mLocation, EWARN_CONSTANT_TRUNCATED, "Integer constant truncated"); - ins->mIntValue = int32(dec->mInteger); + ins->mConst.mIntConst = int32(dec->mInteger); } else { if (dec->mInteger < 0 || dec->mInteger > 4294967296LL) mErrors->Error(dec->mLocation, EWARN_CONSTANT_TRUNCATED, "Unsigned integer constant truncated"); - ins->mIntValue = uint32(dec->mInteger); + ins->mConst.mIntConst = uint32(dec->mInteger); } } else { - ins->mIntValue = dec->mInteger; + ins->mConst.mIntConst = dec->mInteger; } block->Append(ins); return ExValue(dec->mBase, ins->mDst.mTemp); @@ -629,7 +629,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ins->mCode = IC_CONSTANT; ins->mDst.mType = InterTypeOf(dec->mBase); ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); - ins->mFloatValue = dec->mNumber; + ins->mConst.mFloatConst = dec->mNumber; block->Append(ins); return ExValue(dec->mBase, ins->mDst.mTemp); @@ -641,8 +641,8 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ins->mCode = IC_CONSTANT; ins->mDst.mType = IT_POINTER; ins->mDst.mTemp = proc->AddTemporary(IT_POINTER); - ins->mIntValue = dec->mInteger; - ins->mMemory = IM_ABSOLUTE; + ins->mConst.mIntConst = dec->mInteger; + ins->mConst.mMemory = IM_ABSOLUTE; block->Append(ins); return ExValue(dec->mBase, ins->mDst.mTemp); @@ -659,10 +659,10 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ins->mCode = IC_CONSTANT; 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; + ins->mConst.mVarIndex = dec->mVarIndex; + ins->mConst.mLinkerObject = dec->mLinkerObject; + ins->mConst.mMemory = IM_PROCEDURE; + ins->mConst.mIntConst = 0; block->Append(ins); return ExValue(dec->mBase, ins->mDst.mTemp); @@ -693,10 +693,10 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ins->mCode = IC_CONSTANT; 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; + ins->mConst.mIntConst = 0; + ins->mConst.mVarIndex = dec->mVarIndex; + ins->mConst.mLinkerObject = dec->mLinkerObject; + ins->mConst.mMemory = IM_GLOBAL; block->Append(ins); return ExValue(dec->mBase, ins->mDst.mTemp, 1); } @@ -724,10 +724,10 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ins->mCode = IC_CONSTANT; 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; + ins->mConst.mIntConst = 0; + ins->mConst.mVarIndex = dec->mVarIndex; + ins->mConst.mLinkerObject = dec->mLinkerObject; + ins->mConst.mMemory = IM_GLOBAL; block->Append(ins); return ExValue(dec->mBase, ins->mDst.mTemp, 1); } @@ -746,41 +746,41 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ins->mCode = IC_CONSTANT; 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; + ins->mConst.mOperandSize = dec->mSize; + ins->mConst.mIntConst = dec->mOffset; + ins->mConst.mVarIndex = dec->mVarIndex; int ref = 1; if (dec->mType == DT_ARGUMENT) { if (inlineMapper) { - ins->mMemory = IM_LOCAL; - ins->mVarIndex = inlineMapper->mParams[ins->mVarIndex]; + ins->mConst.mMemory = IM_LOCAL; + ins->mConst.mVarIndex = inlineMapper->mParams[dec->mOffset]; } else if (procType->mFlags & DTF_FASTCALL) - ins->mMemory = IM_FPARAM; + ins->mConst.mMemory = IM_FPARAM; else - ins->mMemory = IM_PARAM; + ins->mConst.mMemory = IM_PARAM; if (dec->mBase->mType == DT_TYPE_ARRAY) { ref = 2; - ins->mOperandSize = 2; + ins->mConst.mOperandSize = 2; } } else if (dec->mFlags & DTF_GLOBAL) { InitGlobalVariable(proc->mModule, dec); - ins->mMemory = IM_GLOBAL; - ins->mLinkerObject = dec->mLinkerObject; - ins->mVarIndex = dec->mVarIndex; + ins->mConst.mMemory = IM_GLOBAL; + ins->mConst.mLinkerObject = dec->mLinkerObject; + ins->mConst.mVarIndex = dec->mVarIndex; } else { if (inlineMapper) - ins->mVarIndex += inlineMapper->mVarIndex; + ins->mConst.mVarIndex += inlineMapper->mVarIndex; - ins->mMemory = IM_LOCAL; + ins->mConst.mMemory = IM_LOCAL; } block->Append(ins); @@ -819,12 +819,12 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * ins = new InterInstruction(); ins->mCode = IC_COPY; - ins->mMemory = IM_INDIRECT; + ins->mConst.mMemory = IM_INDIRECT; 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; + ins->mConst.mOperandSize = vl.mType->mSize; block->Append(ins); } else @@ -852,11 +852,11 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* if (exp->mToken == TK_ASSIGN_ADD) { - cins->mIntValue = vl.mType->mBase->mSize; + cins->mConst.mIntConst = vl.mType->mBase->mSize; } else if (exp->mToken == TK_ASSIGN_SUB) { - cins->mIntValue = -vl.mType->mBase->mSize; + cins->mConst.mIntConst = -vl.mType->mBase->mSize; } else mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Invalid pointer assignment"); @@ -883,7 +883,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * ains = new InterInstruction(); ains->mCode = IC_LEA; - ains->mMemory = IM_INDIRECT; + ains->mSrc[1].mMemory = IM_INDIRECT; ains->mSrc[0].mType = IT_INT16; ains->mSrc[0].mTemp = mins->mDst.mTemp; ains->mSrc[1].mType = IT_POINTER; @@ -968,12 +968,12 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* } ins->mCode = IC_STORE; - ins->mMemory = IM_INDIRECT; + ins->mSrc[1].mMemory = IM_INDIRECT; 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; + ins->mSrc[1].mOperandSize = vl.mType->mSize; block->Append(ins); } } @@ -998,7 +998,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * cins = new InterInstruction(); cins->mCode = IC_CONSTANT; - cins->mIntValue = vl.mType->mBase->mSize; + cins->mConst.mIntConst = vl.mType->mBase->mSize; cins->mDst.mType = IT_INT16; cins->mDst.mTemp = proc->AddTemporary(cins->mDst.mType); block->Append(cins); @@ -1016,7 +1016,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * ains = new InterInstruction(); ains->mCode = IC_LEA; - ains->mMemory = IM_INDIRECT; + ains->mSrc[1].mMemory = IM_INDIRECT; ains->mSrc[0].mType = IT_INT16; ains->mSrc[0].mTemp = mins->mDst.mTemp; ains->mSrc[1].mType = IT_POINTER; @@ -1038,14 +1038,14 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * cins = new InterInstruction(); cins->mCode = IC_CONSTANT; - cins->mIntValue = exp->mDecValue->mOffset; + cins->mConst.mIntConst = exp->mDecValue->mOffset; 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->mSrc[1].mMemory = IM_INDIRECT; ains->mSrc[0].mType = IT_INT16; ains->mSrc[0].mTemp = cins->mDst.mTemp; ains->mSrc[1].mType = IT_POINTER; @@ -1086,11 +1086,11 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* if (exp->mToken == TK_ADD) { - cins->mIntValue = vl.mType->mBase->mSize; + cins->mConst.mIntConst = vl.mType->mBase->mSize; } else if (exp->mToken == TK_SUB) { - cins->mIntValue = -vl.mType->mBase->mSize; + cins->mConst.mIntConst = -vl.mType->mBase->mSize; } else mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Invalid pointer operation"); @@ -1113,7 +1113,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* block->Append(mins); ins->mCode = IC_LEA; - ins->mMemory = IM_INDIRECT; + ins->mSrc[1].mMemory = IM_INDIRECT; ins->mSrc[0].mType = IT_INT16; ins->mSrc[0].mTemp = mins->mDst.mTemp; ins->mSrc[1].mType = IT_POINTER; @@ -1143,7 +1143,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction * cins = new InterInstruction(); cins->mCode = IC_CONSTANT; - cins->mIntValue = vl.mType->mBase->mSize; + cins->mConst.mIntConst = vl.mType->mBase->mSize; cins->mDst.mType = IT_INT16; cins->mDst.mTemp = proc->AddTemporary(cins->mDst.mType); block->Append(cins); @@ -1290,9 +1290,9 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* 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); + cins->mConst.mIntConst = exp->mToken == TK_INC ? vdl.mType->mBase->mSize : -(vdl.mType->mBase->mSize); else if (vdl.mType->IsNumericType()) - cins->mIntValue = exp->mToken == TK_INC ? 1 : -1; + cins->mConst.mIntConst = exp->mToken == TK_INC ? 1 : -1; else mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Not a numeric value or pointer"); @@ -1309,12 +1309,12 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* block->Append(ains); sins->mCode = IC_STORE; - sins->mMemory = IM_INDIRECT; + sins->mSrc[1].mMemory = IM_INDIRECT; 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; + sins->mSrc[1].mOperandSize = vl.mType->mSize; block->Append(sins); return ExValue(vdl.mType, ains->mDst.mTemp); @@ -1342,9 +1342,9 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* 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); + cins->mConst.mIntConst = exp->mToken == TK_INC ? vdl.mType->mBase->mSize : -(vdl.mType->mBase->mSize); else if (vdl.mType->IsNumericType()) - cins->mIntValue = exp->mToken == TK_INC ? 1 : -1; + cins->mConst.mIntConst = exp->mToken == TK_INC ? 1 : -1; else mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Not a numeric value or pointer"); block->Append(cins); @@ -1360,12 +1360,12 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* block->Append(ains); sins->mCode = IC_STORE; - sins->mMemory = IM_INDIRECT; + sins->mSrc[1].mMemory = IM_INDIRECT; 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; + sins->mSrc[1].mOperandSize = vl.mType->mSize; block->Append(sins); return ExValue(vdl.mType, vdl.mTemp); @@ -1613,8 +1613,8 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ains->mCode = IC_CONSTANT; ains->mDst.mType = IT_POINTER; ains->mDst.mTemp = proc->AddTemporary(ains->mDst.mType); - ains->mMemory = IM_LOCAL; - ains->mVarIndex = nindex; + ains->mConst.mMemory = IM_LOCAL; + ains->mConst.mVarIndex = nindex; if (pdec) { @@ -1623,10 +1623,10 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* vdec->mVarIndex = nindex; vdec->mBase = pdec->mBase; if (pdec->mBase->mType == DT_TYPE_ARRAY) - ains->mOperandSize = 2; + ains->mConst.mOperandSize = 2; else - ains->mOperandSize = pdec->mSize; - vdec->mSize = ains->mOperandSize; + ains->mConst.mOperandSize = pdec->mSize; + vdec->mSize = ains->mConst.mOperandSize; vdec->mIdent = pdec->mIdent; } else @@ -1670,7 +1670,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction* wins = new InterInstruction(); wins->mCode = IC_STORE; - wins->mMemory = IM_INDIRECT; + wins->mSrc[1].mMemory = IM_INDIRECT; wins->mSrc[0].mType = InterTypeOf(vr.mType);; wins->mSrc[0].mTemp = vr.mTemp; wins->mSrc[1].mType = IT_POINTER; @@ -1678,14 +1678,14 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* if (pdec) { if (pdec->mBase->mType == DT_TYPE_ARRAY) - wins->mOperandSize = 2; + wins->mSrc[1].mOperandSize = 2; else - wins->mOperandSize = pdec->mSize; + wins->mSrc[1].mOperandSize = pdec->mSize; } else if (vr.mType->mSize > 2 && vr.mType->mType != DT_TYPE_ARRAY) - wins->mOperandSize = vr.mType->mSize; + wins->mSrc[1].mOperandSize = vr.mType->mSize; else - wins->mOperandSize = 2; + wins->mSrc[1].mOperandSize = 2; block->Append(wins); if (pdec) @@ -1722,10 +1722,10 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ins->mCode = IC_CONSTANT; 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; - ins->mMemory = IM_LOCAL; + ins->mConst.mOperandSize = rdec->mSize; + ins->mConst.mIntConst = rdec->mOffset; + ins->mConst.mVarIndex = rdec->mVarIndex; + ins->mConst.mMemory = IM_LOCAL; block->Append(ins); @@ -1757,7 +1757,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* { fins = new InterInstruction(); fins->mCode = IC_PUSH_FRAME; - fins->mIntValue = atotal; + fins->mConst.mIntConst = atotal; block->Append(fins); } @@ -1776,18 +1776,18 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ains->mDst.mTemp = proc->AddTemporary(ains->mDst.mType); if (pdec) { - ains->mVarIndex = pdec->mVarIndex; - ains->mIntValue = pdec->mOffset; + ains->mConst.mVarIndex = pdec->mVarIndex; + ains->mConst.mIntConst = pdec->mOffset; if (pdec->mBase->mType == DT_TYPE_ARRAY) - ains->mOperandSize = 2; + ains->mConst.mOperandSize = 2; else - ains->mOperandSize = pdec->mSize; + ains->mConst.mOperandSize = pdec->mSize; } else if (ftype->mFlags & DTF_VARIADIC) { - ains->mVarIndex = atotal; - ains->mIntValue = 0; - ains->mOperandSize = 2; + ains->mConst.mVarIndex = atotal; + ains->mConst.mIntConst = 0; + ains->mConst.mOperandSize = 2; } else { @@ -1796,11 +1796,11 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* if (ftype->mFlags & DTF_FASTCALL) { - ains->mMemory = IM_FPARAM; - ains->mIntValue = 0; + ains->mConst.mMemory = IM_FPARAM; + ains->mConst.mIntConst = 0; } else - ains->mMemory = IM_FRAME; + ains->mConst.mMemory = IM_FRAME; block->Append(ains); @@ -1831,15 +1831,15 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction* cins = new InterInstruction(); cins->mCode = IC_COPY; - cins->mMemory = IM_INDIRECT; + cins->mConst.mMemory = IM_INDIRECT; 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; + cins->mConst.mOperandSize = vr.mType->mSize; block->Append(cins); - atotal += cins->mOperandSize; + atotal += cins->mConst.mOperandSize; } else { @@ -1862,7 +1862,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction* wins = new InterInstruction(); wins->mCode = IC_STORE; - wins->mMemory = IM_INDIRECT; + wins->mSrc[1].mMemory = IM_INDIRECT; wins->mSrc[0].mType = InterTypeOf(vr.mType);; wins->mSrc[0].mTemp = vr.mTemp; wins->mSrc[1].mType = IT_POINTER; @@ -1870,18 +1870,18 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* if (pdec) { if (pdec->mBase->mType == DT_TYPE_ARRAY) - wins->mOperandSize = 2; + wins->mSrc[1].mOperandSize = 2; else - wins->mOperandSize = pdec->mSize; + wins->mSrc[1].mOperandSize = pdec->mSize; } else if (vr.mType->mSize > 2 && vr.mType->mType != DT_TYPE_ARRAY) - wins->mOperandSize = vr.mType->mSize; + wins->mSrc[1].mOperandSize = vr.mType->mSize; else - wins->mOperandSize = 2; + wins->mSrc[1].mOperandSize = 2; block->Append(wins); - atotal += wins->mOperandSize; + atotal += wins->mSrc[1].mOperandSize; } if (pdec) @@ -1913,11 +1913,11 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* } else { - fins->mIntValue = atotal; + fins->mConst.mIntConst = atotal; InterInstruction* xins = new InterInstruction(); xins->mCode = IC_POP_FRAME; - xins->mIntValue = atotal; + xins->mConst.mIntConst = atotal; block->Append(xins); } @@ -1942,11 +1942,11 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ins->mCode = IC_CONSTANT; ins->mDst.mType = IT_POINTER; ins->mDst.mTemp = proc->AddTemporary(ins->mDst.mType); - ins->mOperandSize = dec->mSize; - ins->mIntValue = 0; - ins->mMemory = IM_GLOBAL; - ins->mLinkerObject = dec->mLinkerObject; - ins->mVarIndex = dec->mVarIndex; + ins->mConst.mOperandSize = dec->mSize; + ins->mConst.mIntConst = 0; + ins->mConst.mMemory = IM_GLOBAL; + ins->mConst.mLinkerObject = dec->mLinkerObject; + ins->mConst.mVarIndex = dec->mVarIndex; block->Append(ins); InterInstruction * jins = new InterInstruction(); @@ -1966,24 +1966,24 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* if (vdec->mType == DT_ARGUMENT) { if (procType->mFlags & DTF_FASTCALL) - vins->mMemory = IM_FPARAM; + vins->mConst.mMemory = IM_FPARAM; else - vins->mMemory = IM_PARAM; - vins->mOperandSize = vdec->mSize; - vins->mIntValue = vdec->mOffset; - vins->mVarIndex = vdec->mVarIndex; + vins->mConst.mMemory = IM_PARAM; + vins->mConst.mOperandSize = vdec->mSize; + vins->mConst.mIntConst = vdec->mOffset; + vins->mConst.mVarIndex = vdec->mVarIndex; } block->Append(vins); InterInstruction* lins = new InterInstruction(); lins->mCode = IC_LOAD; - lins->mMemory = IM_INDIRECT; + lins->mSrc[0].mMemory = IM_INDIRECT; lins->mSrc[0].mType = IT_POINTER; lins->mSrc[0].mTemp = vins->mDst.mTemp; lins->mDst.mType = InterTypeOf(vdec->mBase); lins->mDst.mTemp = proc->AddTemporary(lins->mDst.mType); - lins->mOperandSize = vdec->mSize; + lins->mSrc[0].mOperandSize = vdec->mSize; block->Append(lins); jins->mSrc[jins->mNumOperands].mType = InterTypeOf(vdec->mBase); @@ -2021,17 +2021,17 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ains->mCode = IC_CONSTANT; 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; + ains->mConst.mOperandSize = procType->mBase->mSize; + ains->mConst.mIntConst = 0; + ains->mConst.mVarIndex = inlineMapper->mResult;; + ains->mConst.mMemory = IM_LOCAL; block->Append(ains); ins->mSrc[1].mType = ains->mDst.mType; ins->mSrc[1].mTemp = ains->mDst.mTemp; - ins->mMemory = IM_INDIRECT; + ins->mSrc[1].mMemory = IM_INDIRECT; ins->mCode = IC_STORE; - ins->mOperandSize = ains->mOperandSize; + ins->mSrc[1].mOperandSize = ains->mConst.mOperandSize; } else ins->mCode = IC_RETURN_VALUE; @@ -2110,7 +2110,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* zins->mCode = IC_CONSTANT; zins->mDst.mType = InterTypeOf(vl.mType); zins->mDst.mTemp = proc->AddTemporary(zins->mDst.mType); - zins->mIntValue = 0; + zins->mConst.mIntConst = 0; block->Append(zins); InterInstruction * ins = new InterInstruction(); @@ -2289,14 +2289,14 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* InterInstruction* tins = new InterInstruction(); tins->mCode = IC_CONSTANT; - tins->mIntValue = 1; + tins->mConst.mIntConst = 1; tins->mDst.mType = IT_BOOL; tins->mDst.mTemp = ttemp; tblock->Append(tins); InterInstruction* fins = new InterInstruction(); fins->mCode = IC_CONSTANT; - fins->mIntValue = 0; + fins->mConst.mIntConst = 0; fins->mDst.mType = IT_BOOL; fins->mDst.mTemp = ttemp; fblock->Append(fins); diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index c8c68b8..b213998 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -2150,7 +2150,7 @@ void NativeCodeBasicBlock::LoadConstantToReg(InterCodeProcedure * proc, const In if (type == IT_FLOAT) { union { float f; unsigned int v; } cc; - cc.f = ins->mFloatValue; + cc.f = ins->mConst.mFloatConst; mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, cc.v & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); @@ -2163,35 +2163,35 @@ void NativeCodeBasicBlock::LoadConstantToReg(InterCodeProcedure * proc, const In } else if (type == IT_POINTER) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mConst.mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mIntValue, ins->mLinkerObject, NCIF_LOWER)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mConst.mIntConst, ins->mConst.mLinkerObject, NCIF_LOWER)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mIntValue, ins->mLinkerObject, NCIF_UPPER)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mConst.mIntConst, ins->mConst.mLinkerObject, NCIF_UPPER)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mConst.mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mIntValue & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mConst.mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mIntValue >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mConst.mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } - else if (ins->mMemory == IM_FPARAM) + else if (ins->mConst.mMemory == IM_FPARAM) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, BC_REG_FPARAMS + ins->mVarIndex + ins->mIntValue)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, BC_REG_FPARAMS + ins->mConst.mVarIndex + ins->mConst.mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mConst.mMemory == IM_LOCAL || ins->mConst.mMemory == IM_PARAM) { - int index = ins->mIntValue; + int index = ins->mConst.mIntConst; int areg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS; - if (ins->mMemory == IM_LOCAL) - index += proc->mLocalVars[ins->mVarIndex]->mOffset; + if (ins->mConst.mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mConst.mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mConst.mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(areg, index, 2); @@ -2206,10 +2206,10 @@ void NativeCodeBasicBlock::LoadConstantToReg(InterCodeProcedure * proc, const In mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_IMMEDIATE, (index >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } - else if (ins->mMemory == IM_PROCEDURE) + else if (ins->mConst.mMemory == IM_PROCEDURE) { - 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); + NativeCodeInstruction lins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mConst.mLinkerObject, NCIF_LOWER); + NativeCodeInstruction hins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mConst.mLinkerObject, NCIF_UPPER); mIns.Push(lins); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); @@ -2219,22 +2219,22 @@ void NativeCodeBasicBlock::LoadConstantToReg(InterCodeProcedure * proc, const In } else if (type == IT_INT32) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mIntValue & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mConst.mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mIntValue >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mConst.mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mIntValue >> 16) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mConst.mIntConst >> 16) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mIntValue >> 24) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mConst.mIntConst >> 24) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 3)); } else { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mIntValue & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mConst.mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); if (InterTypeSize[ins->mDst.mType] > 1) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mIntValue >> 8) & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mConst.mIntConst >> 8) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } } @@ -2273,18 +2273,18 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr union { float f; unsigned int v; } cc; cc.f = ins->mSrc[0].mFloatConst; - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, cc.v & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mSrc[1].mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (cc.v >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mSrc[1].mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (cc.v >> 16) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 2, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 2, ins->mSrc[1].mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (cc.v >> 24) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3, ins->mSrc[1].mLinkerObject)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, cc.v & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst)); @@ -2295,25 +2295,25 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (cc.v >> 24) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3)); } - else if (ins->mMemory == IM_FPARAM) + else if (ins->mSrc[1].mMemory == IM_FPARAM) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, cc.v & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (cc.v >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 1)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (cc.v >> 16) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (cc.v >> 24) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 3)); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { 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; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(reg, index, 4); @@ -2330,9 +2330,9 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (cc.v >> 24) & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); } - else if (ins->mMemory == IM_FRAME) + else if (ins->mSrc[1].mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + int index = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, cc.v & 0xff)); @@ -2359,18 +2359,18 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr sreg = BC_REG_ACCU; } - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mSrc[1].mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mSrc[1].mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 2, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 2, ins->mSrc[1].mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3, ins->mSrc[1].mLinkerObject)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst)); @@ -2381,25 +2381,25 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3)); } - else if (ins->mMemory == IM_FPARAM) + else if (ins->mSrc[1].mMemory == IM_FPARAM) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 1)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg + 3)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 3)); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { 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; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(reg, index, 4); @@ -2416,9 +2416,9 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg + 3)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, reg)); } - else if (ins->mMemory == IM_FRAME) + else if (ins->mSrc[1].mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + int index = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg)); @@ -2439,7 +2439,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins->mSrc[0].mTemp < 0) { - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[1].mMemory == IM_INDIRECT) { mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); @@ -2457,7 +2457,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr } else { - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[1].mMemory == IM_INDIRECT) { 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])); @@ -2481,35 +2481,35 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins->mSrc[0].mTemp < 0) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { 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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mSrc[1].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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mSrc[1].mLinkerObject)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { 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_FPARAM) + else if (ins->mSrc[1].mMemory == IM_FPARAM) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 1)); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { 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; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(reg, index, 2); @@ -2520,9 +2520,9 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr 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) + else if (ins->mSrc[1].mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + int index = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); @@ -2534,35 +2534,35 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr } else { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { 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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mSrc[1].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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mSrc[1].mLinkerObject)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { 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_FPARAM) + else if (ins->mSrc[1].mMemory == IM_FPARAM) { 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_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + 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_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 1)); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { 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; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(reg, index, 2); @@ -2573,9 +2573,9 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr 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) + else if (ins->mSrc[1].mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + int index = ins->mSrc[1].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->mSrc[0].mTemp])); @@ -2590,7 +2590,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins->mSrc[0].mTemp < 0) { - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[1].mMemory == IM_INDIRECT) { mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); @@ -2602,7 +2602,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr } else { - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[1].mMemory == IM_INDIRECT) { 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])); @@ -2620,31 +2620,31 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins->mSrc[0].mTemp < 0) { - if (ins->mOperandSize == 1) + if (InterTypeSize[ins->mSrc[0].mType] == 1) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { 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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mSrc[1].mLinkerObject)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { 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_FPARAM) + else if (ins->mSrc[1].mMemory == IM_FPARAM) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst)); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { 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; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(reg, index, 1); @@ -2652,46 +2652,46 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr 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) + else if (ins->mSrc[1].mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + int index = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); } } - else if (ins->mOperandSize == 2) + else if (InterTypeSize[ins->mSrc[0].mType] == 2) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { 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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mSrc[1].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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mSrc[1].mLinkerObject)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { 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_FPARAM) + else if (ins->mSrc[1].mMemory == IM_FPARAM) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 1)); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { 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; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(reg, index, 2); @@ -2702,9 +2702,9 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr 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) + else if (ins->mSrc[1].mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + int index = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); @@ -2714,20 +2714,20 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); } } - else if (ins->mOperandSize == 4) + else if (InterTypeSize[ins->mSrc[0].mType] == 4) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { 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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mSrc[1].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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mSrc[1].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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 2, ins->mSrc[1].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)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3, ins->mSrc[1].mLinkerObject)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst)); @@ -2738,25 +2738,25 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr 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_FPARAM) + else if (ins->mSrc[1].mMemory == IM_FPARAM) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 1)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 16) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 24) & 0xff)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 3)); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { 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; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(reg, index, 4); @@ -2773,9 +2773,9 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr 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) + else if (ins->mSrc[1].mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + int index = ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 2; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst & 0xff)); @@ -2794,31 +2794,31 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr } else { - if (ins->mOperandSize == 1) + if (InterTypeSize[ins->mSrc[0].mType] == 1) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { 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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mSrc[1].mLinkerObject)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { 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_FPARAM) + else if (ins->mSrc[1].mMemory == IM_FPARAM) { 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_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst)); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { 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; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(reg, index, 1); @@ -2826,47 +2826,47 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr 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) + else if (ins->mSrc[1].mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + int index = ins->mSrc[1].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->mSrc[0].mTemp])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); } } - else if (ins->mOperandSize == 2) + else if (InterTypeSize[ins->mSrc[0].mType] == 2) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { 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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mSrc[1].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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mSrc[1].mLinkerObject)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { 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_FPARAM) + else if (ins->mSrc[1].mMemory == IM_FPARAM) { 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_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + 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_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 1)); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { 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; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(reg, index, 2); @@ -2877,9 +2877,9 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr 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) + else if (ins->mSrc[1].mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + int index = ins->mSrc[1].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->mSrc[0].mTemp])); @@ -2889,20 +2889,20 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_STACK)); } } - else if (ins->mOperandSize == 4) + else if (InterTypeSize[ins->mSrc[0].mType] == 4) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { 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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst, ins->mSrc[1].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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 1, ins->mSrc[1].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_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 2, ins->mSrc[1].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)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, ins->mSrc[1].mIntConst + 3, ins->mSrc[1].mLinkerObject)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { 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)); @@ -2913,26 +2913,26 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr 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_FPARAM) + else if (ins->mSrc[1].mMemory == IM_FPARAM) { 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_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + 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_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + 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_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + 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_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[1].mIntConst + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst + 3)); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[1].mMemory == IM_LOCAL || ins->mSrc[1].mMemory == IM_PARAM) { 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; + if (ins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[1].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[1].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(reg, index, 4); @@ -2949,9 +2949,9 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr 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) + else if (ins->mSrc[1].mMemory == IM_FRAME) { - int index = ins->mVarIndex + ins->mSrc[1].mIntConst + 2; + int index = ins->mSrc[1].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->mSrc[0].mTemp])); @@ -2973,20 +2973,20 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins->mSrc[0].mTemp < 0) { - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[1].mMemory == IM_INDIRECT) { 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])); - if (ins->mOperandSize == 2) + if (InterTypeSize[ins->mSrc[0].mType] == 2) { mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); 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) + else if (InterTypeSize[ins->mSrc[0].mType] == 4) { mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[0].mIntConst >> 8) & 0xff)); @@ -3002,20 +3002,20 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr } else { - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[1].mMemory == IM_INDIRECT) { 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])); - if (ins->mOperandSize == 2) + if (InterTypeSize[ins->mSrc[0].mType] == 2) { mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); 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) + else if (InterTypeSize[ins->mSrc[0].mType] == 4) { mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1)); @@ -3036,7 +3036,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr void NativeCodeBasicBlock::LoadStoreIndirectValue(InterCodeProcedure* proc, const InterInstruction* rins, const InterInstruction* wins) { - int size = wins->mOperandSize; + int size = InterTypeSize[wins->mSrc[0].mType]; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[rins->mSrc[0].mTemp])); @@ -3061,30 +3061,30 @@ void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterI } else { - if (wins->mOperandSize == 1) + if (InterTypeSize[wins->mSrc[0].mType] == 1) { if (rins->mSrc[0].mTemp < 0) { - if (rins->mMemory == IM_GLOBAL) + if (rins->mSrc[0].mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, rins->mSrc[0].mIntConst, rins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, rins->mSrc[0].mIntConst, rins->mSrc[0].mLinkerObject)); } - else if (rins->mMemory == IM_ABSOLUTE) + else if (rins->mSrc[0].mMemory == IM_ABSOLUTE) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, rins->mSrc[0].mIntConst)); } - else if (rins->mMemory == IM_FPARAM) + else if (rins->mSrc[0].mMemory == IM_FPARAM) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + rins->mVarIndex + rins->mSrc[0].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + rins->mSrc[0].mVarIndex + rins->mSrc[0].mIntConst)); } - else if (rins->mMemory == IM_LOCAL || rins->mMemory == IM_PARAM) + else if (rins->mSrc[0].mMemory == IM_LOCAL || rins->mSrc[0].mMemory == IM_PARAM) { 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; + if (rins->mSrc[0].mMemory == IM_LOCAL) + index += proc->mLocalVars[rins->mSrc[0].mVarIndex]->mOffset; else - index += rins->mVarIndex + proc->mLocalSize + 2; + index += rins->mSrc[0].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(areg, index, 1); @@ -3094,7 +3094,7 @@ void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterI } else { - if (rins->mMemory == IM_INDIRECT) + if (rins->mSrc[0].mMemory == IM_INDIRECT) { 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])); @@ -3103,35 +3103,35 @@ void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterI if (wins->mSrc[1].mTemp < 0) { - if (wins->mMemory == IM_GLOBAL) + if (wins->mSrc[1].mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, wins->mSrc[1].mIntConst, wins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, wins->mSrc[1].mIntConst, wins->mSrc[1].mLinkerObject)); } - else if (wins->mMemory == IM_ABSOLUTE) + else if (wins->mSrc[1].mMemory == IM_ABSOLUTE) { mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, wins->mSrc[1].mIntConst)); } - else if (wins->mMemory == IM_FPARAM) + else if (wins->mSrc[1].mMemory == IM_FPARAM) { - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + wins->mVarIndex + wins->mSrc[1].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + wins->mSrc[1].mVarIndex + wins->mSrc[1].mIntConst)); } - else if (wins->mMemory == IM_LOCAL || wins->mMemory == IM_PARAM) + else if (wins->mSrc[1].mMemory == IM_LOCAL || wins->mSrc[1].mMemory == IM_PARAM) { 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; + if (wins->mSrc[1].mMemory == IM_LOCAL) + index += proc->mLocalVars[wins->mSrc[1].mVarIndex]->mOffset; else - index += wins->mVarIndex + proc->mLocalSize + 2; + index += wins->mSrc[1].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(areg, index, 1); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, areg)); } - else if (wins->mMemory == IM_FRAME) + else if (wins->mSrc[1].mMemory == IM_FRAME) { - int index = wins->mVarIndex + wins->mSrc[1].mIntConst + 2; + int index = wins->mSrc[1].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)); @@ -3139,7 +3139,7 @@ void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterI } else { - if (wins->mMemory == IM_INDIRECT) + if (wins->mSrc[1].mMemory == IM_INDIRECT) { 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])); @@ -3151,7 +3151,7 @@ void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterI void NativeCodeBasicBlock::LoadOpStoreIndirectValue(InterCodeProcedure* proc, const InterInstruction* rins, const InterInstruction* oins, int oindex, const InterInstruction* wins) { - int size = wins->mOperandSize; + int size = InterTypeSize[wins->mSrc[0].mType]; AsmInsType at = ASMIT_ADC; @@ -3199,18 +3199,18 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI { if (ins->mSrc[0].mTemp < 0) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[0].mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mSrc[0].mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 1, ins->mSrc[0].mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 2, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 2, ins->mSrc[0].mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 3, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 3, ins->mSrc[0].mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 3)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[0].mMemory == IM_ABSOLUTE) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); @@ -3221,25 +3221,25 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI 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_FPARAM) + else if (ins->mSrc[0].mMemory == IM_FPARAM) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[0].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[0].mVarIndex + ins->mSrc[0].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[0].mIntConst + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[0].mVarIndex + ins->mSrc[0].mIntConst + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[0].mIntConst + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[0].mVarIndex + ins->mSrc[0].mIntConst + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[0].mIntConst + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[0].mVarIndex + 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) + else if (ins->mSrc[0].mMemory == IM_LOCAL || ins->mSrc[0].mMemory == IM_PARAM) { 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; + if (ins->mSrc[0].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[0].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[0].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(areg, index, 4); @@ -3259,7 +3259,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI } else { - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[0].mMemory == IM_INDIRECT) { 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])); @@ -3280,9 +3280,9 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI { if (ins->mSrc[0].mTemp < 0) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[0].mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mSrc[0].mLinkerObject)); if (ainsl) { if (ainsl->mType == ASMIT_ADC) @@ -3292,11 +3292,11 @@ 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->mSrc[0].mIntConst + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 1, ins->mSrc[0].mLinkerObject)); if (ainsh) mIns.Push(*ainsh); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[0].mMemory == IM_ABSOLUTE) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst)); if (ainsl) @@ -3312,9 +3312,9 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI if (ainsh) mIns.Push(*ainsh); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } - else if (ins->mMemory == IM_FPARAM) + else if (ins->mSrc[0].mMemory == IM_FPARAM) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[0].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[0].mVarIndex + ins->mSrc[0].mIntConst)); if (ainsl) { if (ainsl->mType == ASMIT_ADC) @@ -3324,18 +3324,18 @@ 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_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[0].mIntConst + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[0].mVarIndex + 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) + else if (ins->mSrc[0].mMemory == IM_LOCAL || ins->mSrc[0].mMemory == IM_PARAM) { 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; + if (ins->mSrc[0].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[0].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[0].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(areg, index, 2); @@ -3358,7 +3358,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI } else { - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[0].mMemory == IM_INDIRECT) { int src = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins->mSrc[0].mIntConst)); @@ -3388,28 +3388,28 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI { if (ins->mSrc[0].mTemp < 0) { - if (ins->mOperandSize == 1) + if (InterTypeSize[ins->mDst.mType] == 1) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[0].mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mSrc[0].mLinkerObject)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[0].mMemory == IM_ABSOLUTE) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst)); } - else if (ins->mMemory == IM_FPARAM) + else if (ins->mSrc[0].mMemory == IM_FPARAM) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[0].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[0].mVarIndex + ins->mSrc[0].mIntConst)); } - else if (ins->mMemory == IM_LOCAL || ins->mMemory == IM_PARAM) + else if (ins->mSrc[0].mMemory == IM_LOCAL || ins->mSrc[0].mMemory == IM_PARAM) { 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; + if (ins->mSrc[0].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[0].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[0].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(areg, index, 1); @@ -3434,11 +3434,11 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } } - else if (ins->mOperandSize == 2) + else if (InterTypeSize[ins->mDst.mType] == 2) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[0].mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mSrc[0].mLinkerObject)); if (ainsl) { if (ainsl->mType == ASMIT_ADC) @@ -3448,11 +3448,11 @@ 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->mSrc[0].mIntConst + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 1, ins->mSrc[0].mLinkerObject)); if (ainsh) mIns.Push(*ainsh); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[0].mMemory == IM_ABSOLUTE) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst)); if (ainsl) @@ -3468,9 +3468,9 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI if (ainsh) mIns.Push(*ainsh); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } - else if (ins->mMemory == IM_FPARAM) + else if (ins->mSrc[0].mMemory == IM_FPARAM) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[0].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[0].mVarIndex + ins->mSrc[0].mIntConst)); if (ainsl) { if (ainsl->mType == ASMIT_ADC) @@ -3480,18 +3480,18 @@ 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_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[0].mIntConst + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[0].mVarIndex + 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) + else if (ins->mSrc[0].mMemory == IM_LOCAL || ins->mSrc[0].mMemory == IM_PARAM) { 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; + if (ins->mSrc[0].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[0].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[0].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(areg, index, 2); @@ -3512,20 +3512,20 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } } - else if (ins->mOperandSize == 4) + else if (InterTypeSize[ins->mDst.mType] == 4) { - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[0].mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mSrc[0].mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 1, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 1, ins->mSrc[0].mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 2, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 2, ins->mSrc[0].mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 3, ins->mLinkerObject)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst + 3, ins->mSrc[0].mLinkerObject)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 3)); } - else if (ins->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[0].mMemory == IM_ABSOLUTE) { mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); @@ -3536,25 +3536,25 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI 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_FPARAM) + else if (ins->mSrc[0].mMemory == IM_FPARAM) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[0].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[0].mVarIndex + ins->mSrc[0].mIntConst)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[0].mIntConst + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[0].mVarIndex + ins->mSrc[0].mIntConst + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[0].mIntConst + 2)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[0].mVarIndex + ins->mSrc[0].mIntConst + 2)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 2)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[0].mIntConst + 3)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS + ins->mSrc[0].mVarIndex + 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) + else if (ins->mSrc[0].mMemory == IM_LOCAL || ins->mSrc[0].mMemory == IM_PARAM) { 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; + if (ins->mSrc[0].mMemory == IM_LOCAL) + index += proc->mLocalVars[ins->mSrc[0].mVarIndex]->mOffset; else - index += ins->mVarIndex + proc->mLocalSize + 2; + index += ins->mSrc[0].mVarIndex + proc->mLocalSize + 2; index += mFrameOffset; CheckFrameIndex(areg, index, 4); @@ -3575,9 +3575,9 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI } else { - if (ins->mMemory == IM_INDIRECT) + if (ins->mSrc[0].mMemory == IM_INDIRECT) { - if (ins->mOperandSize == 1) + if (InterTypeSize[ins->mDst.mType] == 1) { 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])); @@ -3597,7 +3597,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); } } - else if (ins->mOperandSize == 2) + else if (InterTypeSize[ins->mDst.mType] == 2) { int src = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; @@ -3629,7 +3629,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI else mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); } - else if (ins->mOperandSize == 4) + else if (InterTypeSize[ins->mDst.mType] == 4) { int src = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; @@ -3661,7 +3661,7 @@ NativeCodeBasicBlock * NativeCodeBasicBlock::CopyValue(InterCodeProcedure* proc, { 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; + int size = ins->mConst.mOperandSize; if (size < 4) { mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); @@ -5993,36 +5993,36 @@ void NativeCodeBasicBlock::LoadEffectiveAddress(InterCodeProcedure* proc, const else if (ins->mSrc[1].mTemp < 0) { mIns.Push(NativeCodeInstruction(ASMIT_CLC, ASMIM_IMPLIED)); - if (ins->mMemory == IM_GLOBAL) + if (ins->mSrc[1].mMemory == IM_GLOBAL) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mIntValue, ins->mLinkerObject, NCIF_LOWER)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[1].mIntConst, ins->mSrc[1].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->mIntValue, ins->mLinkerObject, NCIF_UPPER)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[1].mIntConst, ins->mSrc[1].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->mMemory == IM_ABSOLUTE) + else if (ins->mSrc[1].mMemory == IM_ABSOLUTE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mIntValue & 0xff)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst & 0xff)); 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_LDA, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 8) & 0xff)); 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) + else if (ins->mSrc[1].mMemory == IM_PROCEDURE) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mLinkerObject, NCIF_LOWER)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mSrc[1].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_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mSrc[1].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->mMemory == IM_FPARAM) + else if (ins->mSrc[1].mMemory == IM_FPARAM) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, BC_REG_FPARAMS + ins->mVarIndex + ins->mSrc[0].mIntConst)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, BC_REG_FPARAMS + ins->mSrc[1].mVarIndex + ins->mSrc[1].mIntConst)); 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, 0)); @@ -6065,8 +6065,8 @@ void NativeCodeBasicBlock::CallFunction(InterCodeProcedure* proc, NativeCodeProc { if (ins->mSrc[0].mTemp < 0) { - 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); + NativeCodeInstruction lins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mSrc[0].mLinkerObject, NCIF_LOWER); + NativeCodeInstruction hins(ASMIT_LDA, ASMIM_IMMEDIATE_ADDRESS, ins->mSrc[0].mIntConst, ins->mSrc[0].mLinkerObject, NCIF_UPPER); mIns.Push(lins); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU)); @@ -6123,14 +6123,14 @@ void NativeCodeBasicBlock::CallAssembler(InterCodeProcedure* proc, const InterIn { for (int i = 1; i < ins->mNumOperands; i++) { - ins->mLinkerObject->mTemporaries[i - 1] = BC_REG_TMP + proc->mTempOffset[ins->mSrc[i].mTemp]; - ins->mLinkerObject->mTempSizes[i - 1] = InterTypeSize[ins->mSrc[i].mType]; + ins->mSrc[0].mLinkerObject->mTemporaries[i - 1] = BC_REG_TMP + proc->mTempOffset[ins->mSrc[i].mTemp]; + ins->mSrc[0].mLinkerObject->mTempSizes[i - 1] = InterTypeSize[ins->mSrc[i].mType]; } - ins->mLinkerObject->mNumTemporaries = ins->mNumOperands - 1; + ins->mSrc[0].mLinkerObject->mNumTemporaries = ins->mNumOperands - 1; } - assert(ins->mLinkerObject); - mIns.Push(NativeCodeInstruction(ASMIT_JSR, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mLinkerObject)); + assert(ins->mSrc[0].mLinkerObject); + mIns.Push(NativeCodeInstruction(ASMIT_JSR, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mSrc[0].mLinkerObject)); if (ins->mDst.mTemp >= 0) { @@ -8213,7 +8213,7 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode iblock->mInstructions[i + 1]->mCode == IC_STORE && iblock->mInstructions[i + 1]->mSrc[0].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[0].mFinal && - iblock->mInstructions[i + 1]->mOperandSize == 1) + InterTypeSize[ins->mDst.mType] == 1) { block->LoadStoreValue(iproc, ins, iblock->mInstructions[i + 1]); i++; @@ -8222,7 +8222,7 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode iblock->mInstructions[i + 1]->mCode == IC_STORE && 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->mSrc[0].mMemory == IM_INDIRECT && iblock->mInstructions[i + 1]->mSrc[1].mMemory == IM_INDIRECT && ins->mSrc[0].mIntConst == 0 && iblock->mInstructions[i + 1]->mSrc[1].mIntConst == 0) { block->LoadStoreIndirectValue(iproc, ins, iblock->mInstructions[i + 1]); @@ -8236,7 +8236,7 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode 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]->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->mSrc[0].mMemory == IM_INDIRECT && iblock->mInstructions[i + 2]->mSrc[1].mMemory == IM_INDIRECT && 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]); @@ -8250,14 +8250,14 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode 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]->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->mSrc[0].mMemory == IM_INDIRECT && iblock->mInstructions[i + 2]->mSrc[1].mMemory == IM_INDIRECT && 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; } else if (i + 1 < iblock->mInstructions.Size() && - ins->mOperandSize >= 2 && + InterTypeSize[ins->mDst.mType] >= 2 && iblock->mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && iblock->mInstructions[i + 1]->mSrc[0].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[0].mFinal) { @@ -8265,7 +8265,7 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode i++; } else if (i + 1 < iblock->mInstructions.Size() && - ins->mOperandSize >= 2 && + InterTypeSize[ins->mDst.mType] >= 2 && iblock->mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && iblock->mInstructions[i + 1]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[1].mFinal) { @@ -8273,8 +8273,8 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode i++; } else if (i + 2 < iblock->mInstructions.Size() && - ins->mOperandSize >= 2 && - iblock->mInstructions[i + 1]->mCode == IC_LOAD && iblock->mInstructions[i + 1]->mOperandSize == 2 && + InterTypeSize[ins->mDst.mType] >= 2 && + iblock->mInstructions[i + 1]->mCode == IC_LOAD && InterTypeSize[iblock->mInstructions[i + 1]->mDst.mType] == 2 && iblock->mInstructions[i + 1]->mDst.mTemp != ins->mDst.mTemp && iblock->mInstructions[i + 2]->mCode == IC_BINARY_OPERATOR && iblock->mInstructions[i + 2]->mSrc[0].mTemp == iblock->mInstructions[i + 1]->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[0].mFinal && @@ -8284,8 +8284,8 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode i += 2; } else if (i + 2 < iblock->mInstructions.Size() && - ins->mOperandSize >= 2 && - iblock->mInstructions[i + 1]->mCode == IC_LOAD && iblock->mInstructions[i + 1]->mOperandSize == 2 && + InterTypeSize[ins->mDst.mType] >= 2 && + iblock->mInstructions[i + 1]->mCode == IC_LOAD && InterTypeSize[iblock->mInstructions[i + 1]->mDst.mType] == 2 && iblock->mInstructions[i + 1]->mDst.mTemp != ins->mDst.mTemp && iblock->mInstructions[i + 2]->mCode == IC_BINARY_OPERATOR && iblock->mInstructions[i + 2]->mSrc[1].mTemp == iblock->mInstructions[i + 1]->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[1].mFinal && @@ -8295,7 +8295,7 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode i += 2; } else if (i + 1 < iblock->mInstructions.Size() && - ins->mOperandSize >= 2 && + InterTypeSize[ins->mDst.mType] >= 2 && iblock->mInstructions[i + 1]->mCode == IC_LEA && iblock->mInstructions[i + 1]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[1].mFinal) { @@ -8354,20 +8354,20 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode { block->mIns.Push(NativeCodeInstruction(ASMIT_SEC, ASMIM_IMPLIED)); block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_STACK)); - block->mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_IMMEDIATE, (ins->mIntValue + 2) & 0xff)); + block->mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_IMMEDIATE, (ins->mConst.mIntConst + 2) & 0xff)); block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_STACK)); block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_STACK + 1)); - block->mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_IMMEDIATE, ((ins->mIntValue + 2) >> 8) & 0xff)); + block->mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_IMMEDIATE, ((ins->mConst.mIntConst + 2) >> 8) & 0xff)); block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_STACK + 1)); } break; case IC_POP_FRAME: { block->mIns.Push(NativeCodeInstruction(ASMIT_CLC, ASMIM_IMPLIED)); block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_STACK)); - block->mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_IMMEDIATE, (ins->mIntValue + 2) & 0xff)); + block->mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_IMMEDIATE, (ins->mConst.mIntConst + 2) & 0xff)); block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_STACK)); block->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_STACK + 1)); - block->mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_IMMEDIATE, ((ins->mIntValue + 2) >> 8) & 0xff)); + block->mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_IMMEDIATE, ((ins->mConst.mIntConst + 2) >> 8) & 0xff)); block->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_STACK + 1)); } break; diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index 29a19b2..d7f4d96 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -688,30 +688,31 @@ Declaration* Parser::ParseDeclaration(bool variable) variable = false; mScanner->NextToken(); } - else - - if (mScanner->mToken == TK_STATIC) + else { - storageFlags |= DTF_STATIC; - mScanner->NextToken(); - } - - if (mScanner->mToken == TK_EXTERN) - { - storageFlags |= DTF_EXTERN; - mScanner->NextToken(); - } - - if (mScanner->mToken == TK_INLINE) - { - storageFlags |= DTF_INLINE; - mScanner->NextToken(); - } + if (mScanner->mToken == TK_STATIC) + { + storageFlags |= DTF_STATIC; + mScanner->NextToken(); + } - if (mScanner->mToken == TK_FASTCALL) - { - typeFlags |= DTF_FASTCALL; - mScanner->NextToken(); + if (mScanner->mToken == TK_EXTERN) + { + storageFlags |= DTF_EXTERN; + mScanner->NextToken(); + } + + if (mScanner->mToken == TK_INLINE) + { + storageFlags |= DTF_INLINE; + mScanner->NextToken(); + } + + if (mScanner->mToken == TK_FASTCALL) + { + typeFlags |= DTF_FASTCALL; + mScanner->NextToken(); + } } Declaration* bdec = ParseBaseTypeDeclaration(0); @@ -1980,7 +1981,7 @@ Expression* Parser::ParseAssemblerAddOperand(void) nexp->mLeft = exp; mScanner->NextToken(); nexp->mRight = ParseAssemblerMulOperand(); - if (nexp->mLeft->mDecValue->mType == DT_VARIABLE) + if (nexp->mLeft->mDecValue->mType == DT_VARIABLE || nexp->mLeft->mDecValue->mType == DT_ARGUMENT) { if (nexp->mRight->mDecValue->mType == DT_CONST_INTEGER) {