What can't I get?
You know darn well!
Oh, wait a moment, that's Oscar and Hammerstein, not the Rolling
Stones.
What can't I get?
You know darn well!
Oh, wait a moment, that's Oscar and Hammerstein, not the Rolling
Stones.
In any case... in looking into the possibility of abandoning block
structure for my new Concertina II+ ISA, I've thought of new ways to
squeeze things into the ISA.
And so I've come to some conclusions.
Basically, if I use the techniques I've found, and, in addition,
abandon the idea of having paired short instructions in plain
non-blocked code, I can have at least very limited versions of the
various types of instructions which previously had been placed in
"alternate" 32-bit instruction sets in the main 32-bit instruction
set.
This lets me get rid of the complexity of headers, letting me get by
with just three headers - one for variable-length instructions, one
for allowing pseudo-immediates iwith minimal overhead,
and one for
VLIW features like explicit parallelism and predication.
The benefits of keeping block structure are:
- immediate values are contiguous, in the same form as values of the
same type in data;
- greater bit-efficiency of the code,
with less overhead for
additional types of instruction (17-bit short instructions, 48-bit instructions, and so on).
John Savard--- Synchronet 3.22a-Linux NewsLink 1.2
In my opinion, one of the most valuable parallelism features is to be
able to write:
Simultaneous{ Mov R10,R20, Mov R20,R10 }
Which swaps the register values in 2 instructions rather than 3. In K9
we had a HW-peep-hole optimizer which found theses and we re-wrote the >register specifiers with an encoding which allowed the above.
What can't I get?
You know darn well!
Oh, wait a moment, that's Oscar and Hammerstein,
Rogers and Hammerstein. But Hammerstein's first name was Oscar. And if
you only refer to the lyrics, they are Hammersteins. Richard Rogers
wrote the music.
In any case, I have uploaded the first few pages of my latest
iteration of Concertina II, at
http://www.quadibloc.com/arch/ct26int.htm
Have you measured the space saving of paired 16-bit instructions
versus not having any 16-bit instructions ?
On Sun, 11 Oct 2026 19:37:53 GMT, [email protected] (John Savard)
wrote:
In any case, I have uploaded the first few pages of my latest
iteration of Concertina II, at
http://www.quadibloc.com/arch/ct26int.htm
I have now made a bit further progress; I have now uploaded the
formats of instructions longer than 32 bits at
http://www.quadibloc.com/arch/cah0102.htm
I have also modified the page at
http://www.quadibloc.com/arch/cah01.htm
to correct my mistake in throwing away a significant amount of
available opcode space.
On Sun, 11 Oct 2026 21:34:47 GMT, MitchAlsup <[email protected]d> wrote:
Have you measured the space saving of paired 16-bit instructions
versus not having any 16-bit instructions ?
No, I'm not even sure how to conduct a valid measurement of that
type. Constructing a compiler for my ISA and then turning it loose
on a large corpus of FORTRAN would involve an immense amount of work.
Further tweaks have taken place on
http://www.quadibloc.com/arch/cah0102.htm
Now, I have the same opcode length for supplemental load/store
instructions for the extended register banks of 128 registers as for
the regular register banks.
As well, I have added mixed-register two-operand operate instructions;
those for the regular registers, for the extended register banks, and
the mixed-register ones all have the same opcode length.
This ensures that the additional data types and additional operations >provided by the architecture will be equally available on both sets of >registers.
On Sun, 11 Oct 2026 21:34:47 GMT, MitchAlsup <[email protected]d> wrote:
Have you measured the space saving of paired 16-bit instructions
versus not having any 16-bit instructions ?
No, I'm not even sure how to conduct a valid measurement of that type. Constructing a compiler for my ISA and then turning it loose on a
large corpus of FORTRAN would involve an immense amount of work.
If a program consists mostly of operate instructions, and only a small percentage of them need to be three-address, then having 16-bit
instructions would almost shrink the size of the program in half.
If the 16-bit instructions had to come in pairs, then half the time,
the last instruction in any run of operate instructions would have to
be expanded to 32 bits. So that would be a small loss of savings.
Does that mean I made a horribly disastrous choice, then, by getting
rid of the paired 16-bit short instructions? Hold on! I still have
short instructions. Instead of 15-bit ones in pairs, I have 17-bit
ones. So those don't have the restriction that both registers have to
be in the same group of eight registers - about which I recieved many complaints here.
They do come with 12.5% overhead (less the extra 17th bits in the
header) for the Type I header required to use them. But that
percentage is over all instructions in a block with such short
instructions, not just for the short instructions themselves.
So your question _seems_ to be only relevant to a case which does not
exist: the case where I got rid of short instructions entirely. When I
got rid of block structure, though, short instructions effectively
grew to 24 bits, so I did lose a big chunk of the space savings.
Yes, I _know_ _you_ don't need block structure for a lot of the things
I'm using it for. But I want to simplify instruction decoding even for implementors who may not be terribly clever.
And I'm trying to cram an
awful lot of stuff into my ISA - particularly into the opcode space
for instructions that are 32 bits long; this goal also prevents me
from doing as well as you have done in these departments.
John Savard--- Synchronet 3.22a-Linux NewsLink 1.2
You can always have a 16-bit instruction after a 32-bit instruction.
You cannot have a 32-bit instruction after a 16-bit instruction (unless
your IP indexes memory on 16-bit boundaries. CDC 6600 did not. CDC 7600
did.
An ISA is just as much about what you leave out as to what you leave in.
- If an architecture doesn't support, for example, IBM's old
hexadecimal floating-point type, and someone has a need for it, say to
carry out emulation, simulating it in software will be a lot slower
than what hardware could have achieved.
[email protected] (John Savard) posted:
On Sun, 11 Oct 2026 21:34:47 GMT, MitchAlsup
<[email protected]d> wrote:
Have you measured the space saving of paired 16-bit instructions
versus not having any 16-bit instructions ?
No, I'm not even sure how to conduct a valid measurement of that type.
Constructing a compiler for my ISA and then turning it loose on a
large corpus of FORTRAN would involve an immense amount of work.
If a program consists mostly of operate instructions, and only a small
percentage of them need to be three-address, then having 16-bit
instructions would almost shrink the size of the program in half.
You can always have a 16-bit instruction after a 32-bit instruction.
You cannot have a 32-bit instruction after a 16-bit instruction (unless
your IP indexes memory on 16-bit boundaries.
On 10/13/2026 2:24 PM, MitchAlsup wrote:
[email protected] (John Savard) posted:
On Sun, 11 Oct 2026 21:34:47 GMT, MitchAlsup
<[email protected]d> wrote:
Have you measured the space saving of paired 16-bit instructions
versus not having any 16-bit instructions ?
No, I'm not even sure how to conduct a valid measurement of that type.
Constructing a compiler for my ISA and then turning it loose on a
large corpus of FORTRAN would involve an immense amount of work.
If a program consists mostly of operate instructions, and only a small
percentage of them need to be three-address, then having 16-bit
instructions would almost shrink the size of the program in half.
You can always have a 16-bit instruction after a 32-bit instruction.
You cannot have a 32-bit instruction after a 16-bit instruction (unless
your IP indexes memory on 16-bit boundaries.
How costly is doing that? Clearly, it means half the maximum
displacement for control instructions, but since most targets are fairly close, that may not be too big an issue. Then there is the potential
for a 32 bit instruction to cross a cache line boundary. This seems to
cost some, but again how much? ISTM that the costs appears to be non
zero, but modest. Is that correct?
Different implementations treat this differently. The POWER ISA 3.1 >(POWER10), which introduced 64-bit instructions, forbids them when
they cross a cache line and just insert a NOP. They didn't want to
add the logic to handle that case, and if the ABI specifies that
functions are always aligned on a cache line (which makes sense)
then the assembler can handle that.
Different implementations treat this differently. The POWER ISA 3.1 >(POWER10), which introduced 64-bit instructions, forbids them when
they cross a cache line and just insert a NOP. They didn't want to
add the logic to handle that case,
But when I spell out what I have done, I see that I have made a
mistake! For each of the basic integer and floating data types, I have
from 2 to 4 load/store instructions, and from 8 to 16 operate
instructions. I might have some additional operate instructions, but
this seems to suggest that if my load/store instructions can have 10
bit opcodes, anything much above 13 bits for my operate instructions
is wasted. Or, if I have operate instructions with 21-bit opcodes, I
need 18-bit opcodes for the load/store instructions!
Ah, well, I'm sure I can find _some_ way of easily squeezing out the
opcode space with which to remedy this.
So, on
http://www.quadibloc.com/arch/ct26int.htm
I have now added the description of a means by which 48-bit or longer >instructions (but not the 17-bit short instructions) may be executed
from within a block with a Type III header.
It's not particularly efficient - each such instruction wastes at
least 12 bits in the instruction stream - but I felt that this was
worth it to avoid the complexity of an additional type of header, and >forgivable given the degree to which the rest of the ISA goes to great >lengths to achieve economy of code space.
I do not allow myself, or the implementors of Concertina II, such
luxuries.
I managed to modify this so that the mandatory wastage is now three
bits. And I find a use for those three bits.
On Tue, 13 Oct 2026 21:24:56 GMT, MitchAlsup <[email protected]d> wrote:
You can always have a 16-bit instruction after a 32-bit instruction.
You cannot have a 32-bit instruction after a 16-bit instruction (unless >your IP indexes memory on 16-bit boundaries. CDC 6600 did not. CDC 7600 >did.
Where 16-bit instructions are allowed, 32-bit instructions are only
required to be aligned on 16-bit boundaries, and they are allowed to
cross the boundary between successive 256-bit instruction blocks of
the applicable form (the ones with Type I headers).
Thus, I do avoid problems, and have the same flexibility as the
System/360, just with an overhead cost.
An ISA is just as much about what you leave out as to what you leave in.
Yes, I am aware of the sage wisdom of this maxim.
My goal is not, however, to design an ISA that sets records for
elegance and beauty, desirable as those characteristics may be.
My thinking here is motivated by these considerations:
- If an architecture doesn't support, for example, IBM's old
hexadecimal floating-point type, and someone has a need for it, say to
carry out emulation, simulating it in software will be a lot slower
than what hardware could have achieved.
- Including an FPGA as part of a microprocessor, along with
instructions to use it, would make the ISA dependent on the state of
the technology at a particular point in time, one of the major flaws,
in my opinion, of the Itanium.
So perhaps I've chosen to leave out sanity and common sense, in order
to leave in instructions capable of handling any concievable data type
that someone historically had a reason to use on a computer.
Thus, I've been tweaking my 48-bit instructions so that, now, they
allow register-to-register operate instructions with 21-bit opcodes,
and load/store instructions with 10-bit opcodes - both for the regular register banks of 32 registers each and for the extended register
banks of 128 registers each, so that there is opcode space for a wide
variety of data types.
But when I spell out what I have done, I see that I have made a
mistake! For each of the basic integer and floating data types, I have
from 2 to 4 load/store instructions, and from 8 to 16 operate
instructions.
I might have some additional operate instructions, but--- Synchronet 3.22a-Linux NewsLink 1.2
this seems to suggest that if my load/store instructions can have 10
bit opcodes, anything much above 13 bits for my operate instructions
is wasted. Or, if I have operate instructions with 21-bit opcodes, I
need 18-bit opcodes for the load/store instructions!
Ah, well, I'm sure I can find _some_ way of easily squeezing out the
opcode space with which to remedy this.
John Savard
I've now found more opcode space lurking around with which I was able
to add back in some instructions from previous Concertina II
incarnations I had needed to leave out. These extra instructions,
though, will not be amenable to inclusion within blocks with Type III
or Type II headers by the mechanism described above, as they belong to >another opcode space.
On 10/13/2026 2:24 PM, MitchAlsup wrote:
[email protected] (John Savard) posted:
On Sun, 11 Oct 2026 21:34:47 GMT, MitchAlsup
<[email protected]d> wrote:
Have you measured the space saving of paired 16-bit instructions
versus not having any 16-bit instructions ?
No, I'm not even sure how to conduct a valid measurement of that type.
Constructing a compiler for my ISA and then turning it loose on a
large corpus of FORTRAN would involve an immense amount of work.
If a program consists mostly of operate instructions, and only a small
percentage of them need to be three-address, then having 16-bit
instructions would almost shrink the size of the program in half.
You can always have a 16-bit instruction after a 32-bit instruction.
You cannot have a 32-bit instruction after a 16-bit instruction (unless your IP indexes memory on 16-bit boundaries.
How costly is doing that? Clearly, it means half the maximum
displacement for control instructions, but since most targets are fairly close, that may not be too big an issue.
Then there is the potential
for a 32 bit instruction to cross a cache line boundary. This seems to
cost some, but again how much? ISTM that the costs appears to be non
zero, but modest. Is that correct?
During the design of this iteration, because I was using 48-bit
instructions to make up for having only one 32-bit instruction set -
and giving up the header complexity that led to 33-bit and 35-bit
instruction sets - the idea crossed my mind of adding a fourth header
type which allowed extra variability in instruction lengths.
In addition to 17-bit short instructions, and the 32, 48, 64, 80, and
96-bit instructions I now have, I was considering adding 24-bit and
40-bit instructions. (And possibly 56-bit, 72-bit, and 88-bit
instructions, though I doubted there would be any need for that.)
Fortunately, though, I couldn't manage to think of a block header
format which would be efficient in indicating where each instruction
began. Since adding 40-bit instructions was in the interest of having
more compact code, having a block header that was overly large would
cancel out any benefits. (My best approach was to use a bit vector
with only one bit for each 8 bits remaining in the block, _plus_ a
five-bit decode field, so no space would be allowed between
instructions before the area it reserves. Thus, since the bit vector
always indicated the lengths of instructions accurately, and there are
no 8-bit instructions, a 17-bit instruction starting with 0 could be
encoded as a 16-bit instruction, and a 17-bit instruction starting
with 1 could be encoded as a pair of 8-bit instructions! I felt doing
that in a 48-bit header would still be wasteful, but if it could fit
in a 40-bit header, this would indeed be "workable" - however, the
idea was clearly too bizarre even for me to consider attempting.)
Stephen Fuld <[email protected]d> posted:
How costly is doing that? Clearly, it means half the maximum
displacement for control instructions, but since most targets are fairly
close, that may not be too big an issue.
It is close to being an issue with 32-bit branch boundaries and very large functions {think FPPPP which has close to 8192 instructions as straight
line code. (from SPARC V8/V9 memory). I can conceive of My 66000 16-bit branch displacement sufficient (18-bits of signed byte offset), but it starts to cramp at 14-bits (15-bits of byte offset). I do not think any single subroutine will cross the direct BR 26-bit limit (28-bit byte
offset).
it seemed to me that
it would be helpful to have another extra bit, indicating if the
string of bits was preceded, from the active area of the previous
block, with an odd or an even number of ones.
While this is a fascinating scheme to explain in detail, and by
explicitly indicating the length of each instruction, it would vastly >increase the opcode space available for 48-bit instructions and so on,
it is wholly unnecessary as the opcode space for longer instructions
has already been expanded to cover everything that is needed.
I have realized something else that makes it even more tempting.
If 10 can indicate a 17-bit instruction starting with 0, while 11
indicates a 17-bit instruction starting with 1... then I could also
use 1000 and 1100, for example, to replace 32-bit instructions by
33-bit instructions, indicating them as starting with 0 and 1
respectively.
Still to come is a sixth instruction block format where it can be
indicated that data in storage is in memory of a different width -
thaat is, based on 48-bit, 36-bit, or 60-bit units rather than on the
32-bit word.
On Tue, 20 Oct 2026 23:04:17 GMT, [email protected] (John Savard)
wrote:
Still to come is a sixth instruction block format where it can be
indicated that data in storage is in memory of a different width -
thaat is, based on 48-bit, 36-bit, or 60-bit units rather than on the >>32-bit word.
That has now been added, but in the form of a sixth and seventh
instruction block or block header format.
| Sysop: | DaiTengu |
|---|---|
| Location: | Appleton, WI |
| Users: | 1,142 |
| Nodes: | 10 (0 / 10) |
| Uptime: | 91:05:10 |
| Calls: | 14,704 |
| Calls today: | 2 |
| Files: | 186,497 |
| D/L today: |
1,891 files (563M bytes) |
| Messages: | 2,551,613 |