use miden_core::{Felt, ZERO};
use crate::{
ErrorContext, ExecutionError,
fast::Tracer,
processor::{Processor, StackInterface},
};
#[inline(always)]
pub(super) fn op_push<P: Processor>(
processor: &mut P,
element: Felt,
tracer: &mut impl Tracer,
) -> Result<(), ExecutionError> {
processor.stack().increment_size(tracer)?;
processor.stack().set(0, element);
Ok(())
}
#[inline(always)]
pub(super) fn op_pad<P: Processor>(
processor: &mut P,
tracer: &mut impl Tracer,
) -> Result<(), ExecutionError> {
processor.stack().increment_size(tracer)?;
processor.stack().set(0, ZERO);
Ok(())
}
#[inline(always)]
pub(super) fn op_swap<P: Processor>(processor: &mut P) {
processor.stack().swap(0, 1);
}
#[inline(always)]
pub(super) fn op_swap_double_word<P: Processor>(processor: &mut P) {
processor.stack().swap(0, 8);
processor.stack().swap(1, 9);
processor.stack().swap(2, 10);
processor.stack().swap(3, 11);
processor.stack().swap(4, 12);
processor.stack().swap(5, 13);
processor.stack().swap(6, 14);
processor.stack().swap(7, 15);
}
#[inline(always)]
pub(super) fn dup_nth<P: Processor>(
processor: &mut P,
n: usize,
tracer: &mut impl Tracer,
) -> Result<(), ExecutionError> {
let to_dup = processor.stack().get(n);
processor.stack().increment_size(tracer)?;
processor.stack().set(0, to_dup);
Ok(())
}
#[inline(always)]
pub(super) fn op_cswap<P: Processor>(
processor: &mut P,
err_ctx: &impl ErrorContext,
tracer: &mut impl Tracer,
) -> Result<(), ExecutionError> {
let condition = processor.stack().get(0);
processor.stack().decrement_size(tracer);
match condition.as_int() {
0 => {
},
1 => {
processor.stack().swap(0, 1);
},
_ => {
return Err(ExecutionError::not_binary_value_op(condition, err_ctx));
},
}
Ok(())
}
#[inline(always)]
pub(super) fn op_cswapw<P: Processor>(
processor: &mut P,
err_ctx: &impl ErrorContext,
tracer: &mut impl Tracer,
) -> Result<(), ExecutionError> {
let condition = processor.stack().get(0);
processor.stack().decrement_size(tracer);
match condition.as_int() {
0 => {
},
1 => {
processor.stack().swap(0, 4);
processor.stack().swap(1, 5);
processor.stack().swap(2, 6);
processor.stack().swap(3, 7);
},
_ => {
return Err(ExecutionError::not_binary_value_op(condition, err_ctx));
},
}
Ok(())
}