[Libre-soc-dev] v3.1B prefix
Alexandre Oliva
oliva at gnu.org
Sun Dec 13 21:52:11 GMT 2020
On Dec 8, 2020, Luke Kenneth Casson Leighton <lkcl at lkcl.net> wrote:
> On 12/8/20, Alexandre Oliva <oliva at gnu.org> wrote:
>> On Dec 7, 2020, Luke Kenneth Casson Leighton <lkcl at lkcl.net> wrote:
>>
>>> i did find it odd that there's no 16-bit imm instructions,
>>
>> Sorry, I failed to mention that they're not implemented yet.
> lol that would do it. addi is the higher end of the opcodes used.
> although not being able to use it unless already in 16bit mode, this
> is very inconvenient.
I'm trying to implement the remaining opcodes now, but getting all
confused by the mismatches between the bit widths and range of values
supposed to be encoded:
| 0 | 1 | 2 | 3 4 | | 567.8 | 9ab | cde | f |
| 1 | 1 | 1 | i2 | | 001.0 | RA!=0| imm | 1 | addis
| 1 | i2 | | 010.0 | RA!=0| imm | 1 | addi
* addi is EXTS(i2||imm) to give a 4-bit range -8 to +7
* addis is EXTS(i2||imm||000) to give a 11-bit range -1024 to +1023 in increments of 8
I suppose the bullets are lagging behind encoding updates, because:
- I count 5 bits for addis; if signed, that's enough for -16..15
- I count 7 bits for addi. With a left-shift by 3, that makes for a
10-bit range.
If these were to be used the way I would conceive of them, the ranges
would be complementary, so that a pair of these insns could encode 12
bits.
Here's another issue:
| 1 | 0 | i2 | | 010.1 | RA | imm | 1 | cmpdi
* all others are EXTS(i2||imm) to give a 7-bit range -128 to +127 (further for LD/ST due to word/dword-alignment)
- I count 6 bits, -32..+31. It would take 8-bits to encode -128..+127.
One more:
| 1 | 0 | i2 | | 011.0 | RT | imm | 1 | ldspi
| 1 | 1 | i2 | | 011.0 | RT | imm | 1 | lwspi
| 1 | 0 | i2 | | 011.1 | RT | imm | 1 | stwspi
| 1 | 1 | i2 | | 011.1 | RT | imm | 1 | stdspi
* LD/ST r1 (SP) variants should be offset by -256
- With 6-bits immediate left-shifted by 3 (for d) we get -256..+248.
Offsetting by -256, we'd access only the red zone and another 256 bytes
range below the red zone, which is not at all meaningful.
- With 6-bits immediate left-shifted by 2 (for w) we get -128..+124.
Offsetting by -256, we'd access half of the red zone, and another 128
bytes below it.
- Bytes below the red zone are not even defined. I suppose the intend
might be for sp loads and stores to have an unsigned offset, but even
then, for word-sized ones, the -256 offset would limit its use to the
red zone.
I guess at this point none of this really matters, but you were so
interested in the compressor estimates for 16-imm that I figured I'd
implement them, but... tough.
What now?
--
Alexandre Oliva, happy hacker https://FSFLA.org/blogs/lxo/
Free Software Activist GNU Toolchain Engineer
Vim, Vi, Voltei pro Emacs -- GNUlius Caesar
More information about the Libre-soc-dev
mailing list