quickscript

little spec for a programming language I made while on vacation

Table Of Contents

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:

1
2
3
4
int32 main(string[] args) {
  println("Hello, world!")
  return 0
}

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 0 value.
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.
RET

Each function's data is suffxed with this instruction regardless of if a return statement 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 RET instruction, the program has reached the end of execution and should exit.

JMP, JMPI0 and JMPN0

Are all jump instructions. The first one simply jumps to a different instruction. The other two are conditional jumps. JMPI0 means jump if zero and JMPN0 means 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.

STACKALLOC

Allocates 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
(Note: Strings should never be written 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.
HEAPFREE

Free 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.
INVOKE

Two 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:

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:
Boolean-only Binary Operations

Some overlap in this category with the previous, but these operations function slightly differently.

Instruction types:

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:

float
float32 and float64
num
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

IndexPurpose
0void
1bool
2int8
3uint8
4int16
5uint16
6int32
7uint32
8int64
9uint64
10float32
11float64
12string

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

Function Signatures

Return Type (typeindex)
Return type's type index
Argument Count (uint32)
Number of arguments the signature has
Varargs (bool)
A 1 or 0 byte 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 Codes
OP CodeValuePaddingArguments
NOP0x00009
PUSHLINE0x00015lineno: uint32
RET0x00029
JMP0x00035to: uint32
JMPI00x00044to: uint32, condition: register
JMPN00x00054to: uint32, condition: register
MOV0x00067from: register, to: register
LOADCONST80x00077out: register, val: uint8
LOADCONST160x00086out: register, val: uint16
LOADCONST320x00094out: register, val: uint32
LOADCONST640x000A2out: register, val: uint64
LOADCONSTSTR0x000B0out: register, straddr: uint64
STACKALLOC0x000C1bytes: uint64
STACKFREE0x000D1bytes: uint64
RSREAD80x000E0out: register, offset: uint64
RSREAD160x000F0out: register, offset: uint64
RSREAD320x00100out: register, offset: uint64
RSREAD640x00110out: register, offset: uint64
RSWRITE80x00120val: register, offset: uint64
RSWRITE160x00130val: register, offset: uint64
RSWRITE320x00140val: register, offset: uint64
RSWRITE640x00150val: register, offset: uint64
ASREAD80x00160out: register, offset: uint64
ASREAD160x00170out: register, offset: uint64
ASREAD320x00180out: register, offset: uint64
ASREAD640x00190out: register, offset: uint64
ASWRITE80x001A0val: register, offset: uint64
ASWRITE160x001B0val: register, offset: uint64
ASWRITE320x001C0val: register, offset: uint64
ASWRITE640x001D0val: register, offset: uint64
HEAPALLOC0x001E0out: register, bytes: uint64
HEAPFREE0x001F0addr: register, bytes: uint64
READOBJ80x00203obj: register, out: register, off: uint32
READOBJ160x00213obj: register, out: register, off: uint32
READOBJ320x00223obj: register, out: register, off: uint32
READOBJ640x00233obj: register, out: register, off: uint32
WRITEOBJ80x00243obj: register, val: register, off: uint32
WRITEOBJ160x00253obj: register, val: register, off: uint32
WRITEOBJ320x00263obj: register, val: register, off: uint32
WRITEOBJ640x00273obj: register, val: register, off: uint32
READIDX80x00286obj: register, out: register, idx: register
READIDX160x00296obj: register, out: register, idx: register
READIDX320x002A6obj: register, out: register, idx: register
READIDX640x002B6obj: register, out: register, idx: register
WRITEIDX80x002C6obj: register, val: register, idx: register
WRITEIDX160x002D6obj: register, val: register, idx: register
WRITEIDX320x002E6obj: register, val: register, idx: register
WRITEIDX640x002F6obj: register, val: register, idx: register
PUSHARG0x00308val: register
SETRV0x00318val: register
INVOKE0x00327val: register, out: register
VINVOKE0x00338val: register
I8TU80x00347in: register, out: register
I8TI160x00357in: register, out: register
I8TU160x00367in: register, out: register
I8TI320x00377in: register, out: register
I8TU320x00387in: register, out: register
I8TI640x00397in: register, out: register
I8TU640x003A7in: register, out: register
I8TF320x003B7in: register, out: register
I8TF640x003C7in: register, out: register
U8TI80x003D7in: register, out: register
U8TI160x003E7in: register, out: register
U8TI320x003F7in: register, out: register
U8TI640x00407in: register, out: register
U8TF320x00417in: register, out: register
U8TF640x00427in: register, out: register
I16TI80x00437in: register, out: register
I16TU80x00447in: register, out: register
I16TU160x00457in: register, out: register
I16TI320x00467in: register, out: register
I16TU320x00477in: register, out: register
I16TI640x00487in: register, out: register
I16TU640x00497in: register, out: register
I16TF320x004A7in: register, out: register
I16TF640x004B7in: register, out: register
U16TI80x004C7in: register, out: register
U16TI160x004D7in: register, out: register
U16TI320x004E7in: register, out: register
U16TI640x004F7in: register, out: register
U16TF320x00507in: register, out: register
U16TF640x00517in: register, out: register
I32TI80x00527in: register, out: register
I32TU80x00537in: register, out: register
I32TI160x00547in: register, out: register
I32TU160x00557in: register, out: register
I32TU320x00567in: register, out: register
I32TI640x00577in: register, out: register
I32TU640x00587in: register, out: register
I32TF320x00597in: register, out: register
I32TF640x005A7in: register, out: register
U32TI80x005B7in: register, out: register
U32TI160x005C7in: register, out: register
U32TI320x005D7in: register, out: register
U32TI640x005E7in: register, out: register
U32TF320x005F7in: register, out: register
U32TF640x00607in: register, out: register
I64TI80x00617in: register, out: register
I64TU80x00627in: register, out: register
I64TI160x00637in: register, out: register
I64TU160x00647in: register, out: register
I64TI320x00657in: register, out: register
I64TU320x00667in: register, out: register
I64TU640x00677in: register, out: register
I64TF320x00687in: register, out: register
I64TF640x00697in: register, out: register
U64TI80x006A7in: register, out: register
U64TI160x006B7in: register, out: register
U64TI320x006C7in: register, out: register
U64TI640x006D7in: register, out: register
U64TF320x006E7in: register, out: register
U64TF640x006F7in: register, out: register
F32TI80x00707in: register, out: register
F32TU80x00717in: register, out: register
F32TI160x00727in: register, out: register
F32TU160x00737in: register, out: register
F32TI320x00747in: register, out: register
F32TU320x00757in: register, out: register
F32TI640x00767in: register, out: register
F32TU640x00777in: register, out: register
F32TF640x00787in: register, out: register
F64TI80x00797in: register, out: register
F64TU80x007A7in: register, out: register
F64TI160x007B7in: register, out: register
F64TU160x007C7in: register, out: register
F64TI320x007D7in: register, out: register
F64TU320x007E7in: register, out: register
F64TI640x007F7in: register, out: register
F64TU640x00807in: register, out: register
F64TF320x00817in: register, out: register
BNEGATE0x00827in: register, out: register
LNEGATE0x00837in: register, out: register
NEGI80x00847in: register, out: register
NEGU80x00857in: register, out: register
NEGI160x00867in: register, out: register
NEGU160x00877in: register, out: register
NEGI320x00887in: register, out: register
NEGU320x00897in: register, out: register
NEGI640x008A7in: register, out: register
NEGU640x008B7in: register, out: register
NEGF320x008C7in: register, out: register
NEGF640x008D7in: register, out: register
INCI80x008E7in: register, out: register
INCU80x008F7in: register, out: register
INCI160x00907in: register, out: register
INCU160x00917in: register, out: register
INCI320x00927in: register, out: register
INCU320x00937in: register, out: register
INCI640x00947in: register, out: register
INCU640x00957in: register, out: register
INCF320x00967in: register, out: register
INCF640x00977in: register, out: register
DECI80x00987in: register, out: register
DECU80x00997in: register, out: register
DECI160x009A7in: register, out: register
DECU160x009B7in: register, out: register
DECI320x009C7in: register, out: register
DECU320x009D7in: register, out: register
DECI640x009E7in: register, out: register
DECU640x009F7in: register, out: register
DECF320x00A07in: register, out: register
DECF640x00A17in: register, out: register
LSHIFT80x00A26lhs: register, rhs: register, out: register
LSHIFT160x00A36lhs: register, rhs: register, out: register
LSHIFT320x00A46lhs: register, rhs: register, out: register
LSHIFT640x00A56lhs: register, rhs: register, out: register
RSHIFT80x00A66lhs: register, rhs: register, out: register
RSHIFT160x00A76lhs: register, rhs: register, out: register
RSHIFT320x00A86lhs: register, rhs: register, out: register
RSHIFT640x00A96lhs: register, rhs: register, out: register
URSHIFT80x00AA6lhs: register, rhs: register, out: register
URSHIFT160x00AB6lhs: register, rhs: register, out: register
URSHIFT320x00AC6lhs: register, rhs: register, out: register
URSHIFT640x00AD6lhs: register, rhs: register, out: register
BAND0x00AE6lhs: register, rhs: register, out: register
BOR0x00AF6lhs: register, rhs: register, out: register
BXOR0x00B06lhs: register, rhs: register, out: register
LAND0x00B16lhs: register, rhs: register, out: register
LOR0x00B26lhs: register, rhs: register, out: register
LXOR0x00B36lhs: register, rhs: register, out: register
ADDI80x00B46lhs: register, rhs: register, out: register
ADDU80x00B56lhs: register, rhs: register, out: register
ADDI160x00B66lhs: register, rhs: register, out: register
ADDU160x00B76lhs: register, rhs: register, out: register
ADDI320x00B86lhs: register, rhs: register, out: register
ADDU320x00B96lhs: register, rhs: register, out: register
ADDI640x00BA6lhs: register, rhs: register, out: register
ADDU640x00BB6lhs: register, rhs: register, out: register
ADDF320x00BC6lhs: register, rhs: register, out: register
ADDF640x00BD6lhs: register, rhs: register, out: register
SUBI80x00BE6lhs: register, rhs: register, out: register
SUBU80x00BF6lhs: register, rhs: register, out: register
SUBI160x00C06lhs: register, rhs: register, out: register
SUBU160x00C16lhs: register, rhs: register, out: register
SUBI320x00C26lhs: register, rhs: register, out: register
SUBU320x00C36lhs: register, rhs: register, out: register
SUBI640x00C46lhs: register, rhs: register, out: register
SUBU640x00C56lhs: register, rhs: register, out: register
SUBF320x00C66lhs: register, rhs: register, out: register
SUBF640x00C76lhs: register, rhs: register, out: register
DIVI80x00C86lhs: register, rhs: register, out: register
DIVU80x00C96lhs: register, rhs: register, out: register
DIVI160x00CA6lhs: register, rhs: register, out: register
DIVU160x00CB6lhs: register, rhs: register, out: register
DIVI320x00CC6lhs: register, rhs: register, out: register
DIVU320x00CD6lhs: register, rhs: register, out: register
DIVI640x00CE6lhs: register, rhs: register, out: register
DIVU640x00CF6lhs: register, rhs: register, out: register
DIVF320x00D06lhs: register, rhs: register, out: register
DIVF640x00D16lhs: register, rhs: register, out: register
MULI80x00D26lhs: register, rhs: register, out: register
MULU80x00D36lhs: register, rhs: register, out: register
MULI160x00D46lhs: register, rhs: register, out: register
MULU160x00D56lhs: register, rhs: register, out: register
MULI320x00D66lhs: register, rhs: register, out: register
MULU320x00D76lhs: register, rhs: register, out: register
MULI640x00D86lhs: register, rhs: register, out: register
MULU640x00D96lhs: register, rhs: register, out: register
MULF320x00DA6lhs: register, rhs: register, out: register
MULF640x00DB6lhs: register, rhs: register, out: register
MODI80x00DC6lhs: register, rhs: register, out: register
MODU80x00DD6lhs: register, rhs: register, out: register
MODI160x00DE6lhs: register, rhs: register, out: register
MODU160x00DF6lhs: register, rhs: register, out: register
MODI320x00E06lhs: register, rhs: register, out: register
MODU320x00E16lhs: register, rhs: register, out: register
MODI640x00E26lhs: register, rhs: register, out: register
MODU640x00E36lhs: register, rhs: register, out: register
MODF320x00E46lhs: register, rhs: register, out: register
MODF640x00E56lhs: register, rhs: register, out: register
POWI80x00E66lhs: register, rhs: register, out: register
POWU80x00E76lhs: register, rhs: register, out: register
POWI160x00E86lhs: register, rhs: register, out: register
POWU160x00E96lhs: register, rhs: register, out: register
POWI320x00EA6lhs: register, rhs: register, out: register
POWU320x00EB6lhs: register, rhs: register, out: register
POWI640x00EC6lhs: register, rhs: register, out: register
POWU640x00ED6lhs: register, rhs: register, out: register
POWF320x00EE6lhs: register, rhs: register, out: register
POWF640x00EF6lhs: register, rhs: register, out: register
EQ80x00F06lhs: register, rhs: register, out: register
EQ160x00F16lhs: register, rhs: register, out: register
EQ320x00F26lhs: register, rhs: register, out: register
EQ640x00F36lhs: register, rhs: register, out: register
EQARR0x00F46lhs: register, rhs: register, out: register
EQSTRUCT0x00F56lhs: register, rhs: register, out: register
NEQ80x00F66lhs: register, rhs: register, out: register
NEQ160x00F76lhs: register, rhs: register, out: register
NEQ320x00F86lhs: register, rhs: register, out: register
NEQ640x00F96lhs: register, rhs: register, out: register
NEQARR0x00FA6lhs: register, rhs: register, out: register
NEQSTRUCT0x00FB6lhs: register, rhs: register, out: register
GTI80x00FC6lhs: register, rhs: register, out: register
GTU80x00FD6lhs: register, rhs: register, out: register
GTI160x00FE6lhs: register, rhs: register, out: register
GTU160x00FF6lhs: register, rhs: register, out: register
GTI320x01006lhs: register, rhs: register, out: register
GTU320x01016lhs: register, rhs: register, out: register
GTI640x01026lhs: register, rhs: register, out: register
GTU640x01036lhs: register, rhs: register, out: register
GTF320x01046lhs: register, rhs: register, out: register
GTF640x01056lhs: register, rhs: register, out: register
GTARR0x01066lhs: register, rhs: register, out: register
GTEI80x01076lhs: register, rhs: register, out: register
GTEU80x01086lhs: register, rhs: register, out: register
GTEI160x01096lhs: register, rhs: register, out: register
GTEU160x010A6lhs: register, rhs: register, out: register
GTEI320x010B6lhs: register, rhs: register, out: register
GTEU320x010C6lhs: register, rhs: register, out: register
GTEI640x010D6lhs: register, rhs: register, out: register
GTEU640x010E6lhs: register, rhs: register, out: register
GTEF320x010F6lhs: register, rhs: register, out: register
GTEF640x01106lhs: register, rhs: register, out: register
GTEARR0x01116lhs: register, rhs: register, out: register
LTI80x01126lhs: register, rhs: register, out: register
LTU80x01136lhs: register, rhs: register, out: register
LTI160x01146lhs: register, rhs: register, out: register
LTU160x01156lhs: register, rhs: register, out: register
LTI320x01166lhs: register, rhs: register, out: register
LTU320x01176lhs: register, rhs: register, out: register
LTI640x01186lhs: register, rhs: register, out: register
LTU640x01196lhs: register, rhs: register, out: register
LTF320x011A6lhs: register, rhs: register, out: register
LTF640x011B6lhs: register, rhs: register, out: register
LTARR0x011C6lhs: register, rhs: register, out: register
LTEI80x011D6lhs: register, rhs: register, out: register
LTEU80x011E6lhs: register, rhs: register, out: register
LTEI160x011F6lhs: register, rhs: register, out: register
LTEU160x01206lhs: register, rhs: register, out: register
LTEI320x01216lhs: register, rhs: register, out: register
LTEU320x01226lhs: register, rhs: register, out: register
LTEI640x01236lhs: register, rhs: register, out: register
LTEU640x01246lhs: register, rhs: register, out: register
LTEF320x01256lhs: register, rhs: register, out: register
LTEF640x01266lhs: register, rhs: register, out: register
LTEARR0x01276lhs: register, rhs: register, out: register
STRCONCAT0x01286lhs: register, rhs: register, out: register
STRREP80x01296lhs: register, rhs: register, out: register
STRREP160x012A6lhs: register, rhs: register, out: register
STRREP320x012B6lhs: register, rhs: register, out: register
STRREP640x012C6lhs: register, rhs: register, out: register