Implement all missing instructions

This commit is contained in:
2023-12-03 15:48:31 +01:00
parent ebecd4e763
commit 71c766736a
10 changed files with 137 additions and 32 deletions

View File

@@ -124,17 +124,18 @@ impl PimVM {
Instruction::JUMP { offset, count } => {
pim_unit.jump_counter = match pim_unit.jump_counter {
Some(jump_counter) => jump_counter.checked_sub(1),
None => Some(*count),
None => count.checked_sub(1),
};
if pim_unit.jump_counter != None {
let new_pc = pim_unit.pc as i32 + *offset as i32;
let new_pc = current_pc as i32 + *offset as i32;
if new_pc < 0 || new_pc >= 32 {
panic!("Invalid PC {new_pc} after JUMP: {inst:?}");
}
pim_unit.pc = new_pc as _;
log::debug!("PimUnit {bank_index} New PC {new_pc}: {inst:?}");
}
}
Instruction::MOV { src, dst } | Instruction::FILL { src, dst } => {
@@ -155,6 +156,55 @@ impl PimVM {
PimVM::store(*dst, pim_unit, &sum);
}
Instruction::MUL { src0, src1, dst } => {
let data0 = PimVM::load(*src0, pim_unit, &bank_data);
let data1 = PimVM::load(*src1, pim_unit, &bank_data);
let product: [f16; FP_UNITS] = data0
.into_iter()
.zip(data1)
.map(|(src0, src1)| src0 * src1)
.collect::<Vec<_>>()
.try_into()
.unwrap();
PimVM::store(*dst, pim_unit, &product);
}
Instruction::MAC {
src0,
src1,
src2,
dst,
}
| Instruction::MAD {
src0,
src1,
src2,
dst,
} => {
let data0 = PimVM::load(*src0, pim_unit, &bank_data);
let data1 = PimVM::load(*src1, pim_unit, &bank_data);
let data2 = PimVM::load(*src2, pim_unit, &bank_data);
let product: [f16; FP_UNITS] = data0
.into_iter()
.zip(data1)
.map(|(src0, src1)| src0 * src1)
.collect::<Vec<_>>()
.try_into()
.unwrap();
let sum: [f16; FP_UNITS] = product
.into_iter()
.zip(data2)
.map(|(product, src2)| product + src2)
.collect::<Vec<_>>()
.try_into()
.unwrap();
log::debug!("{data0:#?}\n{data1:#?}\n{data2:#?}\n{product:#?}\n{sum:#?}");
PimVM::store(*dst, pim_unit, &sum);
}
}
}