Ribbon ISA v0.1.0 draft

This is an instruction set architecture (ISA) for the Ribbon bytecode.

The Ribbon bytecode is a low-level register based bytecode, with support for arbitrary effect handlers. For more information on implementation details of the Ribbon virtual machine see core, bytecode, etc.

Overview

Basic layout

The ISA is divided into Categories;

Categories are further divided into Mnemonic bases;

Mnemonics then contain tables describing each concrete instruction variation.

Example

callc and call_v are both under the call mnemonic, within the Control Flow category.

JIT-only Instructions

Instructions with a jit tag above their name are only available when Rvm is compiled with the jit option.

Encoding

We display the encoding of each instruction as segmented bytes. The Ribbon bytecode is always in little endian order, and we display these bytes as they are ordered in memory.

The opcode is shown first, as a two byte hexadecimal number.

Padding bytes are shown as __.

In addition to standard hex characters and underscores, we utilize operand encoding symbology, such as Rx, indicating the first register operand to use. Symbolic operand character sequences will begin with a capital letter, and will be the appropriate width for the operand’s bytes if they were shown in hex form.

Nybbles displayed with . continue the value to the left of them.

Some instructions take up multiple words. We display word boundaries as line breaks within the tables’ Encoding columns, with subsequent instruction address representations arranged lower within these lines. Where the number of words used is dynamic, a trailing line containing ... will be shown.

Example

An instruction with a u16 immediate operand will use the notation I. .., because it is 2 bytes.

Similarly, Register operands are simply R. or Rx, Ry, etc because they are 1-byte identifiers.

As a concrete example, store64c, an instruction which stores a 64-bit immediate value (encoded as Iy) to memory at the address in a designated register (encoded as R), offset by another 32-bit immediate value (encoded as Ix), has an encoding column entry like this:

Encoding
2d 00 R. Ix .. .. .. __
Iy .. .. .. .. .. .. ..

Immediate Operands

Immediate operands are formatted with I; immediate in this context means that the value is literally encoded into the byte stream, rather than encoding a reference to the value. We allow up to 64-bit immediates for all operations that are binary or greater in arity; in all cases the bit size of the immediate operand and the bit size of the operation must match. (I.e. there is no ‘add 8 bit imm to 32 bit reg’ instruction.)

Where instructions utilizing immediate operands are commutative, the version of the instruction taking a constant will be suffixed with c.

For instructions that do not commute, the two constant versions will be suffixed with a and b respectively, indicating whether the constant is used on the left or right side.

Example
NameDescription Excerpt
mem_set… up to an offset of Rz, is set to … Ry
mem_set_a… up to an offset of I, is set to Ry
mem_set_b… up to an offset of Ry, is set to I
mem_swap… up to an offset of Rz
mem_swap_c… up to an offset of I

Operand Types

TypeShortcodeSize
RegisterR8 bits
UpvalueIdU8 bits
GlobalIdG32 bits
FunctionIdF32 bits
BuiltinIdB32 bits
ForeignAddressIdX32 bits
EffectIdE32 bits
HandlerSetIdH32 bits
ConstantIdC32 bits
u8I8 bits
u16I16 bits
u32I32 bits
u64I64 bits

Instructions

There are 8 categories. Separated into those categories, there are a total of 57 mnemonics. With an average of 7.87719298245614 instructions per mnemonic, we have a grand total of 449 unique instructions.

Miscellaneous

Items that do not fit into another category

nop

NameEncodingDescription
nop00 00 __ __ __ __ __ __No operation

breakpoint

NameEncodingDescription
breakpoint01 00 __ __ __ __ __ __Triggers a breakpoint in debuggers; does nothing otherwise

Control flow

Instructions that control the flow of execution

halt

NameEncodingDescription
halt02 00 __ __ __ __ __ __Halts execution at this instruction offset

trap

Marks a point in the code as not normally reachable, in two ways

NameEncodingDescription
trap03 00 __ __ __ __ __ __Traps execution of the Rvm.Fiber at this instruction offset
Unlike unreachable, this indicates expected behavior; optimizing compilers should not assume it is never reached
unreachable04 00 __ __ __ __ __ __Marks a point in the code as unreachable; if executed in Rvm, it is the same as trap
Unlike trap, however, this indicates undefined behavior; optimizing compilers should assume it is never reached

set

Effect handler set stack manipulation

NameEncodingDescription
push_set05 00 H. .. .. .. __ __Pushes H onto the stack.
The handlers in this set will be first in line for their effects’ prompts until a corresponding pop operation.
pop_set06 00 __ __ __ __ __ __Pops the top most HandlerSetId from the stack, restoring the previous if present

br

Instruction pointer manipulation

NameEncodingDescription
br07 00 I. .. __ __ __ __Applies a signed integer offset I to the instruction pointer
br_if08 00 R. Ix .. Iy .. __Applies a signed integer offset Ix to the instruction pointer, if the value stored in R is non-zero; otherwise, applies the signed integer offset in Iy

call

Various ways of calling functions, in all cases taking up to max(u8) number of arguments. Arguments are expected to be Register values, encoded in the instruction stream after the call instruction.

NameEncodingDescription
call09 00 Rx Ry I. __ __ __
...
Calls the bytecode or builtin function in Ry using I argument registers, placing the result in Rx
call_c0a 00 R. F. .. .. .. I.
...
Calls the bytecode or builtin function at F using I argument registers, placing the result in R
f_call0b 00 Rx Ry I. __ __ __
...
Calls the foreign function in Ry using I argument registers, placing the result in Rx
f_call_c0c 00 R. X. .. .. .. I.
...
Calls the foreign function at X using I argument registers, placing the result in R
prompt0d 00 R. E. .. .. .. I.
...
Calls the bytecode or builtin effect handler designated by E using I argument registers, placing the result in R.

return

End the current function, in one of two ways

NameEncodingDescription
return0e 00 R. __ __ __ __ __Returns flow control to the caller of current function, yielding R to the caller
cancel0f 00 R. __ __ __ __ __Returns flow control to the offset associated with the current effect handler’s HandlerSetId, yielding R as the cancellation value

Memory

Instructions that provide memory access

mem_set

Set bytes in memory

NameEncodingDescription
mem_set10 00 Rx Ry Rz __ __ __Each byte, starting from the address in Rx, up to an offset of Rz, is set to the least significant byte of Ry
mem_set_a11 00 Rx Ry I. .. .. ..Each byte, starting from the address in Rx, up to an offset of I, is set to Ry
mem_set_b12 00 Rx Ry I. __ __ __Each byte, starting from the address in Rx, up to an offset of Ry, is set to I

mem_copy

Copy bytes in memory

