With sequential decode, I suppose I could site immediate values after
the instruction proper, but I've found that I do not have to do that, I
can have them within the instruction body as normally indicated by its leading bits - with only one bit of awkwardness for the 64-bit
immediates.
Concertina III is described at http://www.quadibloc.com/arch/cy01int.htm
After realizing that Mitch Alsup was right in that there was no real
benefit in speeding up instruction decode in the manner I was trying to achieve with the use of block headers, I had tried, by going from banks of 32 registers to banks of 16 registers, to move to variable-length instructions.
For some reason, though, I couldn't make it work. It seemed like it
should, but I couldn't get the 16-bit instructions to fit.
Well, I've made another attempt. And it seems like going to banks of 16 registers is indeed sufficient (retaining, from Concertina II, the
artifice of only using seven registers as base registers and another seven as index registers) to fit an instruction set as complete as the one I'm aiming for in the available opcode space.
Of course, this does give up VLIW functionality. But while VLIW may not be
a true failure, where it works is in small-scale embedded processors. So
I'm not going to worry about attempting to use VLIW as a more conventional alternative to Ivan Godard's more radical Mill design.
With sequential decode, I suppose I could site immediate values after the instruction proper, but I've found that I do not have to do that, I can
have them within the instruction body as normally indicated by its leading bits - with only one bit of awkwardness for the 64-bit immediates.
Concertina III is described at--- Synchronet 3.22a-Linux NewsLink 1.2
http://www.quadibloc.com/arch/cy01int.htm
John Savard
The experience of both led me to My 66000 that simply appends constants
to the instructions (1 constant per 1 instruction). The VLI decoder is 6 gates and 2 gates of delay.) this has worked out so well, that I
encourage others to follow suit (or outright copy...)
quadi <quadibloc@ca.invalid> posted:
With sequential decode, I suppose I could site immediate values after the
instruction proper, but I've found that I do not have to do that, I can
have them within the instruction body as normally indicated by its leading >> bits - with only one bit of awkwardness for the 64-bit immediates.
In K9, we used a packet cache of 8 instructions per fetch, and used a
scheme called "vertical neighbor" to hold non-8-bit immediates.
In Mc88120 we just executed the SETHI and OP instructions to paste bits >together.
The experience of both led me to My 66000 that simply appends constants
to the instructions (1 constant per 1 instruction). The VLI decoder is
6 gates and 2 gates of delay.) this has worked out so well, that I
encourage others to follow suit (or outright copy...)
quadi <quadibloc@ca.invalid> posted:
After realizing that Mitch Alsup was right in that there was no real
benefit in speeding up instruction decode in the manner I was trying to
achieve with the use of block headers, I had tried, by going from banks of >> 32 registers to banks of 16 registers, to move to variable-length
instructions.
See Gould S.E.L 32/87 (or /67) for ideas to save a few bits here and there along the lines of base registers and register segmentation.
For some reason, though, I couldn't make it work. It seemed like it
should, but I couldn't get the 16-bit instructions to fit.
Well, I've made another attempt. And it seems like going to banks of 16
registers is indeed sufficient (retaining, from Concertina II, the
artifice of only using seven registers as base registers and another seven >> as index registers) to fit an instruction set as complete as the one I'm
aiming for in the available opcode space.
Of course, this does give up VLIW functionality. But while VLIW may not be >> a true failure, where it works is in small-scale embedded processors. So
I'm not going to worry about attempting to use VLIW as a more conventional >> alternative to Ivan Godard's more radical Mill design.
Is there any "real" or even "useful" advantage of VLIW ??? Given the number of attempts and no real long-lasting results, history should be your guide.
With sequential decode, I suppose I could site immediate values after the
instruction proper, but I've found that I do not have to do that, I can
have them within the instruction body as normally indicated by its leading >> bits - with only one bit of awkwardness for the 64-bit immediates.
In K9, we used a packet cache of 8 instructions per fetch, and used a
scheme called "vertical neighbor" to hold non-8-bit immediates.
In Mc88120 we just executed the SETHI and OP instructions to paste bits together.
The experience of both led me to My 66000 that simply appends constants
to the instructions (1 constant per 1 instruction). The VLI decoder is
6 gates and 2 gates of delay.) this has worked out so well, that I
encourage others to follow suit (or outright copy...)
Concertina III is described at
http://www.quadibloc.com/arch/cy01int.htm
John Savard
On Thu, 14 May 2026 21:41:59 +0000, MitchAlsup wrote:
The experience of both led me to My 66000 that simply appends constants
to the instructions (1 constant per 1 instruction). The VLI decoder is
6 gates and 2 gates of delay.) this has worked out so well, that I
encourage others to follow suit (or outright copy...)
That is an approach which does have an important advantage. Right now, I
only have immediates for the basic integer and floating-point
operations.
What about decimal floating-point immediates, for example? Appending
them to the instruction can be simple and orthogonal.
Is there any "real" or even "useful" advantage of VLIW ??? Given the
number of attempts and no real long-lasting results, history should be
your guide.
Could 14 bits be useful where
13 bits are doomed to fail,
On Sat, 16 May 2026 03:57:06 +0000, quadi wrote:
Could 14 bits be useful where 13 bits are doomed to fail,
Actually, though, I had worked out two ways where 16 bit short
instructions that all must start with 111 could perhaps do useful work.
The first one was:
111 + (seven bit opcode) + (3) + (3)
On Thu, 14 May 2026 21:41:59 +0000, MitchAlsup wrote:
Is there any "real" or even "useful" advantage of VLIW ??? Given the
number of attempts and no real long-lasting results, history should be
your guide.
As I've noted, "the guy who invented VLIW" claimed, in a YouTube video,
that a VLIW processor is highly successful as an embedded video processor. >Of course, though, he is hardly a disinterested source.
On Thu, 14 May 2026 21:41:59 +0000, MitchAlsup wrote:
Is there any "real" or even "useful" advantage of VLIW ??? Given the
number of attempts and no real long-lasting results, history should be
your guide.
As I've noted, "the guy who invented VLIW" claimed, in a YouTube video,
that a VLIW processor is highly successful as an embedded video processor.
Of course, though, he is hardly a disinterested source.
But the idea that putting bits in instructions to indicate that they can
be executed in parallel can enhance pipelining without the huge overhead
of out-of-order execution seems plausible to me. It's the same sort of argument that Ivan Godard made for his innovative Mill design. You've
noted, though, that unlike register hazards, cache misses, which are unpredictable by compilers, can be handled by a simpler form of OoO, the scoreboard of the 6600.
In a way, Concertina II is VLIW "perfected" - by putting the bits that indicate parallelism in a header at the start of the block, the price of indicating parallelism isn't a shorter instruction word, and hence having
to make do with fewer registers, or shorter displacement fields, all
things that do have an obvious negative impact on performance.
And by going from the block-oriented Concertina II design to the variable- length instruction Concertina III design, I've gone from banks of 32 registers to banks of 16 registers!
Did I have to do this?
In Concertina III, instructions longer than 32 bits take up 1/16 of the opcode space. Adding a bit so as to use 32 registers instead of 16 would change that to 1/8.
In Concertina II, the 32-bit instructions take up about 3/4 of the opcode space.
So an ISA without block structure, with variable-length instructions
instead, with banks of 32 registers is possible! However, only 1/8 of the opcode space would be left for short instructions, and 16-bit instructions with only 13 bits available... would be largely useless. If having the
option of using 16-bit instructions is the primary benefit of having variable-length instructions, instead of every instruction being 32 bits long... then attempting to obtain the best of Concertina II and III in a single design through this artifice... which seems so very tempting... is
a mistake.
Of course, the 360 managed to get by quite well with only 1/4 of the opcode space used by 16-bit instructions. Could 14 bits be useful where 13 bits
are doomed to fail, and if so, what contrivance could I possibly use to squeeze out that extra opcode space... since I've tried, and abandoned as fatally flawed, a _lot_ of contrivances to squeeze out space in just that
way in the development of Concertina II?
Block structure had the advantage of letting me pack more bits in instructions. That it let me offer VLIW, in the sense of controlling
parallel execution, as an option... was just gravy.
John Savard
According to quadi <quadibloc@ca.invalid>:
On Thu, 14 May 2026 21:41:59 +0000, MitchAlsup wrote:
Is there any "real" or even "useful" advantage of VLIW ??? Given the
number of attempts and no real long-lasting results, history should be
your guide.
As I've noted, "the guy who invented VLIW" claimed, in a YouTube video,
that a VLIW processor is highly successful as an embedded video processor. >> Of course, though, he is hardly a disinterested source.
It works great in programs where the compiler can predict the sequence of memory
references at compile time, much less well when the sequence is data dependent.
I can believe that video processing falls into the first category.
On 5/15/2026 10:57 PM, quadi wrote:
On Thu, 14 May 2026 21:41:59 +0000, MitchAlsup wrote:
Is there any "real" or even "useful" advantage of VLIW ??? Given the
number of attempts and no real long-lasting results, history should be
your guide.
As I've noted, "the guy who invented VLIW" claimed, in a YouTube video, that a VLIW processor is highly successful as an embedded video processor. Of course, though, he is hardly a disinterested source.
But the idea that putting bits in instructions to indicate that they can
be executed in parallel can enhance pipelining without the huge overhead
of out-of-order execution seems plausible to me. It's the same sort of argument that Ivan Godard made for his innovative Mill design. You've noted, though, that unlike register hazards, cache misses, which are unpredictable by compilers, can be handled by a simpler form of OoO, the scoreboard of the 6600.
It is more VLIW vs In-Order, and In-Order vs OoO.
VLIW vs In-Order:
VLIW:
+ Slightly cheaper logic;
- Binary depends more on processor specifics.
In-Order:
- Needs logic to handle register deps and lookup opcode flags.
+ Code does not depend on uArch.
In-Order vs Out-of-Order:
In-Order:
+ Simpler hardware
- Not as fast
OoO:
- Complex hardware (reorder buffer, scoreboard/renamer, ...)
+ Faster
Both VLIW and In-Order benefit from a large register file.
OoO mostly benefits ISA designs that would otherwise be slow.
Mostly absorbing the cost of a lot of the ISA level inefficiencies.
Theoretically, OoO can better absorb cache misses, however my own
testing implies that the delta vs "cache miss results in pipeline stall"
vs "delay instruction to hide miss" appears to be mostly negligible.
Also raw CPU speed doesn't matter as much when the computation is
primarily limited by RAM bandwidth or latency (seems to be a pretty
common scenario IME).
In my case, I had realized that In-Order could be handled nearly exactly
the same as my prior LIW handling (no real changes needed to the
pipeline, etc), with the primary change that the I$ can have logic to
detect which instructions can run in parallel during cache line fetch,
and doing this is in-effect cheap enough to be worthwhile (the in-orderWhen Rd-1 ~= either{SRC1-2, or SRC2-2}
not adding any significant resource cost over LIW).
So, in my case, 16 byte cache lines, in Op0..Op3:
Can Op0 co-execute with Op1?
Can Op1 co-execute with Op2?When Rd-1 ~= either{SRC1-3, or SRC2-3}
Can Op2 co-execute with Op3?When Rd-2 ~= either{SRC1-3, or SRC2-3}
Can Op0/1/2 co-execute?Depends on what is in Lane 2
Can Op1/2/3 co-execute?
----------
So, say, superscalar logic was a lookup over opcode bits for flags like:
can this op run in Lane 2?
Can this op run in Lane 3?...
Can this op run with another op in Lane 2?
Can this op run with another op in Lane 3?
Does this op use Rd as a source?
Does this op use Rt as a source?
According to quadi <quadibloc@ca.invalid>:
On Thu, 14 May 2026 21:41:59 +0000, MitchAlsup wrote:
Is there any "real" or even "useful" advantage of VLIW ??? Given the
number of attempts and no real long-lasting results, history should be
your guide.
As I've noted, "the guy who invented VLIW" claimed, in a YouTube video,
that a VLIW processor is highly successful as an embedded video processor. >> Of course, though, he is hardly a disinterested source.
It works great in programs where the compiler can predict the sequence of memory
references at compile time, much less well when the sequence is data dependent.
I can believe that video processing falls into the first category.
On Sat, 16 May 2026 04:13:01 +0000, quadi wrote:
The first one was:
111 + (seven bit opcode) + (3) + (3)
I have finally realized that there is a way to turn the impossible goal
that seemed so tantalizingly close to achievement into something
possible.
Just add
11111 +
(break bit) +
(seven-bit opcode) +
(condition code bit) +
(five-bit destination register) +
(five-bit source register)
BGB <cr88192@gmail.com> posted:
On 5/15/2026 10:57 PM, quadi wrote:
On Thu, 14 May 2026 21:41:59 +0000, MitchAlsup wrote:
Is there any "real" or even "useful" advantage of VLIW ??? Given the
number of attempts and no real long-lasting results, history should be >>>> your guide.
As I've noted, "the guy who invented VLIW" claimed, in a YouTube video,
that a VLIW processor is highly successful as an embedded video processor. >>> Of course, though, he is hardly a disinterested source.
But the idea that putting bits in instructions to indicate that they can >>> be executed in parallel can enhance pipelining without the huge overhead >>> of out-of-order execution seems plausible to me. It's the same sort of
argument that Ivan Godard made for his innovative Mill design. You've
noted, though, that unlike register hazards, cache misses, which are
unpredictable by compilers, can be handled by a simpler form of OoO, the >>> scoreboard of the 6600.
It is more VLIW vs In-Order, and In-Order vs OoO.
VLIW vs In-Order:
VLIW:
+ Slightly cheaper logic;
- Binary depends more on processor specifics.
In-Order:
- Needs logic to handle register deps and lookup opcode flags.
+ Code does not depend on uArch.
In-Order vs Out-of-Order:
In-Order:
+ Simpler hardware
- Not as fast
OoO:
- Complex hardware (reorder buffer, scoreboard/renamer, ...)
+ Faster
S/Faster/Higher Performing/
Both VLIW and In-Order benefit from a large register file.
OoO mostly benefits ISA designs that would otherwise be slow.
Mostly absorbing the cost of a lot of the ISA level inefficiencies.
Theoretically, OoO can better absorb cache misses, however my own
testing implies that the delta vs "cache miss results in pipeline stall"
vs "delay instruction to hide miss" appears to be mostly negligible.
You do not have an execution pipeline with depth > L1 cache miss
latency. When you do, new effects become feasible--like beginning
the second next loop iteration before the first one has completed.
This is where you can now absorb the L1 cache miss latency.
Also raw CPU speed doesn't matter as much when the computation is
primarily limited by RAM bandwidth or latency (seems to be a pretty
common scenario IME).
In my case, I had realized that In-Order could be handled nearly exactly
the same as my prior LIW handling (no real changes needed to the
pipeline, etc), with the primary change that the I$ can have logic to
detect which instructions can run in parallel during cache line fetch,
When you do not have condition codes, and only 1 register file, you
can determine parallel-ness by simply looking at the registers.
and doing this is in-effect cheap enough to be worthwhile (the in-orderWhen Rd-1 ~= either{SRC1-2, or SRC2-2}
not adding any significant resource cost over LIW).
So, in my case, 16 byte cache lines, in Op0..Op3:
Can Op0 co-execute with Op1?
Can Op1 co-execute with Op2?When Rd-1 ~= either{SRC1-3, or SRC2-3}
Can Op2 co-execute with Op3?When Rd-2 ~= either{SRC1-3, or SRC2-3}
Can Op0/1/2 co-execute?Depends on what is in Lane 2
Can Op1/2/3 co-execute?
----------
So, say, superscalar logic was a lookup over opcode bits for flags like:
can this op run in Lane 2?
Can this op run in Lane 3?...
Can this op run with another op in Lane 2?
Can this op run with another op in Lane 3?
Does this op use Rd as a source?
Does this op use Rt as a source?
Given nomenclature like Mc88120 where {
Lanes = {MEM0, MEM1, MEM2, FADD, FMUL, Branch}
And MEM has an integer unit, and a shift unit
FADD has an integer unit
FMUL has an integer unit
Branch has an integer unit }
And each unit is buffered with its own reservation station;
You just let the RSs create a solution.
Given nomenclature like M5 with >10 FUs, the calculation is harder,
but you still just let the RSs create the solution.
--------------
So I need additional opcode space for 48-bit instructions.
On Sun, 17 May 2026 15:24:20 +0000, quadi wrote:
So I need additional opcode space for 48-bit instructions.
I managed to find enough space for the 48-bit instructions without taking any from elsewhere.
However, I'm now encountering a problem with the 32-bit instructions.
Given how I'm handlng other sizes of immediates, I want all 32 registers
to be possible destinations for the 16-bit immediates.
This leads to an opcode space shortage for 32-bit operate instructions. There was a little slack in the existing 32-bit instructions that I could squeeze, but not enough.
The amount needed, though, is 1/3 the size of what the 16-bit short instructions take, or the same as what the 24-bit short instructions take.
Possible easy and obvious alternatives:
1) Drop the 24-bit short instructions, they're a weird length.
2) Go to 6-bit opcodes for the 16-bit short instructions, limiting them to the most important data types.
3) Stick with only 8 (or even only 16) registers as the destination of a 16-bit immediate.
Maybe I can squeeze more and avoid having to do any of them; if I must choose, (2) sounds like the most attractive, as a short instruction that--- Synchronet 3.22a-Linux NewsLink 1.2
can only work on the first 8 registers is disfavored anyways.
John Savard
It is more VLIW vs In-Order, and In-Order vs OoO.
VLIW vs In-Order:
-a-a-a VLIW:
-a-a-a-a-a + Slightly cheaper logic;
-a-a-a-a-a - Binary depends more on processor specifics.
-a-a-a In-Order:
-a-a-a-a-a - Needs logic to handle register deps and lookup opcode flags. >>> -a-a-a-a-a + Code does not depend on uArch.
| Sysop: | Amessyroom |
|---|---|
| Location: | Fayetteville, NC |
| Users: | 65 |
| Nodes: | 6 (0 / 6) |
| Uptime: | 06:08:08 |
| Calls: | 862 |
| Files: | 1,311 |
| D/L today: |
921 files (14,318M bytes) |
| Messages: | 264,697 |