u32 operations
Miden assembly provides a set of instructions which can perform operations on regular two-complement 32-bit integers. These instructions are described in the tables below.
For instructions where one or more operands can be provided as immediate parameters (e.g., u32wrapping_add
and u32wrapping_add.b
), we provide stack transition diagrams only for the non-immediate version. For the immediate version, it can be assumed that the operand with the specified name is not present on the stack.
In all the table below, the number of cycles it takes for the VM to execute each instruction is listed beneath the instruction.
Conversions and tests
Instruction | Stack input | Stack output | Notes |
---|---|---|---|
u32test - (5 cycles) | [a, ...] | [b, a, ...] | |
u32testw - (23 cycles) | [A, ...] | [b, A, ...] | |
u32assert - (3 cycles) | [a, ...] | [a, ...] | Fails if |
u32assert2 - (1 cycle) | [b, a,...] | [b, a,...] | Fails if or |
u32assertw - (6 cycles) | [A, ...] | [A, ...] | Fails if |
u32cast - (2 cycles) | [a, ...] | [b, ...] | |
u32split - (1 cycle) | [a, ...] | [c, b, ...] | , |
The instructions u32assert
, u32assert2
and u32assertw
can also be parametrized with an error code which can be any 32-bit value specified either directly or via a named constant. For example:
u32assert.err=123
u32assert.err=MY_CONSTANT
If the error code is omitted, the default value of is assumed.
Arithmetic operations
Instruction | Stack input | Stack output | Notes |
---|---|---|---|
u32overflowing_add - (1 cycle) u32overflowing_add.b - (2-3 cycles) | [b, a, ...] | [d, c, ...] | Undefined if |
u32wrapping_add - (2 cycles) u32wrapping_add.b - (3-4 cycles) | [b, a, ...] | [c, ...] | Undefined if |
u32overflowing_add3 - (1 cycle) | [c, b, a, ...] | [e, d, ...] | , Undefined if |
u32wrapping_add3 - (2 cycles) | [c, b, a, ...] | [d, ...] | , Undefined if |
u32overflowing_sub - (1 cycle) u32overflowing_sub.b - (2-3 cycles) | [b, a, ...] | [d, c, ...] | Undefined if |
u32wrapping_sub - (2 cycles) u32wrapping_sub.b - (3-4 cycles) | [b, a, ...] | [c, ...] | Undefined if |
u32overflowing_mul - (1 cycle) u32overflowing_mul.b - (2-3 cycles) | [b, a, ...] | [d, c, ...] | Undefined if |
u32wrapping_mul - (2 cycles) u32wrapping_mul.b - (3-4 cycles) | [b, a, ...] | [c, ...] | Undefined if |
u32overflowing_madd - (1 cycle) | [b, a, c, ...] | [e, d, ...] | Undefined if |
u32wrapping_madd - (2 cycles) | [b, a, c, ...] | [d, ...] | Undefined if |
u32div - (2 cycles) u32div.b - (3-4 cycles) | [b, a, ...] | [c, ...] | Fails if Undefined if |
u32mod - (3 cycles) u32mod.b - (4-5 cycles) | [b, a, ...] | [c, ...] | Fails if Undefined if |
u32divmod - (1 cycle) u32divmod.b - (2-3 cycles) | [b, a, ...] | [d, c, ...] | Fails if Undefined if |
Bitwise operations
Instruction | Stack input | Stack output | Notes |
---|---|---|---|
u32and - (1 cycle) | [b, a, ...] | [c, ...] | Computes as a bitwise AND of binary representations of and . Fails if |
u32or - (6 cycle)s | [b, a, ...] | [c, ...] | Computes as a bitwise OR of binary representations of and . Fails if |
u32xor - (1 cycle) | [b, a, ...] | [c, ...] | Computes as a bitwise XOR of binary representations of and . Fails if |
u32not - (5 cycles) | [a, ...] | [b, ...] | Computes as a bitwise NOT of binary representation of . Fails if |
u32shl - (18 cycles) u32shl.b - (3 cycles) | [b, a, ...] | [c, ...] | Undefined if or |
u32shr - (18 cycles) u32shr.b - (3 cycles) | [b, a, ...] | [c, ...] | Undefined if or |
u32rotl - (18 cycles) u32rotl.b - (3 cycles) | [b, a, ...] | [c, ...] | Computes by rotating a 32-bit representation of to the left by bits. Undefined if or |
u32rotr - (22 cycles) u32rotr.b - (3 cycles) | [b, a, ...] | [c, ...] | Computes by rotating a 32-bit representation of to the right by bits. Undefined if or |
u32popcnt - (33 cycles) | [a, ...] | [b, ...] | Computes by counting the number of set bits in (hamming weight of ). Undefined if |
u32clz - (37 cycles) | [a, ...] | [b, ...] | Computes as a number of leading zeros of . Undefined if |
u32ctz - (34 cycles) | [a, ...] | [b, ...] | Computes as a number of trailing zeros of . Undefined if |
u32clo - (36 cycles) | [a, ...] | [b, ...] | Computes as a number of leading ones of . Undefined if |
u32cto - (33 cycles) | [a, ...] | [b, ...] | Computes as a number of trailing ones of . Undefined if |
Comparison operations
Instruction | Stack input | Stack output | Notes |
---|---|---|---|
u32lt - (3 cycles) | [b, a, ...] | [c, ...] | Undefined if |
u32lte - (5 cycles) | [b, a, ...] | [c, ...] | Undefined if |
u32gt - (4 cycles) | [b, a, ...] | [c, ...] | Undefined if |
u32gte - (4 cycles) | [b, a, ...] | [c, ...] | Undefined if |
u32min - (8 cycles) | [b, a, ...] | [c, ...] | Undefined if |
u32max - (9 cycles) | [b, a, ...] | [c, ...] | Undefined if |