diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index ed42100..6fb6392 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -8306,6 +8306,11 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1)); } + else if (ins->mDst.IsSByte()) + { + // Upper byte will retain sign + ShiftRegisterLeftByte(proc, ins, dreg, lshift); + } else if (ins->mSrc[index].IsUByte()) ShiftRegisterLeftFromByte(proc, ins, dreg, lshift, int(ins->mSrc[index].mRange.mMaxValue)); else @@ -8344,6 +8349,11 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1)); } + else if (ins->mDst.IsSByte()) + { + // Upper byte will retain sign + ShiftRegisterLeftByte(proc, ins, dreg, lshift); + } else if (ins->mSrc[index].IsUByte()) ShiftRegisterLeftFromByte(proc, ins, dreg, lshift, int(ins->mSrc[index].mRange.mMaxValue)); else @@ -8357,6 +8367,15 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc mIns.Push(NativeCodeInstruction(ins, ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 0)); mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 0)); } + else if (ins->mSrc[index].IsSByte() && ins->mSrc[index].mRange.mMinValue >= -42 && ins->mSrc[index].mRange.mMaxValue <= 42) + { + // Will retain sign + mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 0)); + mIns.Push(NativeCodeInstruction(ins, ASMIT_ASL, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ins, ASMIT_CLC, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ins, ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 0)); + mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 0)); + } else { mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 0)); @@ -8379,6 +8398,11 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1)); } + else if (ins->mDst.IsSByte()) + { + // Upper byte will retain sign + ShiftRegisterLeftByte(proc, ins, dreg, lshift); + } else ShiftRegisterLeft(proc, ins, dreg, lshift); return dreg; @@ -8400,6 +8424,24 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc else ShiftRegisterLeftFromByte(proc, ins, dreg, lshift, int(ins->mSrc[index].mRange.mMaxValue) * 5); } + else if (ins->mSrc[index].IsSByte() && ins->mSrc[index].mRange.mMinValue >= -25 && ins->mSrc[index].mRange.mMaxValue <= 25) + { + // Will retain sign + mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 0)); + mIns.Push(NativeCodeInstruction(ins, ASMIT_ASL, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ins, ASMIT_ASL, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ins, ASMIT_CLC, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ins, ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 0)); + mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 0)); + + if (ins->mDst.IsSByte()) + { + // Upper byte will retain sign + ShiftRegisterLeftByte(proc, ins, dreg, lshift); + } + else + ShiftRegisterLeft(proc, ins, dreg, lshift); + } else { mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 0)); @@ -11424,6 +11466,9 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In { InterOperator op = ins->mOperator; + bool scmp = (op == IA_CMPGES) || (op == IA_CMPLES) || (op == IA_CMPGS) || (op == IA_CMPLS) || (op == IA_CMPEQ) || (op == IA_CMPNE); + bool ucmp = (op == IA_CMPGEU) || (op == IA_CMPLEU) || (op == IA_CMPGU) || (op == IA_CMPLU) || (op == IA_CMPEQ) || (op == IA_CMPNE); + if (ins->mSrc[0].mType == IT_FLOAT) { if (ins->mSrc[0].mTemp < 0 || ins->mSrc[1].mTemp < 0) @@ -11881,7 +11926,9 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In } } - else if (InterTypeSize[ins->mSrc[0].mType] == 1) + else if (InterTypeSize[ins->mSrc[0].mType] == 1 || + scmp && ins->mSrc[0].IsSByte() && ins->mSrc[1].IsSByte() || + ucmp && ins->mSrc[0].IsUByte() && ins->mSrc[1].IsUByte()) { NativeCodeBasicBlock* eblock = nproc->AllocateBlock(); NativeCodeBasicBlock* nblock = nproc->AllocateBlock(); diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index 5412f8c..ace7eed 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -174,6 +174,8 @@ Declaration* Parser::ParseStructDeclaration(uint64 flags, DecType dt, Declaratio } } } + else + mErrors->Error(mScanner->mLocation, EERR_UNIMPLEMENTED, "Unnamed structs are not implemented"); if (!dec->mIdent || !dec->mScope) {