NameEncodingDescription
mem_copy13 00 Rx Ry Rz __ __ __Each byte, starting from the address in Ry, up to an offset of Rz, is copied to the same offset of the address in Rx
mem_copy_a14 00 Rx Ry I. .. .. ..Each byte, starting from the address in Ry, up to an offset of I, is copied to the same offset from the address in Rx
mem_copy_b15 00 Rx Ry C. .. .. ..Each byte, starting from the address of C, up to an offset of Ry, is copied to the same offset from the address in Rx

mem_swap

Swap bytes in memory.

NameEncodingDescription
mem_swap16 00 Rx Ry Rz __ __ __Each byte, starting from the addresses in Rx and Ry, up to an offset of Rz, are swapped with each-other
mem_swap_c17 00 Rx Ry I. .. .. ..Each byte, starting from the addresses in Rx and Ry, up to an offset of I, are swapped with each-other

addr

Get addresses from special values.

NameEncodingDescription
addr_l18 00 R. I. .. __ __ __Get the address of an unsigned integer current-frame-relative operand stack offset I, placing it in R.

An operand stack offset of 1 is equivalent to 8 bytes down from the base of the stack frame.

R = stack_base(current_function) + I
addr_u19 00 R. I. .. __ __ __Get the address of an unsigned integer parent-frame-relative operand stack offset I, placing it in R.

An operand stack offset of 1 is equivalent to 8 bytes down from the base of the parent frame.

”Parent” frame here refers to the frame of the function that bound the current function as an effect handler.

R = stack_base(current_function.parent) + I
addr_g1a 00 R. G. .. .. .. __Get the address of G, placing it in R; R = &G
addr_f1b 00 R. F. .. .. .. __Get the address of F, placing it in R; R = &F
addr_b1c 00 R. B. .. .. .. __Get the address of B, placing it in R; R = &B
addr_x1d 00 R. X. .. .. .. __Get the address of X, placing it in R; R = &X
addr_c1e 00 R. C. .. .. .. __Get the address of C, placing it in R; R = &C

load

Loads a value from memory

NameEncodingDescription
load81f 00 Rx Ry I. .. .. ..Loads an 8-bit value from memory at the address in Ry offset by I, placing the result in Rx; Rx = *(Ry + I)
load1620 00 Rx Ry I. .. .. ..Loads a 16-bit value from memory at the address in Ry offset by I, placing the result in Rx; Rx = *(Ry + I)
load3221 00 Rx Ry I. .. .. ..Loads a 32-bit value from memory at the address in Ry offset by I, placing the result in Rx; Rx = *(Ry + I)
load6422 00 Rx Ry I. .. .. ..Loads a 64-bit value from memory at the address in Ry offset by I, placing the result in Rx; Rx = *(Ry + I)

store

Stores a value to memory

NameEncodingDescription
store823 00 Rx Ry I. .. .. ..Stores an 8-bit value from Ry to memory at the address in Rx offset by I; *(Rx + I) = Ry
store1624 00 Rx Ry I. .. .. ..Stores a 16-bit value from Ry to memory at the address in Rx offset by I; *(Rx + I) = Ry
store3225 00 Rx Ry I. .. .. ..Stores a 32-bit value from Ry to memory at the address in Rx offset by I; *(Rx + I) = Ry
store6426 00 Rx Ry I. .. .. ..Stores a 64-bit value from Ry to memory at the address in Rx offset by I; *(Rx + I) = Ry
store8c27 00 R. Ix Iy .. .. ..Stores an 8-bit value (Ix) to memory at the address in R offset by Iy; *(R + Iy) = Ix
store16c28 00 R. Ix .. __ __ __
Iy .. .. .. __ __ __ __
Stores a 16-bit value (Ix) to memory at the address in R offset by Iy; *(R + Iy) = Ix
store32c29 00 R. Ix .. .. .. __
Iy .. .. .. __ __ __ __
Stores a 32-bit value (Ix) to memory at the address in R offset by Iy; *(R + Iy) = Ix
store64c2a 00 R. Ix .. .. .. __
Iy .. .. .. .. .. .. ..
Stores a 64-bit value (encoded as Iy) to memory at the address in R offset by Ix; *(R + Ix) = Iy

Bitwise

Instructions that manipulate values at the bit level.

bit_swap

Swaps bits of two registers

NameEncodingDescription
bit_swap82b 00 Rx Ry __ __ __ __8-bit RxRy
bit_swap162c 00 Rx Ry __ __ __ __16-bit RxRy
bit_swap322d 00 Rx Ry __ __ __ __32-bit RxRy
bit_swap642e 00 Rx Ry __ __ __ __64-bit RxRy

bit_copy

Copies bits from one register into another

NameEncodingDescription
bit_copy82f 00 Rx Ry __ __ __ __8-bit Rx = Ry
bit_copy1630 00 Rx Ry __ __ __ __16-bit Rx = Ry
bit_copy3231 00 Rx Ry __ __ __ __32-bit Rx = Ry
bit_copy6432 00 Rx Ry __ __ __ __64-bit Rx = Ry
bit_copy8c33 00 R. I. __ __ __ __Copies an 8-bit I value into R
bit_copy16c34 00 R. I. .. __ __ __Copies a 16-bit I value into R
bit_copy32c35 00 R. I. .. .. .. __Copies a 32-bit I value into R
bit_copy64c36 00 R. __ __ __ __ __
I. .. .. .. .. .. .. ..
Copies a 64-bit I value into R

bit_clz

Counts the number of leading zero bits in the provided value

NameEncodingDescription
bit_clz837 00 Rx Ry __ __ __ __Counts the leading zeroes in 8-bits of Ry, placing the result in Rx
bit_clz1638 00 Rx Ry __ __ __ __Counts the leading zeroes in 16-bits of Ry, placing the result in Rx
bit_clz3239 00 Rx Ry __ __ __ __Counts the leading zeroes in 32-bits of Ry, placing the result in Rx
bit_clz643a 00 Rx Ry __ __ __ __Counts the leading zeroes in 64-bits of Ry, placing the result in Rx

bit_pop

Counts the number of bits that are set to 1 in the provided value

NameEncodingDescription
bit_pop83b 00 Rx Ry __ __ __ __Counts the set bits in 8-bits of Ry, placing the result in Rx
bit_pop163c 00 Rx Ry __ __ __ __Counts the set bits in 16-bits of Ry, placing the result in Rx
bit_pop323d 00 Rx Ry __ __ __ __Counts the set bits in 32-bits of Ry, placing the result in Rx
bit_pop643e 00 Rx Ry __ __ __ __Counts the set bits in 64-bits of Ry, placing the result in Rx

bit_not

Performs a bitwise NOT operation on the provided value

NameEncodingDescription
bit_not83f 00 Rx Ry __ __ __ __8-bit Rx = ~Ry
bit_not1640 00 Rx Ry __ __ __ __16-bit Rx = ~Ry
bit_not3241 00 Rx Ry __ __ __ __32-bit Rx = ~Ry
bit_not6442 00 Rx Ry __ __ __ __64-bit Rx = ~Ry

bit_and

