Intro
This post will just serve as me rambling about a project I'm working on, aka, trying to plan it and setting stuff up for when I actually implement it so I can reason through it before I realize I fucked up about 5 hours into writing an interpreter.
I want to start with some base ideas that I'm going to try to keep in mind when designing the internal structure of the language's interpreter.
Link to the interpreter source code: github.com/juliewoolie/quickscript
- All data exists on the stack.
- That tagline is a bit hyperbolic. I've since discovered that there are some things where its easier for me to pass by reference (arrays, strings, structs) so this mantra exists as a general guideline now.
- No memory interaction
- You should never be able to interact with raw pointers, random memory or anything like C allows you to. It's a scripting language, not C 2.0.
- Type safety and basically compiled
- quickscript is a statically typed language and my hope is a type system will allow me to make the most out of what I'm doing. Static typing means that the compiler basically knows where everything will be, how big it will be and how it'll be used.
- No garbage collector
- Memory handling should be done as it executes, the hope is that with a simple stack-memory-based language data will be freed as scopes are exited and so there's no requirement for automatic garbage collection.
- Single threaded
- I'm not managing that shit, at least not right now. This is called quickscript because it's intended to be a quickly (ish) made scripting language.
Syntax
I'm not defining the grammar, so here's an example of the source code:
| |
Internals
Strings / Arrays
Arrays and Strings are largely handled the same as they are in effect, the same, an array of some data type.
quickscript Strings are UTF-8 encoded arrays of single byte characters.
quickscript Arrays are length-prefixed. Meaning the data of an array consists of 4 bytes to determine the length of the array, with the rest of the bits consisting of the array's data. Arrays, despite the first point in the above section, are heap allocated.
Array data is allocated and freed as required by an internal memory allocator, scripts only ever interact with a pointer to said data. That being said, every other rule still applies in regard to how and when arrays are allocated and freed.
Where arrays and strings differ is that Strings are readonly and cannot be modified with anything other than methods that cause new strings to be allocated.
Concatenating, or swapping out characters in a string causes a new duplicate string to be allocated.
Lookups and stack vs heap usage
While almost all user generated code and the data from it will exist on the stack, there are objects or arrays (strings) that must by necessity exist on the heap.
For example, native functions cannot exist in the same space as user-written functions or variables. So a difference must be established for how local functions and native functions are compiled and interpreted.
Pass by value vs by reference
quickscript will follow Java's lead when it comes to how data is passed. Primitive values such as numbers, booleans and characters is passed by value. But structs, strings, arrays and potentially functions will be passed by pointer reference.
While functions can't be assigned to variables or currently passed to functions as an argument, they do still somehow need to be referenced.
Interpreter
quickscript's internal compiler will compile source files into an internal bytecode that is then executed by the interpreter, that bytecode will be referred to as the IR.
The process of that compilation I will uhh, one day figure out :3 I just wanna figure out how the interpreter itself will function.
The IR data produced by the compiler will be split into multiple parts:
- Const String Pool
- A buffer of utf-8 strings. The strings here are all the identifiers used for function and potentially variable names as well as all the string literals defined in the code itself. As mentioned before, these are length-prefixed UTF-8 strings.
- Function data array
- Each function's instructions are defined within this array, so it's a large buffer of OP Codes and instructions.
Data layout of instructions
an Instruction is an opcode and all of its arguments. Each instruction is made up of a 16-bit opcode followed by 72 bits of arguments. Each instruction is fixed length.
Function invocation
To invoke a function in quickscript, it's function pointer must be called
with the INVOKE instruction.
Further, the interpreter stores all function arguments in an array along with the return value.
IR OP Codes
A lot of the following opcodes will refer to some arguments as "registers." This means the argument is an unsigned 8bit integer index for one of the interpreter's registers.
Any operation listed here which is based on a certain memory size (suffixed with 8, 16, 32 and 64) is also used for pointer types and floating point types, as for those the numeric type doesn't really matter, they're still just numeric values stored in bits.
OP Codes are generally divided into multiple categories: general, unary, conversion and binary. The following sections specify what OP Codes exist and what they do.
General purpose OP Codes
NOP- A no-operation operation that does nothing. This isn't intended to be used
or even appear in the outputted IR, but exists as a placeholder for an
opcode with a
0value. PUSHLINE- Pushes a line number to the interpreters tracker telling it what line of the source it is currently executing, used for when stuff goes wrong or for inspecting the IR and easily comparing it with the source code.
RETEach function's data is suffxed with this instruction regardless of if a
returnstatement was actually added in the source. It tells the interpreter when to return to the caller up the call the stack.If there is no call frame to return to after a
RETinstruction, the program has reached the end of execution and should exit.JMP,JMPI0andJMPN0Are all jump instructions. The first one simply jumps to a different instruction. The other two are conditional jumps.
JMPI0means jump if zero andJMPN0means jump if not zero.All instructions take a 32bit unsigned integer as their first argument, which is the next instruction to jump to. The 2nd and 3rd instructions take in a 2nd argument as well: the register value to evaluate is inside.
LOADCONST(has byte-dependent codes)These are all instructions which take as arguments a register to store a constant value inside and a 2nd argument which is the constant value itself.
MOV- Copy the value in the first register argument into the second register argument.
Stack Memory OP Codes
Stack read and write operations come in two different flavors: Relative and Global. Global reads and writes read from the global scope of the current script file, while relative instructions read from the stack relative to the current function's scope.
STACKALLOCAllocates room in the stack for the current function to use. The idea, hopefully is that in most cases you can predict how much space a specific function will use on the stack and from that you can allocate all that space at the beginning of a function's execution.
The amount of room to allocate is specified as an unsigned 64-bit integer argument in the instruction
STACKFREE- The counterpart to
STACKALLOC, this one retracts the stack pointer, thus freeing all the memory acquired at the start of a function's execution.The amount of room to allocate is specified as an unsigned 64-bit integer argument in the instruction
SREAD(has byte-dependent codes)- Relative stack read of a corresponding bit-size from the stack memory. Takes in
two arguments:
- The register to store the read value.
- The memory offset to read from. Offsets relative to stack address at the start of the function execution.
SWRITE(has byte-dependent codes)- Relative stack write of a corresponding bit-size to the stack memory. Takes in
two arguments:
- The register to read the value from.
- The memory offset to write to.
GREAD(has byte-dependent codes)- Global read of a corresponding bit-size from the stack memory. Takes in
two arguments:
- The register to store the read value.
- The memory offset to read from. Offsets relative to stack address in the global scope
GWRITE(has byte-dependent codes)- Global write of a corresponding bit-size to the stack memory. Takes in
two arguments:
- The register to read the value from.
- The memory offset to write to.
Heap Memory OP Codes
READOBJ(has byte-dependent codes)- These are all instructions for reading from an object (struct or array or
string) The instruction takes in three arguments.
- Register containing the "object" to read from (a pointer)
- Register to store the output of the read value.
- The byte offset of the object's data to read from (
uint32)
WRITEOBJ(has byte-dependent codes)- These are all instructions for writing to an object.
The instruction takes in three arguments.
- Register containing the "object" to write to.
- Register to read the value from.
- The byte offset of the object's data to write to (
uint32)
READIDX(has byte-dependent codes)- These are all instructions for reading from an array or string (struct or array or
string) The instruction takes in three arguments.
- Register containing the "object" to read from (a pointer)
- Register to store the output of the read value.
- Register containing the index to read from
WRITEIDX(has byte-dependent codes)- These are all instructions for writing to an array or string.
The instruction takes in three arguments.
- Register containing the "object" to write to.
- Register to read the value from.
- Register containing the index to write to
HEAPALLOC- Allocate an object on the heap. This should only be used for allocating
space for objects, arrays and strings. Takes in the following arguments:
- Register to store the pointer address of the allocated memory in.
- Unsigned 64bit integer indicating how many bytes to allocate.
HEAPFREEFree an object allocated on the heap. This must only ever be called at the end of the scope that initially allocated the object. That is except when the allocated object is a return value or is part of a returned value.
For example, a struct allocated and then returned should not be freed when the function returns. And a struct allocated and then used as the value in a different struct or array should also not be freed when returned.
Arguments:- Register the pointer to the object is stored in.
Function Call Instructions
PUSHARG(has byte-dependent codes)Push a value in a register into the interpreter's function arguments array.
Arguments:- The register containing the value to push.
SETRV- Set the return value. Arguments:
- Register the return value is in.
INVOKETwo instructions for invoking functions, the 2nd one is used for invoking functions with a void return type.
Arguments:- The register containing the function pointer
- The register to store the returned value in (ignored when using the void invoke.)
Conversion Instructions
These are instructions that convert from one number type to another.
Instructions included in this set:I8TU8I8TI16I8TU16I8TI32I8TU32I8TI64I8TU64I8TF32I8TF64U8TI8U8TI16U8TU16U8TI32U8TU32U8TI64U8TU64U8TF32U8TF64I16TI8I16TU8I16TU16I16TI32I16TU32I16TI64I16TU64I16TF32I16TF64U16TI8U16TU8U16TI16U16TI32U16TU32U16TI64U16TU64U16TF32U16TF64I32TI8I32TU8I32TI16I32TU16I32TU32I32TI64I32TU64I32TF32I32TF64U32TI8U32TU8U32TI16U32TU16U32TI32U32TI64U32TU64U32TF32U32TF64I64TI8I64TU8I64TI16I64TU16I64TI32I64TU32I64TU64I64TF32I64TF64U64TI8U64TU8U64TI16U64TU16U64TI32U64TU32U64TI64U64TF32U64TF64F32TI8F32TU8F32TI16F32TU16F32TI32F32TU32F32TI64F32TU64F32TF64F64TI8F64TU8F64TI16F64TU16F64TI32F64TU32F64TI64F64TU64F64TF32
Unary instructions
These instructions take in 2 arguments, an input and an output register. Each instruction then performs some operation and places the result in the output register.
Instructions included in this section:BNEGATE- Bitwise negate operation
LNEGATE- Logical negate operation
NEG(has number type dependent operations)- Numeric sign flip operation.
Note that for operations like
NEGU8(Unsigned 8 bit negative op code) the result becomes a signed 8 bit integer. INC(has number type dependent operations)- Increment a number by
1 DEC(has number type dependent operations)- Decrement a number by
1
Binary Operations
Binary instructions take in 3 arguments, a left-hand-side register argument, a right-hand-side register argument and an output register argument. The instruction then performs an operation on the arguments and places the result in the return register.
I'm not listing all the opcodes in this section as there's many variations of each one. But I will list the types of opcodes.
In the following sections, some instructions are marked as bitwise operations
and some as bitwise. The difference is in how the bits are handled. Logical
operations are intended for boolean operations, so they function slightly
differently. For example, the bitwise OR operation combines the bits in two
integers, where as the boolean OR operation outputs a 1 or
0 depending on the value of both operands.
Given the sheer number of binary operations that exist, it would be advisable to use some kind of script to auto generate the C code for each one rather than trying to write that shit by hand.
Integer-only Binary Operations
These are instructions that are only supported for the integer types, signed and unsigned, and mostly includes bitwise operations
Instruction types:LSHIFT: Left ShiftRSHIFT: Right ShiftURSHIFT: Unsigned right shiftBAND: Bitwise AND operation (&)BOR: Bitwise OR operation (|)BXOR: Bitwise XOR operation (^)
Boolean-only Binary Operations
Some overlap in this category with the previous, but these operations function slightly differently.
Instruction types:LAND: Logical AND operation (&&)LOR: Logical OR operation (||)LXOR: Logical XOR operation (^)
Note: The use of LXOR or BXOR has to be
decided by the compiler depending on the type of the operands involved. This
is because they use the same operator (^) in the source code.
General Number Binary Operations
This category encompasses mostly mathematical operations for each number type supported by quickscript.
ADD- These operations add two numbers.
SUB- These operations subtract the right argument from the left.
MUL- These operations multiply the left argument with the right.
DIV- These operations divide the left argument by the right.
MOD- Modulo instruction.
POW- These operations raise the left argument to the power of the right
Comparison Operations
These are operations that in some way compare the left and right operands
EQ- Equals operator, compares the byte values
EQARR- Equals operator for arrays
EQSTRUCT- Equals operator for structs
NEQ- Not-Equals operator, compares the byte values
NEQARR- Not-Equals operator for arrays
NEQSTRUCT- Not-Equals operator for structs
GT- Greater-Than operator
GTARR- Greater-Than operator, for arrays
GTE(has number-type-depdendent codes)- Greater-Than-or-Equal-to operator
GTEARR- Greater-Than-or-Equal-to operator, for arrays
LT(has number-type-depdendent codes)- Less-Than operator
LTARR- Less-Than operator, for arrays
LTE(has number-type-depdendent codes)- Less-Than-or-Equal-to operator
LTEARR- Less-Than-or-Equal-to operator, for arrays
String/Array Operations
Special binary operation cases carved out for string and array operations.
STRCONCAT- Concatenate two strings
STRREP- String repeat
Standard Library
This section will just describe all the functions and constants I can think of that should be part of the standard library.
Constants
PI- 3.1415, you know, pi
E- Euler's number
LN10- Natural logarithm of 10
LN2- Natural logarithm of 2
LOG10E- Base-10 logarithm of E
LOG2E- Base-2 logarithm of E
SQRT1_2- Square root of
1 / 2 SQRT2- square root of
2
Functions
Some functions are defined multiple types for several number types, in those cases the following placeholders will be used:
floatfloat32andfloat64num- All numeric types
int- Any integer types
I will also omit descriptions from some functions because of how common they are that you can look up the same function in basically any other language and find its definition.
General functions
void printf(string format, args...);- Prints to the standard output, effectively identical to C's printf, except for the ability of quickscript to automatically discern what the argument types are.
println(string format, args...)- Same as
printf, but appends a new line character to the end of the print string. string sformat(string format, args...);- Formats a string in the same way as
printf.
Time and date functions
currentTimeMillis()- Returns the current UNIX timestamp.
Math functions
float sqrt(float x);- Square root function
float cbrt(float x);- Cube root function
num abs(num x);float acos(float x);float acosh(float x);float asin(float x);float asinh(float x);float atan(float x);float atan2(float x, float y);float atanh(float x);float ceil(float x);int clz(int x);float cos(float x);float cosh(float x);float hypot(float... values);float log(float x);float log10(float x);float log1p(float x);float log2(float x);num max(num... values);num min(num... values);float round(float x);float round(float x, uint32 precision);int8 sign(num x);float sin(float x);float sinh(float x);float tan(float x);
Structs
Structure of the Bytecode file
This section details the structure of the bytecode file and bytecode data output by the compiler.
Header
This is a set of uint64 pairs. Each one specifies the starting
point of one of the following sections of the file and the section's length
in bytes.
Const String Pool
An array of QS Strings (32bit length prefix followed by UTF-8 encoded character data) that make up identifiers, string literals, function names and type names.
Type Table
An array of Type declarations that were declared in the source file. Each entry is preceded by a 32bit unsigned integer, the index of the type, and by an 8bit unsigned integer, the type of the entry. The following types are supported:
ARRAY (0x0)- Array type, the following 32bits after the type byte is the index of the component type in the table.
STRUCT (0x1)- Structure type, the layout of this type's data are specified further down.
NSTRUCT (0x2)- Native Struct, indicates a struct that has been declared by the compiler itself and as such is only referenced by the script, not declared.
FUNCSIGN (0x3)- Function signature type, data layout specified further down
Reserved type indexes
| Index | Purpose |
|---|---|
0 | void |
1 | bool |
2 | int8 |
3 | uint8 |
4 | int16 |
5 | uint16 |
6 | int32 |
7 | uint32 |
8 | int64 |
9 | uint64 |
10 | float32 |
11 | float64 |
12 | string |
Struct Types
- Name offset (
uint64) - The offset of the name of the struct in the const string pool.
- Constructor location (
uint32) - Index of the constructor function of the struct in the function table.
- Property Count (
uint32) - The number of properties this struct has
- Property Array (
propertydecl[]) - An array of the following values:
- Name offset (
uint64) - Same as the struct's name offset, address of the name inside the const string pool
- Offset (
uint32) - Offset of the property's data in memory from the start of the struct's memory
- Type Index (
uint32) - The type index of the property's type
- Name offset (
Function Signatures
- Return Type (
typeindex) - Return type's type index
- Argument Count (
uint32) - Number of arguments the signature has
- Varargs (
bool) - A
1or0byte to indicate if the last argument is a variadic argument. - Arguments (
typeindex[]) - Array of type indexes, each one indicating the corresponding argument's type.
Function Table
An array of functions, their names and their starting offsets. Each entry in this array uses the following values:
- Name Offset
- Offset of the function name in the string const pool.
Note that for constructors, the function name will be something like
StructName.<init> - Start
- The offset of where the function starts in memory
- Signature (
typeindex) - Index of the function signature type in the type table.
When script execution begins, this table is searched through for a "main" function to use as an entry point. If none is found, script doesn't run.
Foreign Function Table
An array of references to native or "foreign" functions.
- Name Offset (
uint64) - Offset of the function name in the string const pool.
- Signature (
typeindex) - Index of the function signature type in the type table.
Instruction Array
An array of uninterrupted IR Instructions.
OP Code table
| OP Code | Value | Padding | Arguments |
|---|---|---|---|
NOP | 0x0000 | 9 | |
PUSHLINE | 0x0001 | 5 | lineno: uint32 |
RET | 0x0002 | 9 | |
JMP | 0x0003 | 5 | to: uint32 |
JMPI0 | 0x0004 | 4 | to: uint32, condition: register |
JMPN0 | 0x0005 | 4 | to: uint32, condition: register |
MOV | 0x0006 | 7 | from: register, to: register |
LOADCONST8 | 0x0007 | 7 | out: register, val: uint8 |
LOADCONST16 | 0x0008 | 6 | out: register, val: uint16 |
LOADCONST32 | 0x0009 | 4 | out: register, val: uint32 |
LOADCONST64 | 0x000A | 2 | out: register, val: uint64 |
LOADCONSTSTR | 0x000B | 0 | out: register, straddr: uint64 |
STACKALLOC | 0x000C | 1 | bytes: uint64 |
STACKFREE | 0x000D | 1 | bytes: uint64 |
RSREAD8 | 0x000E | 0 | out: register, offset: uint64 |
RSREAD16 | 0x000F | 0 | out: register, offset: uint64 |
RSREAD32 | 0x0010 | 0 | out: register, offset: uint64 |
RSREAD64 | 0x0011 | 0 | out: register, offset: uint64 |
RSWRITE8 | 0x0012 | 0 | val: register, offset: uint64 |
RSWRITE16 | 0x0013 | 0 | val: register, offset: uint64 |
RSWRITE32 | 0x0014 | 0 | val: register, offset: uint64 |
RSWRITE64 | 0x0015 | 0 | val: register, offset: uint64 |
ASREAD8 | 0x0016 | 0 | out: register, offset: uint64 |
ASREAD16 | 0x0017 | 0 | out: register, offset: uint64 |
ASREAD32 | 0x0018 | 0 | out: register, offset: uint64 |
ASREAD64 | 0x0019 | 0 | out: register, offset: uint64 |
ASWRITE8 | 0x001A | 0 | val: register, offset: uint64 |
ASWRITE16 | 0x001B | 0 | val: register, offset: uint64 |
ASWRITE32 | 0x001C | 0 | val: register, offset: uint64 |
ASWRITE64 | 0x001D | 0 | val: register, offset: uint64 |
HEAPALLOC | 0x001E | 0 | out: register, bytes: uint64 |
HEAPFREE | 0x001F | 0 | addr: register, bytes: uint64 |
READOBJ8 | 0x0020 | 3 | obj: register, out: register, off: uint32 |
READOBJ16 | 0x0021 | 3 | obj: register, out: register, off: uint32 |
READOBJ32 | 0x0022 | 3 | obj: register, out: register, off: uint32 |
READOBJ64 | 0x0023 | 3 | obj: register, out: register, off: uint32 |
WRITEOBJ8 | 0x0024 | 3 | obj: register, val: register, off: uint32 |
WRITEOBJ16 | 0x0025 | 3 | obj: register, val: register, off: uint32 |
WRITEOBJ32 | 0x0026 | 3 | obj: register, val: register, off: uint32 |
WRITEOBJ64 | 0x0027 | 3 | obj: register, val: register, off: uint32 |
READIDX8 | 0x0028 | 6 | obj: register, out: register, idx: register |
READIDX16 | 0x0029 | 6 | obj: register, out: register, idx: register |
READIDX32 | 0x002A | 6 | obj: register, out: register, idx: register |
READIDX64 | 0x002B | 6 | obj: register, out: register, idx: register |
WRITEIDX8 | 0x002C | 6 | obj: register, val: register, idx: register |
WRITEIDX16 | 0x002D | 6 | obj: register, val: register, idx: register |
WRITEIDX32 | 0x002E | 6 | obj: register, val: register, idx: register |
WRITEIDX64 | 0x002F | 6 | obj: register, val: register, idx: register |
PUSHARG | 0x0030 | 8 | val: register |
SETRV | 0x0031 | 8 | val: register |
INVOKE | 0x0032 | 7 | val: register, out: register |
VINVOKE | 0x0033 | 8 | val: register |
I8TU8 | 0x0034 | 7 | in: register, out: register |
I8TI16 | 0x0035 | 7 | in: register, out: register |
I8TU16 | 0x0036 | 7 | in: register, out: register |
I8TI32 | 0x0037 | 7 | in: register, out: register |
I8TU32 | 0x0038 | 7 | in: register, out: register |
I8TI64 | 0x0039 | 7 | in: register, out: register |
I8TU64 | 0x003A | 7 | in: register, out: register |
I8TF32 | 0x003B | 7 | in: register, out: register |
I8TF64 | 0x003C | 7 | in: register, out: register |
U8TI8 | 0x003D | 7 | in: register, out: register |
U8TI16 | 0x003E | 7 | in: register, out: register |
U8TI32 | 0x003F | 7 | in: register, out: register |
U8TI64 | 0x0040 | 7 | in: register, out: register |
U8TF32 | 0x0041 | 7 | in: register, out: register |
U8TF64 | 0x0042 | 7 | in: register, out: register |
I16TI8 | 0x0043 | 7 | in: register, out: register |
I16TU8 | 0x0044 | 7 | in: register, out: register |
I16TU16 | 0x0045 | 7 | in: register, out: register |
I16TI32 | 0x0046 | 7 | in: register, out: register |
I16TU32 | 0x0047 | 7 | in: register, out: register |
I16TI64 | 0x0048 | 7 | in: register, out: register |
I16TU64 | 0x0049 | 7 | in: register, out: register |
I16TF32 | 0x004A | 7 | in: register, out: register |
I16TF64 | 0x004B | 7 | in: register, out: register |
U16TI8 | 0x004C | 7 | in: register, out: register |
U16TI16 | 0x004D | 7 | in: register, out: register |
U16TI32 | 0x004E | 7 | in: register, out: register |
U16TI64 | 0x004F | 7 | in: register, out: register |
U16TF32 | 0x0050 | 7 | in: register, out: register |
U16TF64 | 0x0051 | 7 | in: register, out: register |
I32TI8 | 0x0052 | 7 | in: register, out: register |
I32TU8 | 0x0053 | 7 | in: register, out: register |
I32TI16 | 0x0054 | 7 | in: register, out: register |
I32TU16 | 0x0055 | 7 | in: register, out: register |
I32TU32 | 0x0056 | 7 | in: register, out: register |
I32TI64 | 0x0057 | 7 | in: register, out: register |
I32TU64 | 0x0058 | 7 | in: register, out: register |
I32TF32 | 0x0059 | 7 | in: register, out: register |
I32TF64 | 0x005A | 7 | in: register, out: register |
U32TI8 | 0x005B | 7 | in: register, out: register |
U32TI16 | 0x005C | 7 | in: register, out: register |
U32TI32 | 0x005D | 7 | in: register, out: register |
U32TI64 | 0x005E | 7 | in: register, out: register |
U32TF32 | 0x005F | 7 | in: register, out: register |
U32TF64 | 0x0060 | 7 | in: register, out: register |
I64TI8 | 0x0061 | 7 | in: register, out: register |
I64TU8 | 0x0062 | 7 | in: register, out: register |
I64TI16 | 0x0063 | 7 | in: register, out: register |
I64TU16 | 0x0064 | 7 | in: register, out: register |
I64TI32 | 0x0065 | 7 | in: register, out: register |
I64TU32 | 0x0066 | 7 | in: register, out: register |
I64TU64 | 0x0067 | 7 | in: register, out: register |
I64TF32 | 0x0068 | 7 | in: register, out: register |
I64TF64 | 0x0069 | 7 | in: register, out: register |
U64TI8 | 0x006A | 7 | in: register, out: register |
U64TI16 | 0x006B | 7 | in: register, out: register |
U64TI32 | 0x006C | 7 | in: register, out: register |
U64TI64 | 0x006D | 7 | in: register, out: register |
U64TF32 | 0x006E | 7 | in: register, out: register |
U64TF64 | 0x006F | 7 | in: register, out: register |
F32TI8 | 0x0070 | 7 | in: register, out: register |
F32TU8 | 0x0071 | 7 | in: register, out: register |
F32TI16 | 0x0072 | 7 | in: register, out: register |
F32TU16 | 0x0073 | 7 | in: register, out: register |
F32TI32 | 0x0074 | 7 | in: register, out: register |
F32TU32 | 0x0075 | 7 | in: register, out: register |
F32TI64 | 0x0076 | 7 | in: register, out: register |
F32TU64 | 0x0077 | 7 | in: register, out: register |
F32TF64 | 0x0078 | 7 | in: register, out: register |
F64TI8 | 0x0079 | 7 | in: register, out: register |
F64TU8 | 0x007A | 7 | in: register, out: register |
F64TI16 | 0x007B | 7 | in: register, out: register |
F64TU16 | 0x007C | 7 | in: register, out: register |
F64TI32 | 0x007D | 7 | in: register, out: register |
F64TU32 | 0x007E | 7 | in: register, out: register |
F64TI64 | 0x007F | 7 | in: register, out: register |
F64TU64 | 0x0080 | 7 | in: register, out: register |
F64TF32 | 0x0081 | 7 | in: register, out: register |
BNEGATE | 0x0082 | 7 | in: register, out: register |
LNEGATE | 0x0083 | 7 | in: register, out: register |
NEGI8 | 0x0084 | 7 | in: register, out: register |
NEGU8 | 0x0085 | 7 | in: register, out: register |
NEGI16 | 0x0086 | 7 | in: register, out: register |
NEGU16 | 0x0087 | 7 | in: register, out: register |
NEGI32 | 0x0088 | 7 | in: register, out: register |
NEGU32 | 0x0089 | 7 | in: register, out: register |
NEGI64 | 0x008A | 7 | in: register, out: register |
NEGU64 | 0x008B | 7 | in: register, out: register |
NEGF32 | 0x008C | 7 | in: register, out: register |
NEGF64 | 0x008D | 7 | in: register, out: register |
INCI8 | 0x008E | 7 | in: register, out: register |
INCU8 | 0x008F | 7 | in: register, out: register |
INCI16 | 0x0090 | 7 | in: register, out: register |
INCU16 | 0x0091 | 7 | in: register, out: register |
INCI32 | 0x0092 | 7 | in: register, out: register |
INCU32 | 0x0093 | 7 | in: register, out: register |
INCI64 | 0x0094 | 7 | in: register, out: register |
INCU64 | 0x0095 | 7 | in: register, out: register |
INCF32 | 0x0096 | 7 | in: register, out: register |
INCF64 | 0x0097 | 7 | in: register, out: register |
DECI8 | 0x0098 | 7 | in: register, out: register |
DECU8 | 0x0099 | 7 | in: register, out: register |
DECI16 | 0x009A | 7 | in: register, out: register |
DECU16 | 0x009B | 7 | in: register, out: register |
DECI32 | 0x009C | 7 | in: register, out: register |
DECU32 | 0x009D | 7 | in: register, out: register |
DECI64 | 0x009E | 7 | in: register, out: register |
DECU64 | 0x009F | 7 | in: register, out: register |
DECF32 | 0x00A0 | 7 | in: register, out: register |
DECF64 | 0x00A1 | 7 | in: register, out: register |
LSHIFT8 | 0x00A2 | 6 | lhs: register, rhs: register, out: register |
LSHIFT16 | 0x00A3 | 6 | lhs: register, rhs: register, out: register |
LSHIFT32 | 0x00A4 | 6 | lhs: register, rhs: register, out: register |
LSHIFT64 | 0x00A5 | 6 | lhs: register, rhs: register, out: register |
RSHIFT8 | 0x00A6 | 6 | lhs: register, rhs: register, out: register |
RSHIFT16 | 0x00A7 | 6 | lhs: register, rhs: register, out: register |
RSHIFT32 | 0x00A8 | 6 | lhs: register, rhs: register, out: register |
RSHIFT64 | 0x00A9 | 6 | lhs: register, rhs: register, out: register |
URSHIFT8 | 0x00AA | 6 | lhs: register, rhs: register, out: register |
URSHIFT16 | 0x00AB | 6 | lhs: register, rhs: register, out: register |
URSHIFT32 | 0x00AC | 6 | lhs: register, rhs: register, out: register |
URSHIFT64 | 0x00AD | 6 | lhs: register, rhs: register, out: register |
BAND | 0x00AE | 6 | lhs: register, rhs: register, out: register |
BOR | 0x00AF | 6 | lhs: register, rhs: register, out: register |
BXOR | 0x00B0 | 6 | lhs: register, rhs: register, out: register |
LAND | 0x00B1 | 6 | lhs: register, rhs: register, out: register |
LOR | 0x00B2 | 6 | lhs: register, rhs: register, out: register |
LXOR | 0x00B3 | 6 | lhs: register, rhs: register, out: register |
ADDI8 | 0x00B4 | 6 | lhs: register, rhs: register, out: register |
ADDU8 | 0x00B5 | 6 | lhs: register, rhs: register, out: register |
ADDI16 | 0x00B6 | 6 | lhs: register, rhs: register, out: register |
ADDU16 | 0x00B7 | 6 | lhs: register, rhs: register, out: register |
ADDI32 | 0x00B8 | 6 | lhs: register, rhs: register, out: register |
ADDU32 | 0x00B9 | 6 | lhs: register, rhs: register, out: register |
ADDI64 | 0x00BA | 6 | lhs: register, rhs: register, out: register |
ADDU64 | 0x00BB | 6 | lhs: register, rhs: register, out: register |
ADDF32 | 0x00BC | 6 | lhs: register, rhs: register, out: register |
ADDF64 | 0x00BD | 6 | lhs: register, rhs: register, out: register |
SUBI8 | 0x00BE | 6 | lhs: register, rhs: register, out: register |
SUBU8 | 0x00BF | 6 | lhs: register, rhs: register, out: register |
SUBI16 | 0x00C0 | 6 | lhs: register, rhs: register, out: register |
SUBU16 | 0x00C1 | 6 | lhs: register, rhs: register, out: register |
SUBI32 | 0x00C2 | 6 | lhs: register, rhs: register, out: register |
SUBU32 | 0x00C3 | 6 | lhs: register, rhs: register, out: register |
SUBI64 | 0x00C4 | 6 | lhs: register, rhs: register, out: register |
SUBU64 | 0x00C5 | 6 | lhs: register, rhs: register, out: register |
SUBF32 | 0x00C6 | 6 | lhs: register, rhs: register, out: register |
SUBF64 | 0x00C7 | 6 | lhs: register, rhs: register, out: register |
DIVI8 | 0x00C8 | 6 | lhs: register, rhs: register, out: register |
DIVU8 | 0x00C9 | 6 | lhs: register, rhs: register, out: register |
DIVI16 | 0x00CA | 6 | lhs: register, rhs: register, out: register |
DIVU16 | 0x00CB | 6 | lhs: register, rhs: register, out: register |
DIVI32 | 0x00CC | 6 | lhs: register, rhs: register, out: register |
DIVU32 | 0x00CD | 6 | lhs: register, rhs: register, out: register |
DIVI64 | 0x00CE | 6 | lhs: register, rhs: register, out: register |
DIVU64 | 0x00CF | 6 | lhs: register, rhs: register, out: register |
DIVF32 | 0x00D0 | 6 | lhs: register, rhs: register, out: register |
DIVF64 | 0x00D1 | 6 | lhs: register, rhs: register, out: register |
MULI8 | 0x00D2 | 6 | lhs: register, rhs: register, out: register |
MULU8 | 0x00D3 | 6 | lhs: register, rhs: register, out: register |
MULI16 | 0x00D4 | 6 | lhs: register, rhs: register, out: register |
MULU16 | 0x00D5 | 6 | lhs: register, rhs: register, out: register |
MULI32 | 0x00D6 | 6 | lhs: register, rhs: register, out: register |
MULU32 | 0x00D7 | 6 | lhs: register, rhs: register, out: register |
MULI64 | 0x00D8 | 6 | lhs: register, rhs: register, out: register |
MULU64 | 0x00D9 | 6 | lhs: register, rhs: register, out: register |
MULF32 | 0x00DA | 6 | lhs: register, rhs: register, out: register |
MULF64 | 0x00DB | 6 | lhs: register, rhs: register, out: register |
MODI8 | 0x00DC | 6 | lhs: register, rhs: register, out: register |
MODU8 | 0x00DD | 6 | lhs: register, rhs: register, out: register |
MODI16 | 0x00DE | 6 | lhs: register, rhs: register, out: register |
MODU16 | 0x00DF | 6 | lhs: register, rhs: register, out: register |
MODI32 | 0x00E0 | 6 | lhs: register, rhs: register, out: register |
MODU32 | 0x00E1 | 6 | lhs: register, rhs: register, out: register |
MODI64 | 0x00E2 | 6 | lhs: register, rhs: register, out: register |
MODU64 | 0x00E3 | 6 | lhs: register, rhs: register, out: register |
MODF32 | 0x00E4 | 6 | lhs: register, rhs: register, out: register |
MODF64 | 0x00E5 | 6 | lhs: register, rhs: register, out: register |
POWI8 | 0x00E6 | 6 | lhs: register, rhs: register, out: register |
POWU8 | 0x00E7 | 6 | lhs: register, rhs: register, out: register |
POWI16 | 0x00E8 | 6 | lhs: register, rhs: register, out: register |
POWU16 | 0x00E9 | 6 | lhs: register, rhs: register, out: register |
POWI32 | 0x00EA | 6 | lhs: register, rhs: register, out: register |
POWU32 | 0x00EB | 6 | lhs: register, rhs: register, out: register |
POWI64 | 0x00EC | 6 | lhs: register, rhs: register, out: register |
POWU64 | 0x00ED | 6 | lhs: register, rhs: register, out: register |
POWF32 | 0x00EE | 6 | lhs: register, rhs: register, out: register |
POWF64 | 0x00EF | 6 | lhs: register, rhs: register, out: register |
EQ8 | 0x00F0 | 6 | lhs: register, rhs: register, out: register |
EQ16 | 0x00F1 | 6 | lhs: register, rhs: register, out: register |
EQ32 | 0x00F2 | 6 | lhs: register, rhs: register, out: register |
EQ64 | 0x00F3 | 6 | lhs: register, rhs: register, out: register |
EQARR | 0x00F4 | 6 | lhs: register, rhs: register, out: register |
EQSTRUCT | 0x00F5 | 6 | lhs: register, rhs: register, out: register |
NEQ8 | 0x00F6 | 6 | lhs: register, rhs: register, out: register |
NEQ16 | 0x00F7 | 6 | lhs: register, rhs: register, out: register |
NEQ32 | 0x00F8 | 6 | lhs: register, rhs: register, out: register |
NEQ64 | 0x00F9 | 6 | lhs: register, rhs: register, out: register |
NEQARR | 0x00FA | 6 | lhs: register, rhs: register, out: register |
NEQSTRUCT | 0x00FB | 6 | lhs: register, rhs: register, out: register |
GTI8 | 0x00FC | 6 | lhs: register, rhs: register, out: register |
GTU8 | 0x00FD | 6 | lhs: register, rhs: register, out: register |
GTI16 | 0x00FE | 6 | lhs: register, rhs: register, out: register |
GTU16 | 0x00FF | 6 | lhs: register, rhs: register, out: register |
GTI32 | 0x0100 | 6 | lhs: register, rhs: register, out: register |
GTU32 | 0x0101 | 6 | lhs: register, rhs: register, out: register |
GTI64 | 0x0102 | 6 | lhs: register, rhs: register, out: register |
GTU64 | 0x0103 | 6 | lhs: register, rhs: register, out: register |
GTF32 | 0x0104 | 6 | lhs: register, rhs: register, out: register |
GTF64 | 0x0105 | 6 | lhs: register, rhs: register, out: register |
GTARR | 0x0106 | 6 | lhs: register, rhs: register, out: register |
GTEI8 | 0x0107 | 6 | lhs: register, rhs: register, out: register |
GTEU8 | 0x0108 | 6 | lhs: register, rhs: register, out: register |
GTEI16 | 0x0109 | 6 | lhs: register, rhs: register, out: register |
GTEU16 | 0x010A | 6 | lhs: register, rhs: register, out: register |
GTEI32 | 0x010B | 6 | lhs: register, rhs: register, out: register |
GTEU32 | 0x010C | 6 | lhs: register, rhs: register, out: register |
GTEI64 | 0x010D | 6 | lhs: register, rhs: register, out: register |
GTEU64 | 0x010E | 6 | lhs: register, rhs: register, out: register |
GTEF32 | 0x010F | 6 | lhs: register, rhs: register, out: register |
GTEF64 | 0x0110 | 6 | lhs: register, rhs: register, out: register |
GTEARR | 0x0111 | 6 | lhs: register, rhs: register, out: register |
LTI8 | 0x0112 | 6 | lhs: register, rhs: register, out: register |
LTU8 | 0x0113 | 6 | lhs: register, rhs: register, out: register |
LTI16 | 0x0114 | 6 | lhs: register, rhs: register, out: register |
LTU16 | 0x0115 | 6 | lhs: register, rhs: register, out: register |
LTI32 | 0x0116 | 6 | lhs: register, rhs: register, out: register |
LTU32 | 0x0117 | 6 | lhs: register, rhs: register, out: register |
LTI64 | 0x0118 | 6 | lhs: register, rhs: register, out: register |
LTU64 | 0x0119 | 6 | lhs: register, rhs: register, out: register |
LTF32 | 0x011A | 6 | lhs: register, rhs: register, out: register |
LTF64 | 0x011B | 6 | lhs: register, rhs: register, out: register |
LTARR | 0x011C | 6 | lhs: register, rhs: register, out: register |
LTEI8 | 0x011D | 6 | lhs: register, rhs: register, out: register |
LTEU8 | 0x011E | 6 | lhs: register, rhs: register, out: register |
LTEI16 | 0x011F | 6 | lhs: register, rhs: register, out: register |
LTEU16 | 0x0120 | 6 | lhs: register, rhs: register, out: register |
LTEI32 | 0x0121 | 6 | lhs: register, rhs: register, out: register |
LTEU32 | 0x0122 | 6 | lhs: register, rhs: register, out: register |
LTEI64 | 0x0123 | 6 | lhs: register, rhs: register, out: register |
LTEU64 | 0x0124 | 6 | lhs: register, rhs: register, out: register |
LTEF32 | 0x0125 | 6 | lhs: register, rhs: register, out: register |
LTEF64 | 0x0126 | 6 | lhs: register, rhs: register, out: register |
LTEARR | 0x0127 | 6 | lhs: register, rhs: register, out: register |
STRCONCAT | 0x0128 | 6 | lhs: register, rhs: register, out: register |
STRREP8 | 0x0129 | 6 | lhs: register, rhs: register, out: register |
STRREP16 | 0x012A | 6 | lhs: register, rhs: register, out: register |
STRREP32 | 0x012B | 6 | lhs: register, rhs: register, out: register |
STRREP64 | 0x012C | 6 | lhs: register, rhs: register, out: register |