diff --git a/src/isa/exec.rs b/src/isa/exec.rs index ee8b9e6..294a21b 100644 --- a/src/isa/exec.rs +++ b/src/isa/exec.rs @@ -504,12 +504,21 @@ impl InstructionSet for ArithmeticOp { reg, idx, regs.get(reg, idx).and_then(|val| { - let mut n = Number::from(*step); - debug_assert!( - n.reshape(val.layout()), - "reshape target byte length is always greater" - ); - val.int_add(n, IntFlags { signed: false, wrap: false }) + if step.as_i8() < 0 { + let mut n = Number::from(-step.as_i8()); + debug_assert!( + n.reshape(val.layout()), + "reshape target byte length is always greater" + ); + val.int_sub(n, IntFlags { signed: false, wrap: false }) + } else { + let mut n = Number::from(*step); + debug_assert!( + n.reshape(val.layout()), + "reshape target byte length is always greater" + ); + val.int_add(n, IntFlags { signed: false, wrap: false }) + } }), ), ArithmeticOp::Neg(reg, idx) => {