Performs a bitwise AND operation on the provided values

NameEncodingDescription
bit_and843 00 Rx Ry Rz __ __ __8-bit Rx = Ry & Rz
bit_and1644 00 Rx Ry Rz __ __ __16-bit Rx = Ry & Rz
bit_and3245 00 Rx Ry Rz __ __ __32-bit Rx = Ry & Rz
bit_and6446 00 Rx Ry Rz __ __ __64-bit Rx = Ry & Rz
bit_and8c47 00 Rx Ry I. __ __ __8-bit Rx = Ry & I
bit_and16c48 00 Rx Ry I. .. __ __16-bit Rx = Ry & I
bit_and32c49 00 Rx Ry I. .. .. ..32-bit Rx = Ry & I
bit_and64c4a 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = Ry & I

bit_or

Performs a bitwise OR operation on the provided values

NameEncodingDescription
bit_or84b 00 Rx Ry Rz __ __ __8-bit Rx = Ry | Rz
bit_or164c 00 Rx Ry Rz __ __ __16-bit Rx = Ry | Rz
bit_or324d 00 Rx Ry Rz __ __ __32-bit Rx = Ry | Rz
bit_or644e 00 Rx Ry Rz __ __ __64-bit Rx = Ry | Rz
bit_or8c4f 00 Rx Ry I. __ __ __8-bit Rx = Ry | I
bit_or16c50 00 Rx Ry I. .. __ __16-bit Rx = Ry | I
bit_or32c51 00 Rx Ry I. .. .. ..32-bit Rx = Ry | I
bit_or64c52 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = Ry | I

bit_xor

Performs a bitwise XOR operation on the provided values

NameEncodingDescription
bit_xor853 00 Rx Ry Rz __ __ __8-bit Rx = Ry ^ Rz
bit_xor1654 00 Rx Ry Rz __ __ __16-bit Rx = Ry ^ Rz
bit_xor3255 00 Rx Ry Rz __ __ __32-bit Rx = Ry ^ Rz
bit_xor6456 00 Rx Ry Rz __ __ __64-bit Rx = Ry ^ Rz
bit_xor8c57 00 Rx Ry I. __ __ __8-bit Rx = Ry ^ I
bit_xor16c58 00 Rx Ry I. .. __ __16-bit Rx = Ry ^ I
bit_xor32c59 00 Rx Ry I. .. .. ..32-bit Rx = Ry ^ I
bit_xor64c5a 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = Ry ^ I

bit_lshift

Performs a bitwise left shift operation on the provided values

NameEncodingDescription
bit_lshift85b 00 Rx Ry Rz __ __ __8-bit Rx = Ry << Rz
bit_lshift165c 00 Rx Ry Rz __ __ __16-bit Rx = Ry << Rz
bit_lshift325d 00 Rx Ry Rz __ __ __32-bit Rx = Ry << Rz
bit_lshift645e 00 Rx Ry Rz __ __ __64-bit Rx = Ry << Rz
bit_lshift8a5f 00 Rx Ry I. __ __ __8-bit Rx = I << Ry
bit_lshift16a60 00 Rx Ry I. .. __ __16-bit Rx = I << Ry
bit_lshift32a61 00 Rx Ry I. .. .. ..32-bit Rx = I << Ry
bit_lshift64a62 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = I << Ry
bit_lshift8b63 00 Rx Ry I. __ __ __8-bit Rx = Ry << I
bit_lshift16b64 00 Rx Ry I. __ __ __16-bit Rx = Ry << I
bit_lshift32b65 00 Rx Ry I. __ __ __32-bit Rx = Ry << I
bit_lshift64b66 00 Rx Ry I. __ __ __64-bit Rx = Ry << I

bit_rshift

Performs a bitwise right shift operation on the provided values

NameEncodingDescription
u_rshift867 00 Rx Ry Rz __ __ __8-bit unsigned/logical Rx = Ry >> Rz
u_rshift1668 00 Rx Ry Rz __ __ __16-bit unsigned/logical Rx = Ry >> Rz
u_rshift3269 00 Rx Ry Rz __ __ __32-bit unsigned/logical Rx = Ry >> Rz
u_rshift646a 00 Rx Ry Rz __ __ __64-bit unsigned/logical Rx = Ry >> Rz
u_rshift8a6b 00 Rx Ry I. __ __ __8-bit unsigned/logical Rx = I >> Ry
u_rshift16a6c 00 Rx Ry I. .. __ __16-bit unsigned/logical Rx = I >> Ry
u_rshift32a6d 00 Rx Ry I. .. .. ..32-bit unsigned/logical Rx = I >> Ry
u_rshift64a6e 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit unsigned/logical Rx = I >> Ry
u_rshift8b6f 00 Rx Ry I. __ __ __8-bit unsigned/logical Rx = Ry >> I
u_rshift16b70 00 Rx Ry I. __ __ __16-bit unsigned/logical Rx = Ry >> I
u_rshift32b71 00 Rx Ry I. __ __ __32-bit unsigned/logical Rx = Ry >> I
u_rshift64b72 00 Rx Ry I. __ __ __64-bit unsigned/logical Rx = Ry >> I
s_rshift873 00 Rx Ry Rz __ __ __8-bit signed/arithmetic Rx = Ry >> Rz
s_rshift1674 00 Rx Ry Rz __ __ __16-bit signed/arithmetic Rx = Ry >> Rz
s_rshift3275 00 Rx Ry Rz __ __ __32-bit signed/arithmetic Rx = Ry >> Rz
s_rshift6476 00 Rx Ry Rz __ __ __64-bit signed/arithmetic Rx = Ry >> Rz
s_rshift8a77 00 Rx Ry I. __ __ __8-bit signed/arithmetic Rx = I >> Ry
s_rshift16a78 00 Rx Ry I. .. __ __16-bit signed/arithmetic Rx = I >> Ry
s_rshift32a79 00 Rx Ry I. .. .. ..32-bit signed/arithmetic Rx = I >> Ry
s_rshift64a7a 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit signed/arithmetic Rx = I >> Ry
s_rshift8b7b 00 Rx Ry I. __ __ __8-bit signed/arithmetic Rx = Ry >> I
s_rshift16b7c 00 Rx Ry I. __ __ __16-bit signed/arithmetic Rx = Ry >> I
s_rshift32b7d 00 Rx Ry I. __ __ __32-bit signed/arithmetic Rx = Ry >> I
s_rshift64b7e 00 Rx Ry I. __ __ __64-bit signed/arithmetic Rx = Ry >> I

Comparison

Instructions that compare values

eq

Performs an equality comparison on the provided values

