Implement all missing instructions
This commit is contained in:
10
pim-vm/Cargo.lock
generated
10
pim-vm/Cargo.lock
generated
@@ -146,9 +146,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
version = "0.4.11"
|
||||
version = "0.4.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829"
|
||||
checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456"
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
@@ -230,15 +230,15 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
|
||||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "0.38.25"
|
||||
version = "0.38.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e"
|
||||
checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
"windows-sys 0.48.0",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user