- Implementation of NEGX.x mem, NEGX.x Dy, SUBX.x -(Ay),-(Az), ADDX.x -(Ay),-(Az), MOVE CCR,mem, MOVE CCR,Dx, EOR #imm,CCR, OR #imm,CCR, AND #imm,CCR, RTR, MOVE mem,CCR, MOVE Dx,CCR, MOVE #imm,CCR, ASR.x Dy,Dz, RTD, MULU.W mem,Dx, MULU.W #imm,Dx, MULS.W mem,Dx, MULS.W #imm,Dx, SUBX.x Dy,Dz, ADDX.x Dy,Dz, MOVEM.x regs,mem, MOVEM.x mem,regs, MOVEM.x (Ay)+,regs, CMPM.x (Ax)+,(Ay)+ instructions.
- Added dependency tracking for non-volatile PowerPC registers.
- Fixed X flag handling in register-based shifting instructions, previously the X flag was cleared together with the C flag if the shift steps were zero.
- Removed RTM from the list of the potentially supported opcodes.
- Added RTR back to the list of the potentially supported opcodes.
- Optimized temporary register usage in MULU.W Dx,Dy and MULS.W Dx,Dy instructions.
- Introduced tracking of the extension words after the instructions, it is needed for adjusting the PC before certain addressing modes are processed.
- Fixed register dependency and order of register storage for MOVEM.x regs,-(Ay) when direct memory access is enabled.
- Implemented stack-like concept for register saving into the context.
- Code cleanup: removed unused reference, fixed some warnings regarding misformatted and unused code lines.
Recently I faced an interesting problem, I am not quite sure how can I solve: division by zero. My beloved math teacher already told me: who is trying to divide by zero is an idiot. (Well, that is not quite right, as we know it.) Yet, some programs might try it.
Why is that a problem? Because it triggers an exception inside a compiled block. It also needs branching (skip the exception triggering if the divisor is not null, for a change) which contradicts the macroblock register flow tracking. Well, here is the challenge, but I am pretty sure I will solve it somehow.
'Til then the usual: watch this space.