NameEncodingDescription
i_eq87f 00 Rx Ry Rz __ __ __8-bit integer Rx = Ry == Rz
i_eq1680 00 Rx Ry Rz __ __ __16-bit integer Rx = Ry == Rz
i_eq3281 00 Rx Ry Rz __ __ __32-bit integer Rx = Ry == Rz
i_eq6482 00 Rx Ry Rz __ __ __64-bit integer Rx = Ry == Rz
i_eq8c83 00 Rx Ry I. __ __ __8-bit integer Rx = Ry == I
i_eq16c84 00 Rx Ry I. .. __ __16-bit integer Rx = Ry == I
i_eq32c85 00 Rx Ry I. .. .. ..32-bit integer Rx = Ry == I
i_eq64c86 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit integer Rx = Ry == I
f_eq3287 00 Rx Ry Rz __ __ __32-bit floating point Rx = Ry == Rz
f_eq6488 00 Rx Ry Rz __ __ __64-bit floating point Rx = Ry == Rz
f_eq32c89 00 Rx Ry I. .. .. ..32-bit floating point Rx = Ry == I
f_eq64c8a 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit floating point Rx = Ry == I

ne

Performs an inequality comparison on the provided values

NameEncodingDescription
i_ne88b 00 Rx Ry Rz __ __ __8-bit integer Rx = Ry != Rz
i_ne168c 00 Rx Ry Rz __ __ __16-bit integer Rx = Ry != Rz
i_ne328d 00 Rx Ry Rz __ __ __32-bit integer Rx = Ry != Rz
i_ne648e 00 Rx Ry Rz __ __ __64-bit integer Rx = Ry != Rz
i_ne8c8f 00 Rx Ry I. __ __ __8-bit integer Rx = Ry != I
i_ne16c90 00 Rx Ry I. .. __ __16-bit integer Rx = Ry != I
i_ne32c91 00 Rx Ry I. .. .. ..32-bit integer Rx = Ry != I
i_ne64c92 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit integer Rx = Ry != I
f_ne3293 00 Rx Ry Rz __ __ __32-bit floating point Rx = Ry != Rz
f_ne6494 00 Rx Ry Rz __ __ __64-bit floating point Rx = Ry != Rz
f_ne32c95 00 Rx Ry I. .. .. ..32-bit floating point Rx = Ry != I
f_ne64c96 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit floating point Rx = Ry != I

lt

Performs a less-than comparison on the provided values

NameEncodingDescription
u_lt897 00 Rx Ry Rz __ __ __8-bit unsigned integer Rx = Ry < Rz
u_lt1698 00 Rx Ry Rz __ __ __16-bit unsigned integer Rx = Ry < Rz
u_lt3299 00 Rx Ry Rz __ __ __32-bit unsigned integer Rx = Ry < Rz
u_lt649a 00 Rx Ry Rz __ __ __64-bit unsigned integer Rx = Ry < Rz
u_lt8a9b 00 Rx Ry I. __ __ __8-bit unsigned integer Rx = I < Ry
u_lt16a9c 00 Rx Ry I. .. __ __16-bit unsigned integer Rx = I < Ry
u_lt32a9d 00 Rx Ry I. .. .. ..32-bit unsigned integer Rx = I < Ry
u_lt64a9e 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit unsigned integer Rx = I < Ry
u_lt8b9f 00 Rx Ry I. __ __ __8-bit unsigned integer Rx = Ry < I
u_lt16ba0 00 Rx Ry I. .. __ __16-bit unsigned integer Rx = Ry < I
u_lt32ba1 00 Rx Ry I. .. .. ..32-bit unsigned integer Rx = Ry < I
u_lt64ba2 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit unsigned integer Rx = Ry < I
s_lt8a3 00 Rx Ry Rz __ __ __8-bit signed integer Rx = Ry < Rz
s_lt16a4 00 Rx Ry Rz __ __ __16-bit signed integer Rx = Ry < Rz
s_lt32a5 00 Rx Ry Rz __ __ __32-bit signed integer Rx = Ry < Rz
s_lt64a6 00 Rx Ry Rz __ __ __64-bit signed integer Rx = Ry < Rz
s_lt8aa7 00 Rx Ry I. __ __ __8-bit signed integer Rx = I < Ry
s_lt16aa8 00 Rx Ry I. .. __ __16-bit signed integer Rx = I < Ry
s_lt32aa9 00 Rx Ry I. .. .. ..32-bit signed integer Rx = I < Ry
s_lt64aaa 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit signed integer Rx = I < Ry
s_lt8bab 00 Rx Ry I. __ __ __8-bit signed integer Rx = Ry < I
s_lt16bac 00 Rx Ry I. .. __ __16-bit signed integer Rx = Ry < I
s_lt32bad 00 Rx Ry I. .. .. ..32-bit signed integer Rx = Ry < I
s_lt64bae 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit signed integer Rx = Ry < I
f_lt32af 00 Rx Ry Rz __ __ __32-bit floating point Rx = Ry < Rz
f_lt32ab0 00 Rx Ry I. .. .. ..32-bit floating point Rx = I < Ry
f_lt32bb1 00 Rx Ry I. .. .. ..32-bit floating point Rx = Ry < I
f_lt64b2 00 Rx Ry Rz __ __ __64-bit floating point Rx = Ry < Rz
f_lt64ab3 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit floating point Rx = I < Ry
f_lt64bb4 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit floating point Rx = Ry < I

gt

Performs a greater-than comparison on the provided values

NameEncodingDescription
u_gt8b5 00 Rx Ry Rz __ __ __8-bit unsigned integer Rx = Ry > Rz
u_gt16b6 00 Rx Ry Rz __ __ __16-bit unsigned integer Rx = Ry > Rz
u_gt32b7 00 Rx Ry Rz __ __ __32-bit unsigned integer Rx = Ry > Rz
u_gt64b8 00 Rx Ry Rz __ __ __64-bit unsigned integer Rx = Ry > Rz
u_gt8ab9 00 Rx Ry I. __ __ __8-bit unsigned integer Rx = I > Ry
u_gt16aba 00 Rx Ry I. .. __ __16-bit unsigned integer Rx = I > Ry
u_gt32abb 00 Rx Ry I. .. .. ..32-bit unsigned integer Rx = I > Ry
u_gt64abc 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit unsigned integer Rx = I > Ry
u_gt8bbd 00 Rx Ry I. __ __ __8-bit unsigned integer Rx = Ry > I
u_gt16bbe 00 Rx Ry I. .. __ __16-bit unsigned integer Rx = Ry > I
u_gt32bbf 00 Rx Ry I. .. .. ..32-bit unsigned integer Rx = Ry > I
u_gt64bc0 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit unsigned integer Rx = Ry > I
s_gt8c1 00 Rx Ry Rz __ __ __8-bit signed integer Rx = Ry > Rz
s_gt16c2 00 Rx Ry Rz __ __ __16-bit signed integer Rx = Ry > Rz
s_gt32c3 00 Rx Ry Rz __ __ __32-bit signed integer Rx = Ry > Rz
s_gt64c4 00 Rx Ry Rz __ __ __64-bit signed integer Rx = Ry > Rz
s_gt8ac5 00 Rx Ry I. __ __ __8-bit signed integer Rx = I > Ry
s_gt16ac6 00 Rx Ry I. .. __ __16-bit signed integer Rx = I > Ry
s_gt32ac7 00 Rx Ry I. .. .. ..32-bit signed integer Rx = I > Ry
s_gt64ac8 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit signed integer Rx = I > Ry
s_gt8bc9 00 Rx Ry I. __ __ __8-bit signed integer Rx = Ry > I
s_gt16bca 00 Rx Ry I. .. __ __16-bit signed integer Rx = Ry > I
s_gt32bcb 00 Rx Ry I. .. .. ..32-bit signed integer Rx = Ry > I
s_gt64bcc 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit signed integer Rx = Ry > I
f_gt32cd 00 Rx Ry Rz __ __ __32-bit floating point Rx = Ry > Rz
f_gt32ace 00 Rx Ry I. .. .. ..32-bit floating point Rx = I > Ry
f_gt32bcf 00 Rx Ry I. .. .. ..32-bit floating point Rx = Ry > I
f_gt64d0 00 Rx Ry Rz __ __ __64-bit floating point Rx = Ry > Rz
f_gt64ad1 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit floating point Rx = I > Ry
f_gt64bd2 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit floating point Rx = Ry > I

