I keep changing the basic design of Concertina II, instead of going
forward and completing the task of fleshing it out.
The reason for that... has been obvious all along. None of my attempts
have satisfied me. I had goals for the architecture, some of which
weren't being met by each iteration. So I kept going back and forth
between compromising one set of goals, or compromising another set of
goals.
If I could make up my mind on what was most important to me, perhaps I
could stop somewhere.
Looking back at the various iterations, I did see that two goals were
very important to me.
I wanted to be able to have 16-bit instructions, at least in pairs
within a 32-bit instruction slot, available without the overhead of a
block header, in the basic instruction set. For this, I need to
reserve 1/4 of the opcode space.
Also, I wanted to have the basic load-store memory-reference
instructions be able to use 16-bit displacements, have a three-bit
index register field and a three-bit base register field, and be able
to use all 32 registers in a normal register bank as destinations.
This takes 3/4 of the opcode space.
As 3/4 plus 1/4 is _not_ greater than 1, having both of these things
in a design simultaneously is not impossible.
And I've found some tiny scraps of opcode space left (in the 3/4 part; flexible auto-increment with an odd index register, since only even
index registers are allowed in that mode) which are barely enough...
for two-address register to register operate instructions, _and_ for a
block header.
The block header, while rudimentary, would be enough to allow...
indicating some instruction slots as containing instructions from a
secondary instruction set, so as to allow things like three-address
operate instructions, multiple-register load and store instructions,
and also allowing pseudo-immediates...
and instructions longer than 32 bits.
I have two unused opcodes in the load/store memory reference
instructions, so I can use one of them for jump to subroutine (offset
in the index register field, return address register in the
destination register field) - and one for conditional jump. Since the condition code can go in the destinatin register field, and it only
needs four bits, not five... I can also have a Load Address
instruction, with the limitation that only registers 0-7 and 24-31 can
be used as destinations (the ones used as index registers and the
usual base registers).
However, requiring the block header mechanism even for load and store multiple registers, basic to subroutine calls, means that the basic instruction set is... only _barely_ a complete one.
So this is unlikely to satisfy me for very long either.
One other possibility: stick with the current design - 1/4 of the
opcode space for 16-bit instructions and 1/4 of the opcode space for instructions longer than 32 bits, so as to reduce their overhead and
possibly allow the mechanism to also be used for prefixing
instructions (not needed, though, if I decide to return to having
block headers in a less vestigial form)...
I would have to squeeze the "rest" of the instruction set a bit more
if I switched from aligned-only load and store instructions to going
to using only four base registers for them (the least painful of the restrictions I've considered so far), but it should be doable.
John Savard
In my opinion, your first cut at an ISA encoding should not consume more
than ½ of the available encodings. Concer-tina-tanic is already full to
the brim and you are still just fleshing it out.
While I'm rearranging the deck chairs, maybe I'll come up with an
original idea.
So this is unlikely to satisfy me for very long either.
The main opcode space for 32-bit instructions is now divided as
follows:
3/4 for uncompromised memory-reference instructions.
3/16 for uncompromised register-to-register operate instructions.
1/16 for the header required for variable-length instructions.
The final one is 1111 that allows 17-bit instructions, 48, 64, 80, and
96 bit instructions, and their arbitrary mixing.
On Sun, 05 May 2024 00:57:44 -0600, John Savard <quadibloc@servername.invalid> wrote:
The main opcode space for 32-bit instructions is now divided as
follows:
3/4 for uncompromised memory-reference instructions.
3/16 for uncompromised register-to-register operate instructions.
1/16 for the header required for variable-length instructions.
This is not quite right.
3/4 for uncompromised basic memory-reference instructions.
1/8 for other memory-reference instructions.
1/16 for uncompromised register-to-register operate instructions.
1/16 for the header required for variable-length instructions.
John Savard
But because that code conflicts with the header, these things aren't >first-class citizens! I tried freeing up 1110 as well, but that was
clearly not going to work acceptably. So I took other measures that
only partly addressed that issue but consumed far less opcode space.
On Mon, 06 May 2024 11:06:44 -0600, John Savard ><quadibloc@servername.invalid> wrote:
But because that code conflicts with the header, these things aren't >>first-class citizens! I tried freeing up 1110 as well, but that was
clearly not going to work acceptably. So I took other measures that
only partly addressed that issue but consumed far less opcode space.
Although I had limited long vector and short vector operate
instructions in the basic 32 bit instruction set, I didn't have long
vector and short vector load and store instructions of any kind. Do I
needed to add them in some form in order for the basic 32 bit
instruction set to be complete.
However, if I were to include a 6-bit length field in the long vector
load and store instructions, once again I would have had to free up
1/16 of the opcode space. Instead of completely doing without the
ability to load and store any but full-length vectors, I eventually
was able to include a two-bit length register field to the long vector
load and store instructions.
So this new instruction set has survived another challenge.
In my opinion, your first cut at an ISA encoding should not consume more
than ½ of the available encodings. Concer-tina-tanic is already full to
the brim and you are still just fleshing it out.
Why are my various iterations of Concertina II _all_, consistently,
"full to the brim"?
I can always add one new type of header which specifies alternate >instructions with fairly low overhead... and then, at a modest cost,
even the most enormous new feature can have its own 32-bit
instructions!
I can always add one new type of header which specifies alternate >instructions with fairly low overhead... and then, at a modest cost,
even the most enormous new feature can have its own 32-bit
instructions!
On Thu, 25 Apr 2024 16:00:14 +0000, mitchalsup@aol.com (MitchAlsup1)
wrote:
In my opinion, your first cut at an ISA encoding should not consume more >>than ½ of the available encodings. Concer-tina-tanic is already full to >>the brim and you are still just fleshing it out.
This is a point I think I should address.
Why are my various iterations of Concertina II _all_, consistently,
"full to the brim"?
This is true if I compromise the basic load/store instructions, say by limiting them to three base registers for 16-bit displacements, so I
can reserve 1/4 of the opcode space for paired 16-bit short
instructions - which was one of the most common combinations -
or if I reserve half the opcode space for two kinds of 16-bit short instructions,
or if I don't compromise the basic load/store instructions, and only
allow 16-bit instructions with a special header.
These are the three basic variants of Concertina II that I have been vacillating between. But whichever I choose, I use nearly all possible
opcode space, at least for basic 32-bit instructions.
That didn't worry me much for two reasons.
If I need an enormous amount of opcode space for some new kind of instructions for some new feature...
I would still have _enormous_ amounts of opcode space available up in
the stratosphere of 64-bit instructions and longer. (In some
iterations, I did manage to use nearly all the 48-bit opcode space,
because I tried to squeeze a form of string and packed decimal
instructions there.)
But what if the new feature was so important that I needed to have
*short* instructions for the operations using that feature - 32-bit
long instructions?
Well, because of the block structure of Concertina II, which is
primarily present to support pseudo-immediates (my idea of how to
reconcile immediate values in instructions, which you've pointed out
are very valuable, with my Concertina II design goal of fully
independent and parallel decoding of every instruction in a block) and secondarily to allow VLIW features...
I can always add one new type of header which specifies alternate instructions with fairly low overhead... and then, at a modest cost,
even the most enormous new feature can have its own 32-bit
instructions!
John Savard
On Wed, 08 May 2024 01:46:41 -0600, John Savard <quadibloc@servername.invalid> wrote:
Why are my various iterations of Concertina II _all_, consistently,
"full to the brim"?
I can always add one new type of header which specifies alternate >>instructions with fairly low overhead... and then, at a modest cost,
even the most enormous new feature can have its own 32-bit
instructions!
That only answersl a part of that question - why I feel I can _get
away_ with having an ISA that is "full to the brim". But why did I let
it get that way in the first place?
Well, the reason for that is actually quite simple. Because a major
design goal of Concertina II is to offer as much as possible of the
basic operations required of a computer in instructions of the
shortest possible length.
16-bit displacements are the norm in microprocessor instruction sets,
so I offer them. I offer base-index addressing - which microprocessors usually don't - because I feel it's needed for using arrays. And I
have register banks of 32 registers because that's what today's RISC
machines do.
All of that means that the load and store instructions - particularly
when integer load and store also include load unsigned and insert -
take up 3/4 of all 32-bit instructions (approximately; one doesn't
need unsigned load and insert for the 64-bit integer type, because it
fills the register). And that's with using only 8 of the 32 registers
for the base register and the index register each.
Some parts of the instruction set do have slack. Two-address register-to-register operate instructions have a large opcode field,
so there is some room for future expansion in parts of the instruction
set.
But, basically, it takes all the available bits to offer the level of functionality I am trying to provide with the basic 32-bit instruction
set. Since that covers the traditional functionality of a CPU - floating-point and integer types - nothing basic is missing.
John Savard
May I suggest that sacrificing 16-bit instructions may give you the room >whereby typical applications require less space without the 16-bit insts
that with them !?!
So, why do you need a header AT ALL !!
On Wed, 8 May 2024 21:46:37 +0000, mitchalsup@aol.com (MitchAlsup1)
wrote:
So, why do you need a header AT ALL !!
Assuming I don't want to ever allow the circuits of my computer to try decoding an instruction that turns out later to be data (unless the programmer has made an error, in which case the penalty of the program
being aborted is no problem)...
and I want the computer to be able to decode all the instructions in a
block in parallel, as a way to improve performance,
then I need a block header to say 'here are the instructions to
decode' IF I don't want to be absolutely limited to all instructions
having the same length.
While I could still have a pair of 16-bit instructions in a 32-bit
word, without headers I couldn't have immediates (at least not of most lengths), or other instructions longer than 32 bits.
And headers let me add instruction predication, which is also good, as branches do cause difficulties which predication partly avoids.
(There's still a dependency on what is being predicated upon.)
The header facilitates fast decoding of a flexible instruction set,
and allows VLIW features allowing the ISA to be used for embedded
processors.
John Savard
John Savard wrote:
But what if the new feature was so important that I needed to have
*short* instructions for the operations using that feature - 32-bit
long instructions?
G A S P ........why do I even try.....
What makes you think My 66000 ISA cannot be decoded in parallel ??
Over the last year I have illustrated how up to 16 instructions,
each variable length from 1..5 words, can be decoded in parallel.
You are using a header, I am using logic.
And if that isn't enough, the last two header types let you switch to
38-bit words composed of two 19-bit halfwords. *That's* what I do to
add a bunch of extra 32-bit instructions to the ISA, if some new
feature is so important that I don't want the instructions that deal
with it to have to be 48 bits long at least.
On Wed, 08 May 2024 23:09:09 -0600, John Savard ><quadibloc@servername.invalid> wrote:
Now, one has access to three alternate instruction sets, but instead
of those being fixed, the first two can be chosen from a pool of
sixteen... and the third from a set of 128 different possibilities.
Of course, this sort of thing may leave you gasping in shock and
horror. But look at the bright side. While 128 is a somewhat large
number, it isn't astronomical; I haven't provided for an opcode space
so large that there isn't enough matter in the whole Universe to
print a programmer's manual for the architecture.
Now, _that_ would be genuinely impracitcal!
Now, one has access to three alternate instruction sets, but instead
of those being fixed, the first two can be chosen from a pool of
sixteen... and the third from a set of 128 different possibilities.
On Thu, 9 May 2024 03:05:55 +0000, mitchalsup@aol.com (MitchAlsup1)
wrote:
What makes you think My 66000 ISA cannot be decoded in parallel ??
Over the last year I have illustrated how up to 16 instructions,
each variable length from 1..5 words, can be decoded in parallel.
You are using a header, I am using logic.
One of the things I'm doing is trying to make my ISA capable of
efficient implementations by implementors who aren't necessarily as
smart as you are; with headers, it's obvious how instructions can be
decoded in parallel.
Of course, this sort of thing may leave you gasping in shock and
horror. But look at the bright side. While 128 is a somewhat large
number, it isn't astronomical; I haven't provided for an opcode
space so large that there isn't enough matter in the whole Universe to >print a programmer's manual for the architecture.
Now, _that_ would be genuinely impracitcal!
Of course, as these many additional sets of instructions get fleshed
out, were the ISA to be implemented
On Wed, 8 May 2024 21:46:37 +0000, mitchalsup@aol.com (MitchAlsup1)
wrote:
So, why do you need a header AT ALL !!
Assuming I don't want to ever allow the circuits of my computer to try decoding an instruction that turns out later to be data (unless the programmer has made an error, in which case the penalty of the program
being aborted is no problem)...
and I want the computer to be able to decode all the instructions in a
block in parallel, as a way to improve performance,
I think you've just added another couple of orders of magnitude to the
odds against that happening.
It is ok to *try* decoding a length from a token that might be an
instruction as long as you toss it away when you later find that it wasn't.
You use the tail of the first instruction to select the start of the second. You use the tail of the first pair to select the start of the second pair. You use the tail of the first quad to select the start of the second quad.
For example, if instructions can be 1..4 tokens long
then the next instruction comes from one of 4 following tokens,
the next instruction pair comes from one of 7 following instruction pairs, the next instruction quad comes from one of 13 following instruction quads.
Decode0 Decode1 Decode2 Decode3 Decode4 Decode5...
| | | | | |
v v v v v v
Length0->[--------4:1 Select Mux----------][----------...
| | | | | |
v v | | | |
Inst0 Inst1 v v v v
Length1->[----------7:1 Select Mux---------------------]
| | | |
v v v v
Inst2 Inst3 [----------13:1 Select Mux-----------]
| | | |
v v v v
Inst4 Inst5 Inst6 Inst7
<---first pair---><--second pair--><--third pair---><---fourth pair--->
<-----------first quad------------><--------second quad--------------->
EricP wrote:
It is ok to *try* decoding a length from a token that might be an
instruction as long as you toss it away when you later find that it
wasn't.
You use the tail of the first instruction to select the start of the
second.
You use the tail of the first pair to select the start of the second
pair.
You use the tail of the first quad to select the start of the second
quad.
For example, if instructions can be 1..4 tokens long
then the next instruction comes from one of 4 following tokens,
the next instruction pair comes from one of 7 following instruction
pairs,
the next instruction quad comes from one of 13 following instruction
quads.
Decode0 Decode1 Decode2 Decode3 Decode4 Decode5...
| | | | | |
v v v v v v
Length0->[--------4:1 Select Mux----------][----------...
| | | | | |
v v | | | |
Inst0 Inst1 v v v v
Length1->[----------7:1 Select Mux---------------------]
| | | |
v v v v
Inst2 Inst3 [----------13:1 Select
Mux-----------]
| | | |
v v v v
Inst4 Inst5 Inst6 Inst7
<---first pair---><--second pair--><--third pair---><---fourth
pair--->
<-----------first quad------------><--------second
quad--------------->
Treeifying::
Decode0 Decode1 Decode2 Decode3 Decode4 Decode5...
| | | | | |
| | | Pinst3->[--------4:1 Select Mux-
| | | | | |
| | Pinst2->[--------4:1 Select Mux----------]
| | | | | |
| Pinst1->[--------4:1 Select Mux----------]
| Length1 | | | |
v v v v v v
Length0->[--------4:1 Select Mux----------]
| | | | | |
v v | | | |
Inst0 Inst1 v v v v
Length1->[----------2:1×4 Select Mux----------------]
| | | |
v v v v
Inst2 Inst3 [----------2:1×4 Select Mux-----------]
| | | |
v v v v
Inst4 Inst5 Inst6 Inst7
<---first pair---><--second pair--><--third pair---><---fourth pair--->
<-----------first quad------------><--------second quad--------------->
Where Pinsti is a purported instruction decode which may or may not
be selected as an instruction starting point. This gets rid of the
wide multiplexers at the cost of additional 4:1 multiplexers.
And thanks for taking the time to ASCII-art the figure.
On Thu, 9 May 2024 20:28 +0100 (BST), jgd@cix.co.uk (John Dallman)
wrote:
I think you've just added another couple of orders of magnitude to
the odds against that happening.
What, you don't think that an ISA that is capable of handlling an
instruction set two orders of magnitude larger than ordinary
instruction sets wouildn't have a highly sought-after feature, at
least for some niches?
MitchAlsup1 wrote:
EricP wrote:
It is ok to *try* decoding a length from a token that might be an
instruction as long as you toss it away when you later find that it
wasn't.
You use the tail of the first instruction to select the start of the
second.
You use the tail of the first pair to select the start of the second
pair.
You use the tail of the first quad to select the start of the second
quad.
For example, if instructions can be 1..4 tokens long
then the next instruction comes from one of 4 following tokens,
the next instruction pair comes from one of 7 following instruction
pairs,
the next instruction quad comes from one of 13 following instruction
quads.
Decode0 Decode1 Decode2 Decode3 Decode4 Decode5...
| | | | | |
v v v v v v
Length0->[--------4:1 Select Mux----------][----------...
| | | | | |
v v | | | |
Inst0 Inst1 v v v v
Length1->[----------7:1 Select Mux---------------------]
| | | |
v v v v
Inst2 Inst3 [----------13:1 Select
Mux-----------]
| | | |
v v v v
Inst4 Inst5 Inst6 Inst7
<---first pair---><--second pair--><--third pair---><---fourth
pair--->
<-----------first quad------------><--------second
quad--------------->
Treeifying::
Decode0 Decode1 Decode2 Decode3 Decode4 Decode5...
| | | | | |
| | | Pinst3->[--------4:1 Select Mux-
| | | | | |
| | Pinst2->[--------4:1 Select Mux----------]
| | | | | |
| Pinst1->[--------4:1 Select Mux----------]
| Length1 | | | |
v v v v v v
Length0->[--------4:1 Select Mux----------]
| | | | | |
v v | | | |
Inst0 Inst1 v v v v
Length1->[----------2:1×4 Select Mux----------------]
| | | |
v v v v
Inst2 Inst3 [----------2:1×4 Select
Mux-----------]
| | | |
v v v v
Inst4 Inst5 Inst6 Inst7
<---first pair---><--second pair--><--third pair---><---fourth pair---> >> <-----------first quad------------><--------second quad---------------> >>
Where Pinsti is a purported instruction decode which may or may not
be selected as an instruction starting point. This gets rid of the
wide multiplexers at the cost of additional 4:1 multiplexers.
And thanks for taking the time to ASCII-art the figure.
I should have mentioned those muxes are replicated horizontally across
the input token buffer for each offset a pair or quad could start at.
In the above case, the input buffer has space for 8 instruction * 4 tokens, The first token is offset 0, the first possible pair starts at offset 1,
the last possible pair starts at offset 28, so thats 28 sets of 4:1 muxes
* 4 tokens per instruction * bits-per-token (plus sundry housekeeping bits).
Also I used one-hot select muxes,
that is the 4:1 mux has a 4-bit
one-hot select control and the 7:1 mux has a 7-bit select control,
as it is easier to shift a one-hot enable out to the next position,
and it eliminates the mux binary decoder and length adders for
figuring out where the next pair or quad starts from.
So those wide muxes are really just a layer of AND gates enabled by
one of the select control bits, and a 4 or 7 or 13 input OR.
There are no length adders inside the selection routing tree,
just at the end to sum up the total length of valid instruction bytes
so we know what to increment the fetch RIP by.
Not that justified the costs of implementing such a huge instruction set.
On Fri, 10 May 2024 00:19 +0100 (BST), jgd@cix.co.uk (John Dallman)
wrote:
Not that justified the costs of implementing such a huge instruction set.
Well, having a huge instruction set defined and implementing all of it
are two different things.
Look at x86, how MMX got replaced by SSE which got replaced by AVX.
So if one is going to include instructions that will later become
obsolete, and be replaced by other instructions, not re-using the same opcodes helps with upwards compatibility.
John Savard
On Fri, 10 May 2024 00:19 +0100 (BST), jgd@cix.co.uk (John Dallman)
wrote:
Not that justified the costs of implementing such a huge
instruction set.
Well, having a huge instruction set defined and implementing all of
it are two different things.
Look at x86, how MMX got replaced by SSE which got replaced by AVX.
So if one is going to include instructions that will later become
obsolete, and be replaced by other instructions, not re-using the
same opcodes helps with upwards compatibility.
Or skip to the end and only invent AVX while skipping the soon-to-be >redundant intermediate stages.
On Fri, 10 May 2024 17:27:10 +0000, mitchalsup@aol.com (MitchAlsup1)
wrote:
Or skip to the end and only invent AVX while skipping the soon-to-be >>redundant intermediate stages.
Well, I went to 256-bit short vectors as a permanent part of the architecture, with long vectors as the next step.
But what about crypto assist instructions, as another example?
However, I think I will adjust this feature. You comlained I used up
too much of my opcode space, so I demonstrated that Concertina II had
the potential to have... a _lot_ of opcode space, even to ludicrous
lengths.
Now that I think I can finally wrap up Concertina II, having found how
to achieve its goals as best as possible, I can go on to Concertina
III... and, given your anguished pleas, I _will_ give up on block
structure for the next iteration.
In order to do that, though, it will have to be CISC, not RISC...
banks of 8 registes, sort of like Concertina I, but much less messy.
John Savard
John Savard wrote:
Now that I think I can finally wrap up Concertina II, having found how
to achieve its goals as best as possible, I can go on to Concertina
III... and, given your anguished pleas, I _will_ give up on block
structure for the next iteration.
Would you like to read My 66000 ISA while taking a break between CT II and
CT III ??
In order to do that, though, it will have to be CISC, not RISC...
banks of 8 registes, sort of like Concertina I, but much less messy.
With MEM-OPs are you not already CISC ??
On Fri, 10 May 2024 21:06:58 +0000, mitchalsup@aol.com (MitchAlsup1)
wrote:
With MEM-OPs are you not already CISC ??
I should have been clearer, but to tell the truth would have taken
many words.
What I meant was that while Concertina II indeed is hardly RISC, it
still contains a near-RISC instruction set in the basic 32-bit
operations. Unlike typical RISC instruction sets, it has base plus
index addressing, though.
Then mem-ops are added in the first supplementary instruction set,
yes. Concertina II is intended to be "architecture-agnostic", being at
once sort of like RISC, but also VLIW and CISC.
What Concertina III would give up, to no longer be RISC at all, would
be register banks of 32 registers. Changing that to 8 registers
shortens certain fields, letting me switch to native variable-length >instructions without the need for any block header mechanism.
On Fri, 10 May 2024 17:27:10 +0000, mitchalsup@aol.com (MitchAlsup1)
wrote:
Or skip to the end and only invent AVX while skipping the soon-to-be >>redundant intermediate stages.
Well, I went to 256-bit short vectors as a permanent part of the architecture, with long vectors as the next step.
But what about crypto assist instructions, as another example?
On Fri, 10 May 2024 21:06:58 +0000, mitchalsup@aol.com (MitchAlsup1)
wrote:
Would you like to read My 66000 ISA while taking a break between CT II and >>CT III ??
Oh, yes, indeed, although I don't promise to shamelessly steal all
your good ideas.
Also, teaching development tools about vast instruction sets is likely to >demonstrate the RISC lesson again: compilers only use the simple parts.
John Savard wrote:
On Fri, 10 May 2024 21:06:58 +0000, mitchalsup@aol.com (MitchAlsup1)
wrote:
Would you like to read My 66000 ISA while taking a break between CT II and >>>CT III ??
Oh, yes, indeed, although I don't promise to shamelessly steal all
your good ideas.
Send me an e-mail I can use as a return address.
You will probably want to look at AES for this. AES operates on
16-byte blocks, so having 128-bit registers is natural.
John Savard wrote:
But what about crypto assist instructions, as another example?
If used often enough, sure, they make a lot of sense--just make whatever
you put in applicable to a myriad of crypto functions.
jgd@cix.co.uk (John Dallman) writes:
Also, teaching development tools about vast instruction sets is likely to >>demonstrate the RISC lesson again: compilers only use the simple parts.
That needs some elaboration. There are several potential reasons for
that:
1) The compiler writers found it too hard to use the complex
instructions or addressing modes. For some kinds of instructions that
is the case (e.g, for the AES instructions in Intel and AMD CPUs), but
at least these days such instructions are there for use in libraries
written in assembly language/with intrinsics.
2) Some instructions are slower than a sequence of simpler
instructions, so compilers will avoid them even if they would
otherwise use them.
That has been reported by both the IBM 801
project about some S/370 instructions and by the Berkeley RISC project
about the VAX. I don't remember any reports about addressing modes
with that problem.
3) Some instructions or addressing modes can be selected by compilers
and are beneficial when they are used, but they are selected rarely
because they fit the needs of the compiled program rarely.
next LD Rd,[Rp,#next]p[i] LD Rd,[Rp,Ri<<scale] // RISC-V fails
array[i] LD Rd,[Rp,Ri<<scale,#array] // RISC-V fails
IIRC the RISC papers mentioned mainly 2), with a little bit of 3).
- anton
In article <fajp3j12esafhpn3e27ntfq5f538jmb3q7@4ax.com>, >quadibloc@servername.invalid (John Savard) wrote:
Of course, this sort of thing may leave you gasping in shock and
horror. But look at the bright side. While 128 is a somewhat large
number, it isn't astronomical; I haven't provided for an opcode
space so large that there isn't enough matter in the whole Universe to
print a programmer's manual for the architecture.
Now, _that_ would be genuinely impracitcal!
Of course, as these many additional sets of instructions get fleshed
out, were the ISA to be implemented
I think you've just added another couple of orders of magnitude to the
odds against that happening.
Now I've changed the applicable header format to provide only _eight_ additional alternate instruction sets,
I keep changing the basic design of Concertina II, instead of going
forward and completing the task of fleshing it out.
Since I've been going around in circles, all I had to do was go back
and grab my files for
http://www.quadibloc.com/arch/cw0102.htm
(not currently a valid URL, but it can be found, no doubt, on the
Wayback Machine)
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 547 |
Nodes: | 16 (2 / 14) |
Uptime: | 71:23:50 |
Calls: | 10,398 |
Files: | 14,070 |
Messages: | 6,417,621 |