Finalize opcode encodings #29
Description
As part of the effort to drive both this proposal and the bulk memory proposal toward shipping status, let's nail down the opcode encodings. (The bulk memory proposal depends on what we choose for ref.null
and ref.func
, since those are used to express passive element segments.)
The spec interpreter in this repo has some TODO comments around the opcode encodings, and some opcodes are missing from the interpreter at present, and all proposed opcodes are precious single-byte ones.
From the interpreter in this repo we have:
0x25 == table.get
0x26 == table.set
0xd0 == ref.null
0xd1 == ref.is_null
0xd2 == ref.func
From the bulk memory proposal we have these proposed codes:
0xfc 0x08 == memory.init
0xfc 0x09 == data.drop
0xfc 0x0a == memory.copy
0xfc 0x0b == memory.fill
0xfc 0x0c == table.init
0xfc 0x0d == elem.drop
0xfc 0x0e == table.copy
In addition we need opcodes in this proposal for table.grow
, table.size
, and (possibly) table.fill
.
We are in somewhat short supply of single-byte opcodes so I propose that we (a) change the encoding of ref.func
since is not likely to be a very common opcode, and (b) allocate prefixed opcodes also for the three table operations mentioned above, yielding the following table for the present proposal:
0x25 == table.get
0x26 == table.set
0xd0 == ref.null
0xd1 == ref.is_null
0xfc 0x0f == table.grow
0xfc 0x10 == table.size
0xfc 0x11 == table.fill
0xfc 0x20 == ref.func
with the idea that 0xfc 0x20
can be the start of the group for multi-byte gc/reftypes operations, and 0xd0
remains the start of the group for single-byte gc operations.
@rossberg @binji @lukewagner @titzer, opinions?