le

Performs a less-than-or-equal comparison on the provided values

NameEncodingDescription
u_le8d3 00 Rx Ry Rz __ __ __8-bit unsigned integer Rx = Ry <= Rz
u_le16d4 00 Rx Ry Rz __ __ __16-bit unsigned integer Rx = Ry <= Rz
u_le32d5 00 Rx Ry Rz __ __ __32-bit unsigned integer Rx = Ry <= Rz
u_le64d6 00 Rx Ry Rz __ __ __64-bit unsigned integer Rx = Ry <= Rz
u_le8ad7 00 Rx Ry I. __ __ __8-bit unsigned integer Rx = I <= Ry
u_le16ad8 00 Rx Ry I. .. __ __16-bit unsigned integer Rx = I <= Ry
u_le32ad9 00 Rx Ry I. .. .. ..32-bit unsigned integer Rx = I <= Ry
u_le64ada 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit unsigned integer Rx = I <= Ry
u_le8bdb 00 Rx Ry I. __ __ __8-bit unsigned integer Rx = Ry <= I
u_le16bdc 00 Rx Ry I. .. __ __16-bit unsigned integer Rx = Ry <= I
u_le32bdd 00 Rx Ry I. .. .. ..32-bit unsigned integer Rx = Ry <= I
u_le64bde 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit unsigned integer Rx = Ry <= I
s_le8df 00 Rx Ry Rz __ __ __8-bit signed integer Rx = Ry <= Rz
s_le16e0 00 Rx Ry Rz __ __ __16-bit signed integer Rx = Ry <= Rz
s_le32e1 00 Rx Ry Rz __ __ __32-bit signed integer Rx = Ry <= Rz
s_le64e2 00 Rx Ry Rz __ __ __64-bit signed integer Rx = Ry <= Rz
s_le8ae3 00 Rx Ry I. __ __ __8-bit signed integer Rx = I <= Ry
s_le16ae4 00 Rx Ry I. .. __ __16-bit signed integer Rx = I <= Ry
s_le32ae5 00 Rx Ry I. .. .. ..32-bit signed integer Rx = I <= Ry
s_le64ae6 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit signed integer Rx = I <= Ry
s_le8be7 00 Rx Ry I. __ __ __8-bit signed integer Rx = Ry <= I
s_le16be8 00 Rx Ry I. .. __ __16-bit signed integer Rx = Ry <= I
s_le32be9 00 Rx Ry I. .. .. ..32-bit signed integer Rx = Ry <= I
s_le64bea 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit signed integer Rx = Ry <= I
f_le32eb 00 Rx Ry Rz __ __ __32-bit floating point Rx = Ry <= Rz
f_le32aec 00 Rx Ry I. .. .. ..32-bit floating point Rx = I <= Ry
f_le32bed 00 Rx Ry I. .. .. ..32-bit floating point Rx = Ry <= I
f_le64ee 00 Rx Ry Rz __ __ __64-bit floating point Rx = Ry <= Rz
f_le64aef 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit floating point Rx = I <= Ry
f_le64bf0 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit floating point Rx = Ry <= I

ge

Performs a greater-than-or-equal comparison on the provided values

NameEncodingDescription
u_ge8f1 00 Rx Ry Rz __ __ __8-bit unsigned integer Rx = Ry >= Rz
u_ge16f2 00 Rx Ry Rz __ __ __16-bit unsigned integer Rx = Ry >= Rz
u_ge32f3 00 Rx Ry Rz __ __ __32-bit unsigned integer Rx = Ry >= Rz
u_ge64f4 00 Rx Ry Rz __ __ __64-bit unsigned integer Rx = Ry >= Rz
u_ge8af5 00 Rx Ry I. __ __ __8-bit unsigned integer Rx = I >= Ry
u_ge16af6 00 Rx Ry I. .. __ __16-bit unsigned integer Rx = I >= Ry
u_ge32af7 00 Rx Ry I. .. .. ..32-bit unsigned integer Rx = I >= Ry
u_ge64af8 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit unsigned integer Rx = I >= Ry
u_ge8bf9 00 Rx Ry I. __ __ __8-bit unsigned integer Rx = Ry >= I
u_ge16bfa 00 Rx Ry I. .. __ __16-bit unsigned integer Rx = Ry >= I
u_ge32bfb 00 Rx Ry I. .. .. ..32-bit unsigned integer Rx = Ry >= I
u_ge64bfc 00 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit unsigned integer Rx = Ry >= I
s_ge8fd 00 Rx Ry Rz __ __ __8-bit signed integer Rx = Ry >= Rz
s_ge16fe 00 Rx Ry Rz __ __ __16-bit signed integer Rx = Ry >= Rz
s_ge32ff 00 Rx Ry Rz __ __ __32-bit signed integer Rx = Ry >= Rz
s_ge6400 01 Rx Ry Rz __ __ __64-bit signed integer Rx = Ry >= Rz
s_ge8a01 01 Rx Ry I. __ __ __8-bit signed integer Rx = I >= Ry
s_ge16a02 01 Rx Ry I. .. __ __16-bit signed integer Rx = I >= Ry
s_ge32a03 01 Rx Ry I. .. .. ..32-bit signed integer Rx = I >= Ry
s_ge64a04 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit signed integer Rx = I >= Ry
s_ge8b05 01 Rx Ry I. __ __ __8-bit signed integer Rx = Ry >= I
s_ge16b06 01 Rx Ry I. .. __ __16-bit signed integer Rx = Ry >= I
s_ge32b07 01 Rx Ry I. .. .. ..32-bit signed integer Rx = Ry >= I
s_ge64b08 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit signed integer Rx = Ry >= I
f_ge3209 01 Rx Ry Rz __ __ __32-bit floating point Rx = Ry >= Rz
f_ge32a0a 01 Rx Ry I. .. .. ..32-bit floating point Rx = I >= Ry
f_ge32b0b 01 Rx Ry I. .. .. ..32-bit floating point Rx = Ry >= I
f_ge640c 01 Rx Ry Rz __ __ __64-bit floating point Rx = Ry >= Rz
f_ge64a0d 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit floating point Rx = I >= Ry
f_ge64b0e 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit floating point Rx = Ry >= I

