By whygee on Saturday 4 April 2009, 14:36 - Architecture
I wish it could stabilize soon, but at least movement is a sign of activity
(or the reverse :-))
I was annoyed by the ASU operations :
ADD, SUB, ADDS1, SUBS1, ADDS2, SUBS2, MIN, MAX
These instructions were the last ones that used skip technique, since it is progressively dropped in favor of relative branches by conditional add/sub to the PC register.
How is it possible to provide the same functionality without skip ? It's the same old question that decades of research has not yet answered definitively. The Carry Flag is the obvious solution but I have just dropped the "status/mode register" in favor of another general purpose register. So where can I find a stupid bit of room ?
The answer is there under my eyes : the LSB of the PC ...
OK OK I know it's ugly. But consider these aspects :
- The PC points to the next instruction and never uses the LSB because all the YASEP instructions are aligned on 2-bytes boundaries.
- Any write to the PC register modifies the bits 1 to 31. Bit 0 comes from the ASU's carry output.
- We can declare that only the ASU operations (or context changes) can change the PC's LSB. All the other instructions can read it and test it, so the informations is easily available.
- Since we dropped the 4 instructions that used skip, these "slots" can be filled by other instructions :
CMPS, CMPU, SMIN, SMAX
CMPx are just like SUB but don't write the result back. I wish it could set the LSB of any register but the current architecture doesn't allow this, so please keep the destination field to PC when encoding the assembly instruction.
3 new instructions deal with signed comparison : CMPS, SMIN & SMAX. They were missing from the previous opcode maps but the elimination of the skip-instructions leaves enough room. I have to update the VHDL now...
- Keeping the carry bit in the LSB of the PC can have a curious side effect : relative jumps with odd values will make the carry bit ripple to the other bits of the result, so the destination address that is written in the PC will depend on the value of the carry bit. In practice, there is no speed or size advantage (compared to condition codes in the new opcode extension) but the possibility is there...
- Clearing the carry flag is done with
CMP Rx, Rx
- Setting the carry flag is done with
CMP -1, Rx
(or something like that)
Usually, I would end the post with something along the lines of "this is good and everybody is happy". Now, I feel a bit disapointed that YASEP looks more like other architectures, and has less distinguishing features. It is less groundbreaking and it will have to face the same problems as the others, on top of its inherent quirks. But it's still better than nothing and I do my best to keep the system rather coherent and orthogonal.
Storing the carry bit in the PC's LSB might have been the stupidest proposal... This was revised and explored in later versions...