Skip to content

Stack manipulation

Miden VM stack is a push-down stack of field elements. The stack has a maximum depth of \(2^{32}\), but only the top \(16\) elements are directly accessible via the instructions listed below.

In addition to the typical stack manipulation instructions such as drop, dup, swap etc., Miden assembly provides several conditional instructions which can be used to manipulate the stack based on some condition - e.g., conditional swap cswap or conditional drop cdrop.

Stack manipulation

Instruction Stack_input Stack_output Notes
drop
- (1 cycle)
[a, … ] [ … ] Deletes the top stack item.
dropw
- (4 cycles)
[A, … ] [ … ] Deletes a word (4 elements) from the top of the stack.
padw
- (4 cycles)
[ … ] [0, 0, 0, 0, … ] Pushes four \(0\) values onto the stack.
Note: simple pad is not provided because push.0 does the same thing.
dup.n
- (1-3 cycles)
[ …, a, … ] [a, …, a, … ] Pushes a copy of the \(n\)th stack item onto the stack. dup and dup.0 are the same instruction. Valid for \(n \in \{0, ..., 15\}\)
dupw.n
- (4 cycles)
[ …, A, … ] [A, …, A, … ] Pushes a copy of the \(n\)th stack word onto the stack. dupw and dupw.0 are the same instruction. Valid for \(n \in \{0, 1, 2, 3\}\)
swap.n
- (1-6 cycles)
[a, …, b, … ] [b, …, a, … ] Swaps the top stack item with the \(n\)th stack item. swap and swap.1 are the same instruction. Valid for \(n \in \{1, ..., 15\}\)
swapw.n
- (1 cycle)
[A, …, B, … ] [B, …, A, … ] Swaps the top stack word with the \(n\)th stack word. swapw and swapw.1 are the same instruction. Valid for \(n \in \{1, 2, 3\}\)
swapdw
- (1 cycle)
[D, C, B, A, … ] [B, A, D, C … ] Swaps words on the top of the stack. The 1st with the 3rd, and the 2nd with the 4th.
movup.n
- (1-4 cycles)
[ …, a, … ] [a, … ] Moves the \(n\)th stack item to the top of the stack. Valid for \(n \in \{2, ..., 15\}\)
movupw.n
- (2-3 cycles)
[ …, A, … ] [A, … ] Moves the \(n\)th stack word to the top of the stack. Valid for \(n \in \{2, 3\}\)
movdn.n
- (1-4 cycles)
[a, … ] [ …, a, … ] Moves the top stack item to the \(n\)th position of the stack. Valid for \(n \in \{2, ..., 15\}\)
movdnw.n
- (2-3 cycles)
[A, … ] [ …, A, … ] Moves the top stack word to the \(n\)th word position of the stack. Valid for \(n \in \{2, 3\}\)

Conditional manipulation

Instruction Stack_input Stack_output Notes
cswap
- (1 cycle)
[c, b, a, … ] [e, d, … ] \(d = \begin{cases} a, & \text{if}\ c = 0 \\ b, & \text{if}\ c = 1\ \end{cases}\)
\(e = \begin{cases} b, & \text{if}\ c = 0 \\ a, & \text{if}\ c = 1\ \end{cases}\)
Fails if \(c > 1\)
cswapw
- (1 cycle)
[c, B, A, … ] [E, D, … ] \(D = \begin{cases} A, & \text{if}\ c = 0 \\ B, & \text{if}\ c = 1\ \end{cases}\)
\(E = \begin{cases} B, & \text{if}\ c = 0 \\ A, & \text{if}\ c = 1\ \end{cases}\)
Fails if \(c > 1\)
cdrop
- (2 cycles)
[c, b, a, … ] [d, … ] \(d = \begin{cases} a, & \text{if}\ c = 0 \\ b, & \text{if}\ c = 1\ \end{cases}\)
Fails if \(c > 1\)
cdropw
- (5 cycles)
[c, B, A, … ] [D, … ] \(D = \begin{cases} A, & \text{if}\ c = 0 \\ B, & \text{if}\ c = 1\ \end{cases}\)
Fails if \(c > 1\)

Last update: December 21, 2023
Authors: kmurphypolygon