Integer arithmetic

Instructions that perform integer arithmetic operations on values. Because we use two’s compliment integers, the signedness of the operands does not affect all operations. Where it does, the mnemonic will be prefixed with “u” or “s”, otherwise with “i”.

i_neg

Performs integer negation on the provided value.

NameEncodingDescription
s_neg80f 01 Rx Ry __ __ __ __8-bit Rx = -Ry
s_neg1610 01 Rx Ry __ __ __ __16-bit Rx = -Ry
s_neg3211 01 Rx Ry __ __ __ __32-bit Rx = -Ry
s_neg6412 01 Rx Ry __ __ __ __64-bit Rx = -Ry

i_abs

Finds the absolute value of the provided value

NameEncodingDescription
s_abs813 01 Rx Ry __ __ __ __8-bit Rx = |Ry|
s_abs1614 01 Rx Ry __ __ __ __16-bit Rx = |Ry|
s_abs3215 01 Rx Ry __ __ __ __32-bit Rx = |Ry|
s_abs6416 01 Rx Ry __ __ __ __64-bit Rx = |Ry|

i_add

Performs integer addition on the provided values.

NameEncodingDescription
i_add817 01 Rx Ry Rz __ __ __8-bit Rx = Ry + Rz
i_add1618 01 Rx Ry Rz __ __ __16-bit Rx = Ry + Rz
i_add3219 01 Rx Ry Rz __ __ __32-bit Rx = Ry + Rz
i_add641a 01 Rx Ry Rz __ __ __64-bit Rx = Ry + Rz
i_add8c1b 01 Rx Ry I. __ __ __8-bit Rx = Ry + I
i_add16c1c 01 Rx Ry I. .. __ __16-bit Rx = Ry + I
i_add32c1d 01 Rx Ry I. .. .. ..32-bit Rx = Ry + I
i_add64c1e 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = Ry + I

i_sub

Performs integer subtraction on the provided values.

NameEncodingDescription
i_sub81f 01 Rx Ry Rz __ __ __8-bit Rx = Ry - Rz
i_sub1620 01 Rx Ry Rz __ __ __16-bit Rx = Ry - Rz
i_sub3221 01 Rx Ry Rz __ __ __32-bit Rx = Ry - Rz
i_sub6422 01 Rx Ry Rz __ __ __64-bit Rx = Ry - Rz
i_sub8a23 01 Rx Ry I. __ __ __8-bit Rx = I - Ry
i_sub16a24 01 Rx Ry I. .. __ __16-bit Rx = I - Ry
i_sub32a25 01 Rx Ry I. .. .. ..32-bit Rx = I - Ry
i_sub64a26 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = I - Ry
i_sub8b27 01 Rx Ry I. __ __ __8-bit Rx = Ry - I
i_sub16b28 01 Rx Ry I. .. __ __16-bit Rx = Ry - I
i_sub32b29 01 Rx Ry I. .. .. ..32-bit Rx = Ry - I
i_sub64b2a 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = Ry - I

i_mul

Performs integer multiplication on the provided values.

NameEncodingDescription
i_mul82b 01 Rx Ry Rz __ __ __8-bit Rx = Ry * Rz
i_mul162c 01 Rx Ry Rz __ __ __16-bit Rx = Ry * Rz
i_mul322d 01 Rx Ry Rz __ __ __32-bit Rx = Ry * Rz
i_mul642e 01 Rx Ry Rz __ __ __64-bit Rx = Ry * Rz
i_mul8c2f 01 Rx Ry I. __ __ __8-bit Rx = Ry * I
i_mul16c30 01 Rx Ry I. .. __ __16-bit Rx = Ry * I
i_mul32c31 01 Rx Ry I. .. .. ..32-bit Rx = Ry * I
i_mul64c32 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = Ry * I

i_div

Performs integer division on the provided values.

NameEncodingDescription
u_div833 01 Rx Ry Rz __ __ __8-bit unsigned Rx = Ry / Rz
u_div1634 01 Rx Ry Rz __ __ __16-bit unsigned Rx = Ry / Rz
u_div3235 01 Rx Ry Rz __ __ __32-bit unsigned Rx = Ry / Rz
u_div6436 01 Rx Ry Rz __ __ __64-bit unsigned Rx = Ry / Rz
u_div8a37 01 Rx Ry I. __ __ __8-bit unsigned Rx = I / Ry
u_div16a38 01 Rx Ry I. .. __ __16-bit unsigned Rx = I / Ry
u_div32a39 01 Rx Ry I. .. .. ..32-bit unsigned Rx = I / Ry
u_div64a3a 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit unsigned Rx = I / Ry
u_div8b3b 01 Rx Ry I. __ __ __8-bit unsigned Rx = Ry / I
u_div16b3c 01 Rx Ry I. .. __ __16-bit unsigned Rx = Ry / I
u_div32b3d 01 Rx Ry I. .. .. ..32-bit unsigned Rx = Ry / I
u_div64b3e 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit unsigned Rx = Ry / I
s_div83f 01 Rx Ry Rz __ __ __8-bit signed Rx = Ry / Rz
s_div1640 01 Rx Ry Rz __ __ __16-bit signed Rx = Ry / Rz
s_div3241 01 Rx Ry Rz __ __ __32-bit signed Rx = Ry / Rz
s_div6442 01 Rx Ry Rz __ __ __64-bit signed Rx = Ry / Rz
s_div8a43 01 Rx Ry I. __ __ __8-bit signed Rx = I / Ry
s_div16a44 01 Rx Ry I. .. __ __16-bit signed Rx = I / Ry
s_div32a45 01 Rx Ry I. .. .. ..32-bit signed Rx = I / Ry
s_div64a46 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit signed Rx = I / Ry
s_div8b47 01 Rx Ry I. __ __ __8-bit signed Rx = Ry / I
s_div16b48 01 Rx Ry I. .. __ __16-bit signed Rx = Ry / I
s_div32b49 01 Rx Ry I. .. .. ..32-bit signed Rx = Ry / I
s_div64b4a 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit signed Rx = Ry / I

i_rem

Gets the remainder of integer division on the provided values.

