From ff86792d695c0399ecd2403fda444457145a1095 Mon Sep 17 00:00:00 2001 From: Nyeogmi Date: Fri, 23 Jun 2023 21:19:54 -0700 Subject: [PATCH] Actually make MovType work --- src/vm.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/vm.rs b/src/vm.rs index 3fbbf46..4586c05 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -40,6 +40,15 @@ pub enum ExitInstruction { } pub enum MovType { Mov, Add, Xor } +impl MovType { + fn merge(&self, old_value: Sample, new_value: Sample) -> Sample { + match self { + MovType::Mov => new_value, + MovType::Add => Sample(old_value.0 + new_value.0), + MovType::Xor => Sample(old_value.0 ^ new_value.0) + } + } +} #[derive(Clone, Copy)] pub enum MovDst { L(RegL), R(RegR), Z(RegZ), Ix } #[derive(Clone, Copy)] pub enum MovSrc { A(RegA), L(RegL), R(RegR), Z(RegZ), Ix, Imm(Sample) } @@ -155,20 +164,20 @@ impl Scope { } MovDst::R(RegR(r)) => { let r = r as usize; - self.reg_rs[r] = value; return + self.reg_rs[r] = ty.merge(self.reg_rs[r], value); return } MovDst::Z(RegZ(z)) => { let z = z as usize; (&mut self.reg_zs[z], &self.loop_zs[z]) } - MovDst::Ix => { self.ix = value; return } + MovDst::Ix => { self.ix = ty.merge(self.ix, value); return } }; let mut ix = flat_ix + offset; if loop_.length != 0 { ix %= loop_.length; } ix += chan.formal().start + loop_.start; - chan[ix] = value + chan[ix] = ty.merge(chan[ix], value) } fn replace(&mut self, dst: OupDst, value: Channel) {