NameEncodingDescription
u_rem84b 01 Rx Ry Rz __ __ __8-bit unsigned Rx = Ry % Rz
u_rem164c 01 Rx Ry Rz __ __ __16-bit unsigned Rx = Ry % Rz
u_rem324d 01 Rx Ry Rz __ __ __32-bit unsigned Rx = Ry % Rz
u_rem644e 01 Rx Ry Rz __ __ __64-bit unsigned Rx = Ry % Rz
u_rem8a4f 01 Rx Ry I. __ __ __8-bit unsigned Rx = I % Ry
u_rem16a50 01 Rx Ry I. .. __ __16-bit unsigned Rx = I % Ry
u_rem32a51 01 Rx Ry I. .. .. ..32-bit unsigned Rx = I % Ry
u_rem64a52 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit unsigned Rx = I % Ry
u_rem8b53 01 Rx Ry I. __ __ __8-bit unsigned Rx = Ry % I
u_rem16b54 01 Rx Ry I. .. __ __16-bit unsigned Rx = Ry % I
u_rem32b55 01 Rx Ry I. .. .. ..32-bit unsigned Rx = Ry % I
u_rem64b56 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit unsigned Rx = Ry % I
s_rem857 01 Rx Ry Rz __ __ __8-bit signed Rx = Ry % Rz
s_rem1658 01 Rx Ry Rz __ __ __16-bit signed Rx = Ry % Rz
s_rem3259 01 Rx Ry Rz __ __ __32-bit signed Rx = Ry % Rz
s_rem645a 01 Rx Ry Rz __ __ __64-bit signed Rx = Ry % Rz
s_rem8a5b 01 Rx Ry I. __ __ __8-bit signed Rx = I % Ry
s_rem16a5c 01 Rx Ry I. .. __ __16-bit signed Rx = I % Ry
s_rem32a5d 01 Rx Ry I. .. .. ..32-bit signed Rx = I % Ry
s_rem64a5e 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit signed Rx = I % Ry
s_rem8b5f 01 Rx Ry I. __ __ __8-bit signed Rx = Ry % I
s_rem16b60 01 Rx Ry I. .. __ __16-bit signed Rx = Ry % I
s_rem32b61 01 Rx Ry I. .. .. ..32-bit signed Rx = Ry % I
s_rem64b62 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit signed Rx = Ry % I

i_pow

Raises a provided value to the power of the other provided value.

NameEncodingDescription
i_pow863 01 Rx Ry Rz __ __ __8-bit Rx = Ry ** Rz
i_pow1664 01 Rx Ry Rz __ __ __16-bit Rx = Ry ** Rz
i_pow3265 01 Rx Ry Rz __ __ __32-bit Rx = Ry ** Rz
i_pow6466 01 Rx Ry Rz __ __ __64-bit Rx = Ry ** Rz
i_pow8a67 01 Rx Ry I. __ __ __8-bit Rx = I ** Ry
i_pow16a68 01 Rx Ry I. .. __ __16-bit Rx = I ** Ry
i_pow32a69 01 Rx Ry I. .. .. ..32-bit Rx = I ** Ry
i_pow64a6a 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = I ** Ry
i_pow8b6b 01 Rx Ry I. __ __ __8-bit Rx = Ry ** I
i_pow16b6c 01 Rx Ry I. .. __ __16-bit Rx = Ry ** I
i_pow32b6d 01 Rx Ry I. .. .. ..32-bit Rx = Ry ** I
i_pow64b6e 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = Ry ** I

Floating point arithmetic

Instructions that perform floating point arithmetic operations on values.

f_neg

Performs floating point negation on the provided value

NameEncodingDescription
f_neg326f 01 Rx Ry __ __ __ __32-bit Rx = -Ry
f_neg6470 01 Rx Ry __ __ __ __64-bit Rx = -Ry

f_abs

Performs a floating point absolute value operation on the provided value

NameEncodingDescription
f_abs3271 01 Rx Ry __ __ __ __32-bit Rx = |Ry|
f_abs6472 01 Rx Ry __ __ __ __64-bit Rx = |Ry|

f_sqrt

Performs a square root operation on the provided value

NameEncodingDescription
f_sqrt3273 01 Rx Ry __ __ __ __32-bit Rx = sqrt(Ry)
f_sqrt6474 01 Rx Ry __ __ __ __64-bit Rx = sqrt(Ry)

f_floor

Performs a flooring operation on the provided value

NameEncodingDescription
f_floor3275 01 Rx Ry __ __ __ __32-bit Rx = floor(Ry)
f_floor6476 01 Rx Ry __ __ __ __64-bit Rx = floor(Ry)

f_ceil

Performs a ceiling operation on the provided value

NameEncodingDescription
f_ceil3277 01 Rx Ry __ __ __ __32-bit Rx = ceil(Ry)
f_ceil6478 01 Rx Ry __ __ __ __64-bit Rx = ceil(Ry)

f_round

Performs a rounding operation on the provided value

NameEncodingDescription
f_round3279 01 Rx Ry __ __ __ __32-bit Rx = round(Ry)
f_round647a 01 Rx Ry __ __ __ __64-bit Rx = round(Ry)

f_trunc

Performs a truncation operation on the provided value

NameEncodingDescription
f_trunc327b 01 Rx Ry __ __ __ __32-bit Rx = truncate(Ry)
f_trunc647c 01 Rx Ry __ __ __ __64-bit Rx = truncate(Ry)

f_whole

Extracts the whole number part of the provided value

NameEncodingDescription
f_whole327d 01 Rx Ry __ __ __ __32-bit Rx = whole(Ry)
f_whole647e 01 Rx Ry __ __ __ __64-bit Rx = whole(Ry)

f_frac

Extracts the fractional part of the provided value

NameEncodingDescription
f_frac327f 01 Rx Ry __ __ __ __32-bit Rx = frac(Ry)
f_frac6480 01 Rx Ry __ __ __ __64-bit Rx = frac(Ry)

f_add

Performs floating point addition on the provided values

NameEncodingDescription
f_add3281 01 Rx Ry Rz __ __ __32-bit Rx = Ry + Rz
f_add32c82 01 Rx Ry I. .. .. ..32-bit Rx = Ry + I
f_add6483 01 Rx Ry Rz __ __ __64-bit Rx = Ry + Rz
f_add64c84 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = Ry + I

f_sub

Performs floating point subtraction on the provided values

NameEncodingDescription
f_sub3285 01 Rx Ry Rz __ __ __32-bit Rx = Ry - Rz
f_sub32a86 01 Rx Ry I. .. .. ..32-bit Rx = I - Ry
f_sub32b87 01 Rx Ry I. .. .. ..32-bit Rx = Ry - I
f_sub6488 01 Rx Ry Rz __ __ __64-bit Rx = Ry - Rz
f_sub64a89 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = I - Ry
f_sub64b8a 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = Ry - I

f_mul

Performs floating point multiplication on the provided values

NameEncodingDescription
f_mul328b 01 Rx Ry Rz __ __ __32-bit Rx = Ry * Rz
f_mul32c8c 01 Rx Ry I. .. .. ..32-bit Rx = Ry * I
f_mul648d 01 Rx Ry Rz __ __ __64-bit Rx = Ry * Rz
f_mul64c8e 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = Ry * I

f_div

Performs floating point division on the provided values

NameEncodingDescription
f_div328f 01 Rx Ry Rz __ __ __32-bit Rx = Ry / Rz
f_div32a90 01 Rx Ry I. .. .. ..32-bit Rx = I / Ry
f_div32b91 01 Rx Ry I. .. .. ..32-bit Rx = Ry / I
f_div6492 01 Rx Ry Rz __ __ __64-bit Rx = Ry / Rz
f_div64a93 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = I / Ry
f_div64b94 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = Ry / I

f_rem

Gets the remainder of floating point division on the provided values

NameEncodingDescription
f_rem3295 01 Rx Ry Rz __ __ __32-bit Rx = Ry % Rz
f_rem32a96 01 Rx Ry I. .. .. ..32-bit Rx = I % Ry
f_rem32b97 01 Rx Ry I. .. .. ..32-bit Rx = Ry % I
f_rem6498 01 Rx Ry Rz __ __ __64-bit Rx = Ry % Rz
f_rem64a99 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = I % Ry
f_rem64b9a 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = Ry % I

f_pow

Raises a provided value to the power of the other provided value

NameEncodingDescription
f_pow329b 01 Rx Ry Rz __ __ __32-bit Rx = Ry ** Rz
f_pow32a9c 01 Rx Ry I. .. .. ..32-bit Rx = I ** Ry
f_pow32b9d 01 Rx Ry I. .. .. ..32-bit Rx = Ry ** I
f_pow649e 01 Rx Ry Rz __ __ __64-bit Rx = Ry ** Rz
f_pow64a9f 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = I ** Ry
f_pow64ba0 01 Rx Ry __ __ __ __
I. .. .. .. .. .. .. ..
64-bit Rx = Ry ** I

Value conversion

Instructions that convert values between different bit representations

s_ext

Signed bit extension

NameEncodingDescription
s_ext8_16a1 01 Rx Ry __ __ __ __Sign extend 8-bits of Ry to 16-bits, placing the result in Rx
s_ext8_32a2 01 Rx Ry __ __ __ __Sign extend 8-bits of Ry to 32-bits, placing the result in Rx
s_ext8_64a3 01 Rx Ry __ __ __ __Sign extend 8-bits of Ry to 64-bits, placing the result in Rx
s_ext16_32a4 01 Rx Ry __ __ __ __Sign extend 16-bits of Ry to 32-bits, placing the result in Rx
s_ext16_64a5 01 Rx Ry __ __ __ __Sign extend 16-bits of Ry to 64-bits, placing the result in Rx
s_ext32_64a6 01 Rx Ry __ __ __ __Sign extend 32-bits of Ry to 64-bits, placing the result in Rx

f_to_i

Convert floats to various integer representations.

NameEncodingDescription
f32_to_u8a7 01 Rx Ry __ __ __ __Convert of 32-bit float in Ry to 8-bit integer; discards sign, places the result in Rx
f32_to_u16a8 01 Rx Ry __ __ __ __Convert of 32-bit float in Ry to 16-bit integer; discards sign, places the result in Rx
f32_to_u32a9 01 Rx Ry __ __ __ __Convert of 32-bit float in Ry to 32-bit integer; discards sign, places the result in Rx
f32_to_u64aa 01 Rx Ry __ __ __ __Convert of 32-bit float in Ry to 64-bit integer; discards sign, places the result in Rx
f32_to_s8ab 01 Rx Ry __ __ __ __Convert of 32-bit float in Ry to 8-bit integer; keeps sign, places the result in Rx
f32_to_s16ac 01 Rx Ry __ __ __ __Convert of 32-bit float in Ry to 16-bit integer; keeps sign, places the result in Rx
f32_to_s32ad 01 Rx Ry __ __ __ __Convert of 32-bit float in Ry to 32-bit integer; keeps sign, places the result in Rx
f32_to_s64ae 01 Rx Ry __ __ __ __Convert of 32-bit float in Ry to 64-bit integer; keeps sign, places the result in Rx

i_to_f

Convert various integers to float representations.

NameEncodingDescription
u8_to_f32af 01 Rx Ry __ __ __ __Convert 8-bits in Ry to 32-bit float; discards sign, places result in Rx
u16_to_f32b0 01 Rx Ry __ __ __ __Convert 16-bits in Ry to 32-bit float; discards sign, places result in Rx
u32_to_f32b1 01 Rx Ry __ __ __ __Convert 32-bits in Ry to 32-bit float; discards sign, places result in Rx
u64_to_f32b2 01 Rx Ry __ __ __ __Convert 64-bits in Ry to 32-bit float; discards sign, places result in Rx
s8_to_f32b3 01 Rx Ry __ __ __ __Convert 8-bits in Ry to 32-bit float; keeps sign, places result in Rx
s16_to_f32b4 01 Rx Ry __ __ __ __Convert 16-bits in Ry to 32-bit float; keeps sign, places result in Rx
s32_to_f32b5 01 Rx Ry __ __ __ __Convert 32-bits in Ry to 32-bit float; keeps sign, places result in Rx
s64_to_f32b6 01 Rx Ry __ __ __ __Convert 64-bits in Ry to 32-bit float; keeps sign, places result in Rx
u8_to_f64b7 01 Rx Ry __ __ __ __Convert 8-bits in Ry to 64-bit float; discards sign, places result in Rx
u16_to_f64b8 01 Rx Ry __ __ __ __Convert 16-bits in Ry to 64-bit float; discards sign, places result in Rx
u32_to_f64b9 01 Rx Ry __ __ __ __Convert 32-bits in Ry to 64-bit float; discards sign, places result in Rx
u64_to_f64ba 01 Rx Ry __ __ __ __Convert 64-bits in Ry to 64-bit float; discards sign, places result in Rx
s8_to_f64bb 01 Rx Ry __ __ __ __Convert 8-bits in Ry to 64-bit float; keeps sign, places result in Rx
s16_to_f64bc 01 Rx Ry __ __ __ __Convert 16-bits in Ry to 64-bit float; keeps sign, places result in Rx
s32_to_f64bd 01 Rx Ry __ __ __ __Convert 32-bits in Ry to 64-bit float; keeps sign, places result in Rx
s64_to_f64be 01 Rx Ry __ __ __ __Convert 64-bits in Ry to 64-bit float; keeps sign, places result in Rx

f_to_f

Floating point to floating point conversion

NameEncodingDescription
f32_to_f64bf 01 Rx Ry __ __ __ __Convert 32-bit float in Ry to 64-bit float; places the result in Rx
f64_to_f32c0 01 Rx Ry __ __ __ __Convert 64-bit float in Ry to 32-bit float; places the result in Rx