use pimcore::{ Executable, cpu::CPU, instruction_set::{InstructionsBuilder, instruction_data::InstructionDataBuilder, isa::*}, memory_manager::{MemoryStorable, type_traits::UpcastDestTraits}, }; /// VVADD Test fn vvadd_test_generic(err: &str) where F: From + std::fmt::Debug + PartialEq + MemoryStorable, T: From + std::fmt::Debug + PartialEq + MemoryStorable, { let mut cpu = CPU::new(0); let buff: [F; _] = [ 1.0.into(), 2.0.into(), 3.0.into(), 4.0.into(), 5.0.into(), 6.0.into(), 7.0.into(), 8.0.into(), 9.0.into(), 10.0.into(), 11.0.into(), 12.0.into(), 13.0.into(), 14.0.into(), 15.0.into(), 16.0.into(), ]; cpu.host().execute_store(0, &buff).unwrap(); let mut inst_builder = InstructionsBuilder::new(); let mut idata_build = InstructionDataBuilder::new(); idata_build.set_core_indx(0).fix_core_indx(); inst_builder.make_inst(sldi, idata_build.set_rdimm(1, 0).build()); inst_builder.make_inst( sldi, idata_build.set_rdimm(2, 8 * size_of::() as i32).build(), ); inst_builder.make_inst( sldi, idata_build.set_rdimm(3, 16 * size_of::() as i32).build(), ); inst_builder.make_inst( setbw, idata_build .set_ibiw_obiw(8 * size_of::() as i32, 8 * size_of::() as i32) .build(), ); inst_builder.make_inst( vvadd, idata_build .set_rdr1r2(3, 1, 2) .set_imm_len(8 * size_of::() as i32) .build(), ); let core_instruction = vec![inst_builder.build().into()]; let mut executable = Executable::new(cpu, core_instruction); executable.execute(); // Check result correct assert_eq!( executable .cpu_mut() .host() .load::(16 * size_of::(), 8 * size_of::()).unwrap()[0], vec![ 10.0.into(), 12.0.into(), 14.0.into(), 16.0.into(), 18.0.into(), 20.0.into(), 22.0.into(), 24.0.into() ], "Wrong result for {}", err ); // Check first part equal assert_eq!( executable .cpu_mut() .host() .load::(0, 16 * size_of::()).unwrap()[0], &buff, "Altered first part for {}", err ); //Check that later is 0 assert_eq!( executable.cpu_mut().host().load::( 16 * size_of::() + 8 * size_of::(), 4 * size_of::() ).unwrap()[0], [0, 0, 0, 0], "Altered first part for {}", err ); } #[test] fn vvadd_test() { vvadd_test_generic::("vvadd"); vvadd_test_generic::("vvadd"); vvadd_test_generic::("vvadd"); vvadd_test_generic::("vvadd"); } /// VVSUM Test fn vvsub_test_generic(err: &str) where F: From + std::fmt::Debug + PartialEq + MemoryStorable, T: From + std::fmt::Debug + PartialEq + MemoryStorable, { let mut cpu = CPU::new(0); let buff: [F; _] = [ 1.0.into(), 2.0.into(), 3.0.into(), 4.0.into(), 5.0.into(), 6.0.into(), 7.0.into(), 8.0.into(), 9.0.into(), 10.0.into(), 11.0.into(), 12.0.into(), 13.0.into(), 14.0.into(), 15.0.into(), 16.0.into(), ]; cpu.host().execute_store(0, &buff).unwrap(); let mut inst_builder = InstructionsBuilder::new(); let mut idata_build = InstructionDataBuilder::new(); idata_build.set_core_indx(0).fix_core_indx(); inst_builder.make_inst(sldi, idata_build.set_rdimm(1, 0).build()); inst_builder.make_inst( sldi, idata_build.set_rdimm(2, 8 * size_of::() as i32).build(), ); inst_builder.make_inst( sldi, idata_build.set_rdimm(3, 16 * size_of::() as i32).build(), ); inst_builder.make_inst( setbw, idata_build .set_ibiw_obiw(8 * size_of::() as i32, 8 * size_of::() as i32) .build(), ); inst_builder.make_inst( vvsub, idata_build .set_rdr1r2(3, 1, 2) .set_imm_len(8 * size_of::() as i32) .build(), ); let core_instruction = vec![inst_builder.build().into()]; let mut executable = Executable::new(cpu, core_instruction); executable.execute(); // Check result correct assert_eq!( executable .cpu_mut() .host() .load::(16 * size_of::(), 8 * size_of::()).unwrap()[0], vec![ (-8.0).into(), (-8.0).into(), (-8.0).into(), (-8.0).into(), (-8.0).into(), (-8.0).into(), (-8.0).into(), (-8.0).into() ], "Wrong result for {}", err ); // Check first part equal assert_eq!( executable .cpu_mut() .host() .load::(0, 16 * size_of::()).unwrap()[0], &buff, "Altered first part for {}", err ); //Check that later is 0 assert_eq!( executable.cpu_mut().host().load::( 16 * size_of::() + 8 * size_of::(), 4 * size_of::() ).unwrap()[0], [0, 0, 0, 0], "Altered first part for {}", err ); } #[test] fn vvsub_test() { vvsub_test_generic::("vvsub"); vvsub_test_generic::("vvsub"); vvsub_test_generic::("vvsub"); vvsub_test_generic::("vvsub"); } /// VVMUL Test fn vvmul_test_generic(err: &str) where F: From + std::fmt::Debug + PartialEq + MemoryStorable, T: From + std::fmt::Debug + PartialEq + MemoryStorable, { let mut cpu = CPU::new(0); let buff: [F; _] = [ 1.0.into(), 2.0.into(), 3.0.into(), 4.0.into(), 5.0.into(), 6.0.into(), 7.0.into(), 8.0.into(), 9.0.into(), 10.0.into(), 11.0.into(), 12.0.into(), 13.0.into(), 14.0.into(), 15.0.into(), 16.0.into(), ]; cpu.host().execute_store(0, &buff).unwrap(); let mut inst_builder = InstructionsBuilder::new(); let mut idata_build = InstructionDataBuilder::new(); idata_build.set_core_indx(0).fix_core_indx(); inst_builder.make_inst(sldi, idata_build.set_rdimm(1, 0).build()); inst_builder.make_inst( sldi, idata_build.set_rdimm(2, 8 * size_of::() as i32).build(), ); inst_builder.make_inst( sldi, idata_build.set_rdimm(3, 16 * size_of::() as i32).build(), ); inst_builder.make_inst( setbw, idata_build .set_ibiw_obiw(8 * size_of::() as i32, 8 * size_of::() as i32) .build(), ); inst_builder.make_inst( vvmul, idata_build .set_rdr1r2(3, 1, 2) .set_imm_len(8 * size_of::() as i32) .build(), ); let core_instruction = vec![inst_builder.build().into()]; let mut executable = Executable::new(cpu, core_instruction); executable.execute(); // Check result correct assert_eq!( executable .cpu_mut() .host() .load::(16 * size_of::(), 8 * size_of::()).unwrap()[0], vec![ (9.0).into(), (20.0).into(), (33.0).into(), (48.0).into(), (65.0).into(), (84.0).into(), (105.0).into(), (128.0).into() ], "Wrong result for {}", err ); // Check first part equal assert_eq!( executable .cpu_mut() .host() .load::(0, 16 * size_of::()).unwrap()[0], &buff, "Altered first part for {}", err ); //Check that later is 0 assert_eq!( executable.cpu_mut().host().load::( 16 * size_of::() + 8 * size_of::(), 4 * size_of::() ).unwrap()[0], [0, 0, 0, 0], "Altered first part for {}", err ); } #[test] fn vvmul_test() { vvmul_test_generic::("vvmul"); vvmul_test_generic::("vvmul"); vvmul_test_generic::("vvmul"); vvmul_test_generic::("vvmul"); } /// VVDMUL Test fn vvdmul_test_generic(err: &str) where F: From + std::fmt::Debug + PartialEq + MemoryStorable, T: From + std::fmt::Debug + PartialEq + MemoryStorable, { let mut cpu = CPU::new(0); let buff: [F; _] = [ 1.0.into(), 2.0.into(), 3.0.into(), 4.0.into(), 5.0.into(), 6.0.into(), 7.0.into(), 8.0.into(), 9.0.into(), 10.0.into(), 11.0.into(), 12.0.into(), 13.0.into(), 14.0.into(), 15.0.into(), 16.0.into(), ]; cpu.host().execute_store(0, &buff).unwrap(); let mut inst_builder = InstructionsBuilder::new(); let mut idata_build = InstructionDataBuilder::new(); idata_build.set_core_indx(0).fix_core_indx(); inst_builder.make_inst(sldi, idata_build.set_rdimm(1, 0).build()); inst_builder.make_inst( sldi, idata_build.set_rdimm(2, 8 * size_of::() as i32).build(), ); inst_builder.make_inst( sldi, idata_build.set_rdimm(3, 16 * size_of::() as i32).build(), ); inst_builder.make_inst( setbw, idata_build .set_ibiw_obiw(8 * size_of::() as i32, 8 * size_of::() as i32) .build(), ); inst_builder.make_inst( vvdmul, idata_build .set_rdr1r2(3, 1, 2) .set_imm_len(8 * size_of::() as i32) .build(), ); let core_instruction = vec![inst_builder.build().into()]; let mut executable = Executable::new(cpu, core_instruction); executable.execute(); // Check result correct assert_eq!( executable .cpu_mut() .host() .load::(16 * size_of::(), size_of::()).unwrap()[0], vec![ (492.0).into(), ], "Wrong result for {}", err ); // Check first part equal assert_eq!( executable .cpu_mut() .host() .load::(0, 16 * size_of::()).unwrap()[0], &buff, "Altered first part for {}", err ); //Check that later is 0 assert_eq!( executable.cpu_mut().host().load::( 16 * size_of::() + size_of::(), 4 * size_of::() ).unwrap()[0], [0, 0, 0, 0], "Altered first part for {}", err ); } #[test] fn vvdmul_test() { vvdmul_test_generic::("vvdmul"); vvdmul_test_generic::("vvdmul"); vvdmul_test_generic::("vvdmul"); vvdmul_test_generic::("vvdmul"); } /// vvmax Test fn vvmax_test_generic(err: &str) where F: From + std::fmt::Debug + PartialEq + MemoryStorable, T: From + std::fmt::Debug + PartialEq + MemoryStorable, { let mut cpu = CPU::new(0); let buff: [F; _] = [ 9.0.into(), 2.0.into(), 11.0.into(), 4.0.into(), 13.0.into(), 6.0.into(), 7.0.into(), 8.0.into(), 1.0.into(), 10.0.into(), 3.0.into(), 12.0.into(), 4.0.into(), 14.0.into(), 15.0.into(), 16.0.into(), ]; cpu.host().execute_store(0, &buff).unwrap(); let mut inst_builder = InstructionsBuilder::new(); let mut idata_build = InstructionDataBuilder::new(); idata_build.set_core_indx(0).fix_core_indx(); inst_builder.make_inst(sldi, idata_build.set_rdimm(1, 0).build()); inst_builder.make_inst( sldi, idata_build.set_rdimm(2, 8 * size_of::() as i32).build(), ); inst_builder.make_inst( sldi, idata_build.set_rdimm(3, 16 * size_of::() as i32).build(), ); inst_builder.make_inst( setbw, idata_build .set_ibiw_obiw(8 * size_of::() as i32, 8 * size_of::() as i32) .build(), ); inst_builder.make_inst( vvmax, idata_build .set_rdr1r2(3, 1, 2) .set_imm_len(8 * size_of::() as i32) .build(), ); let core_instruction = vec![inst_builder.build().into()]; let mut executable = Executable::new(cpu, core_instruction); executable.execute(); // Check result correct assert_eq!( executable .cpu_mut() .host() .load::(16 * size_of::(), 8 * size_of::()).unwrap()[0], vec![ 9.0.into(), 10.0.into(), 11.0.into(), 12.0.into(), 13.0.into(), 14.0.into(), 15.0.into(), 16.0.into(), ], "Wrong result for {}", err ); // Check first part equal assert_eq!( executable .cpu_mut() .host() .load::(0, 16 * size_of::()).unwrap()[0], &buff, "Altered first part for {}", err ); //Check that later is 0 assert_eq!( executable.cpu_mut().host().load::( 16 * size_of::() + 8 * size_of::(), 4 * size_of::() ).unwrap()[0], [0, 0, 0, 0], "Altered first part for {}", err ); } #[test] fn vvmax_test() { vvmax_test_generic::("vvmax"); vvmax_test_generic::("vvmax"); vvmax_test_generic::("vvmax"); vvmax_test_generic::("vvmax"); } /// vavg Test fn vavg_test_generic(err: &str) where F: From + std::fmt::Debug + PartialEq + MemoryStorable, T: From + std::fmt::Debug + PartialEq + MemoryStorable, { let mut cpu = CPU::new(0); let buff: [F; _] = [ 9.0.into(), 2.0.into(), 11.0.into(), 4.0.into(), 13.0.into(), 6.0.into(), 7.0.into(), 8.0.into(), 1.0.into(), 10.0.into(), 3.0.into(), 12.0.into(), 4.0.into(), 14.0.into(), 15.0.into(), 16.0.into(), ]; cpu.host().execute_store(0, &buff).unwrap(); let mut inst_builder = InstructionsBuilder::new(); let mut idata_build = InstructionDataBuilder::new(); idata_build.set_core_indx(0).fix_core_indx(); inst_builder.make_inst(sldi, idata_build.set_rdimm(1, 0).build()); inst_builder.make_inst( sldi, idata_build.set_rdimm(3, 16 * size_of::() as i32).build(), ); inst_builder.make_inst( setbw, idata_build .set_ibiw_obiw(8 * size_of::() as i32, 8 * size_of::() as i32) .build(), ); inst_builder.make_inst( vavg, idata_build .set_rdr1r2(3, 1, 1) .set_imm_len(8 * size_of::() as i32) .build(), ); let core_instruction = vec![inst_builder.build().into()]; let mut executable = Executable::new(cpu, core_instruction); executable.execute(); // Check result correct assert_eq!( executable .cpu_mut() .host() .load::(16 * size_of::(), size_of::()).unwrap()[0], vec![ 7.5.into(), ], "Wrong result for {}", err ); // Check first part equal assert_eq!( executable .cpu_mut() .host() .load::(0, 16 * size_of::()).unwrap()[0], &buff, "Altered first part for {}", err ); //Check that later is 0 assert_eq!( executable.cpu_mut().host().load::( 16 * size_of::() + size_of::(), 4 * size_of::() ).unwrap()[0], [0, 0, 0, 0], "Altered first part for {}", err ); } #[test] fn vavg_test() { vavg_test_generic::("vavg"); vavg_test_generic::("vavg"); vavg_test_generic::("vavg"); vavg_test_generic::("vavg"); } /// vrelu Test fn vrelu_test_generic(err: &str) where F: From + std::fmt::Debug + PartialEq + MemoryStorable, T: From + std::fmt::Debug + PartialEq + MemoryStorable, { let mut cpu = CPU::new(0); let buff: [F; _] = [ (-9.0).into(), 2.0.into(), 11.0.into(), (-4.0).into(), 13.0.into(), (-6.0).into(), 7.0.into(), (-6.0).into(), 1.0.into(), (-6.0).into(), 3.0.into(), 12.0.into(), (-6.0).into(), 14.0.into(), (-6.0).into(), 16.0.into(), ]; cpu.host().execute_store(0, &buff).unwrap(); let mut inst_builder = InstructionsBuilder::new(); let mut idata_build = InstructionDataBuilder::new(); idata_build.set_core_indx(0).fix_core_indx(); inst_builder.make_inst(sldi, idata_build.set_rdimm(1, 0).build()); inst_builder.make_inst( sldi, idata_build.set_rdimm(3, 16 * size_of::() as i32).build(), ); inst_builder.make_inst( setbw, idata_build .set_ibiw_obiw(8 * size_of::() as i32, 8 * size_of::() as i32) .build(), ); inst_builder.make_inst( vrelu, idata_build .set_rdr1r2(3, 1, 1) .set_imm_len(8 * size_of::() as i32) .build(), ); let core_instruction = vec![inst_builder.build().into()]; let mut executable = Executable::new(cpu, core_instruction); executable.execute(); // Check result correct assert_eq!( executable .cpu_mut() .host() .load::(16 * size_of::(), 8*size_of::()).unwrap()[0], vec![ 0.0.into(), 2.0.into(), 11.0.into(), 0.0.into(), 13.0.into(), 0.0.into(), 7.0.into(), 0.0.into(), ], "Wrong result for {}", err ); // Check first part equal assert_eq!( executable .cpu_mut() .host() .load::(0, 16 * size_of::()).unwrap()[0], &buff, "Altered first part for {}", err ); //Check that later is 0 assert_eq!( executable.cpu_mut().host().load::( 16 * size_of::() + 8*size_of::(), 4 * size_of::() ).unwrap()[0], [0, 0, 0, 0], "Altered first part for {}", err ); } #[test] fn vrelu_test() { vrelu_test_generic::("vrelu"); vrelu_test_generic::("vrelu"); vrelu_test_generic::("vrelu"); vrelu_test_generic::("vrelu"); } /// vtanh Test fn vtanh_test_generic(err: &str) where F: From + std::fmt::Debug + PartialEq + MemoryStorable, T: From + std::fmt::Debug + PartialEq + MemoryStorable + UpcastDestTraits, { let mut cpu = CPU::new(0); let buff: [F; _] = [ 0.1.into(), 0.2.into(), 0.3.into(), 0.4.into(), 0.5.into(), 0.6.into(), 0.7.into(), 0.8.into(), 0.9.into(), 0.10.into(), 0.11.into(), 0.12.into(), 0.13.into(), 0.14.into(), 0.15.into(), 0.16.into(), ]; cpu.host().execute_store(0, &buff).unwrap(); let mut inst_builder = InstructionsBuilder::new(); let mut idata_build = InstructionDataBuilder::new(); idata_build.set_core_indx(0).fix_core_indx(); inst_builder.make_inst(sldi, idata_build.set_rdimm(1, 0).build()); inst_builder.make_inst( sldi, idata_build.set_rdimm(3, 16 * size_of::() as i32).build(), ); inst_builder.make_inst( setbw, idata_build .set_ibiw_obiw(8 * size_of::() as i32, 8 * size_of::() as i32) .build(), ); inst_builder.make_inst( vtanh, idata_build .set_rdr1r2(3, 1, 1) .set_imm_len(8 * size_of::() as i32) .build(), ); let core_instruction = vec![inst_builder.build().into()]; let mut executable = Executable::new(cpu, core_instruction); executable.execute(); // Check result correct assert!( executable .cpu_mut() .host() .load::(16 * size_of::(), 8*size_of::()).unwrap()[0].iter().zip( vec![ T::from(0.1).tanh(), T::from(0.2).tanh(), T::from(0.3).tanh(), T::from(0.4).tanh(), T::from(0.5).tanh(), T::from(0.6).tanh(), T::from(0.7).tanh(), T::from(0.8).tanh(), ]).all(|(&a,b) : (&T, T)| {a-b < 0.001.into()}), "Wrong result for {}", err ); // Check first part equal assert_eq!( executable .cpu_mut() .host() .load::(0, 16 * size_of::()).unwrap()[0], &buff, "Altered first part for {}", err ); //Check that later is 0 assert_eq!( executable.cpu_mut().host().load::( 16 * size_of::() + 8*size_of::(), 4 * size_of::() ).unwrap()[0], [0, 0, 0, 0], "Altered first part for {}", err ); } #[test] fn vtanh_test() { vtanh_test_generic::("vtanh"); vtanh_test_generic::("vtanh"); vtanh_test_generic::("vtanh"); vtanh_test_generic::("vtanh"); } /// vsigm Test fn vsigm_test_generic(err: &str) where F: From + std::fmt::Debug + PartialEq + MemoryStorable, T: From + std::fmt::Debug + PartialEq + MemoryStorable + UpcastDestTraits, { let mut cpu = CPU::new(0); let buff: [F; _] = [ 0.1.into(), 0.2.into(), 0.3.into(), 0.4.into(), 0.5.into(), 0.6.into(), 0.7.into(), 0.8.into(), 0.9.into(), 0.10.into(), 0.11.into(), 0.12.into(), 0.13.into(), 0.14.into(), 0.15.into(), 0.16.into(), ]; cpu.host().execute_store(0, &buff).unwrap(); let mut inst_builder = InstructionsBuilder::new(); let mut idata_build = InstructionDataBuilder::new(); idata_build.set_core_indx(0).fix_core_indx(); inst_builder.make_inst(sldi, idata_build.set_rdimm(1, 0).build()); inst_builder.make_inst( sldi, idata_build.set_rdimm(3, 16 * size_of::() as i32).build(), ); inst_builder.make_inst( setbw, idata_build .set_ibiw_obiw(8 * size_of::() as i32, 8 * size_of::() as i32) .build(), ); inst_builder.make_inst( vsigm, idata_build .set_rdr1r2(3, 1, 1) .set_imm_len(8 * size_of::() as i32) .build(), ); let core_instruction = vec![inst_builder.build().into()]; let mut executable = Executable::new(cpu, core_instruction); executable.execute(); // Check result correct assert!( executable .cpu_mut() .host() .load::(16 * size_of::(), 8*size_of::()).unwrap()[0].iter().zip( vec![ T::from(0.1).sigm(), T::from(0.2).sigm(), T::from(0.3).sigm(), T::from(0.4).sigm(), T::from(0.5).sigm(), T::from(0.6).sigm(), T::from(0.7).sigm(), T::from(0.8).sigm(), ]).all(|(&a,b) : (&T, T)| {a-b < 0.001.into()}), "Wrong result for {}", err ); // Check first part equal assert_eq!( executable .cpu_mut() .host() .load::(0, 16 * size_of::()).unwrap()[0], &buff, "Altered first part for {}", err ); //Check that later is 0 assert_eq!( executable.cpu_mut().host().load::( 16 * size_of::() + 8*size_of::(), 4 * size_of::() ).unwrap()[0], [0, 0, 0, 0], "Altered first part for {}", err ); } #[test] fn vsigm_test() { vsigm_test_generic::("vsigm"); vsigm_test_generic::("vsigm"); vsigm_test_generic::("vsigm"); vsigm_test_generic::("vsigm"); } /// mvmul Test fn mvmul_test_generic(err: &str, relu:i32) where F: From + std::fmt::Debug + PartialEq + MemoryStorable, M: From + std::fmt::Debug + PartialEq + MemoryStorable, T: From + std::fmt::Debug + PartialEq + MemoryStorable + UpcastDestTraits, { let mut cpu = CPU::new(0); cpu.reserve_crossbar(1, 4 * size_of::(), 4); let (memory, crossbars) = cpu.host().get_memory_crossbar(); let matrix: [M; _] = [ 1.0.into(), 2.0.into(), 3.0.into(), 4.0.into(), 5.0.into(), (-56.0).into(), 7.0.into(), 8.0.into(), 9.0.into(), 10.0.into(), 11.0.into(), 12.0.into(), 13.0.into(), 14.0.into(), 15.0.into(), 16.0.into(), ]; crossbars.get_mut(0).unwrap().execute_store( &matrix).unwrap(); let vector: [F; _] = [ 1.0.into(), 2.0.into(), 3.0.into(), 4.0.into(), ]; memory.execute_store(0, &vector).unwrap(); let mut inst_builder = InstructionsBuilder::new(); let mut idata_build = InstructionDataBuilder::new(); idata_build.set_core_indx(0).fix_core_indx(); inst_builder.make_inst(sldi, idata_build.set_rdimm(1, 0).build()); inst_builder.make_inst( sldi, idata_build.set_rdimm(3, 4 * size_of::() as i32).build(), ); inst_builder.make_inst( setbw, idata_build .set_ibiw_obiw(8 * size_of::() as i32, 8 * size_of::() as i32) .build(), ); inst_builder.make_inst( mvmul, idata_build .set_rdr1(3, 1) .set_mbiw_immrelu_immgroup(8*size_of::() as i32, relu, 0) .build(), ); let core_instruction = vec![inst_builder.build().into()]; let mut executable = Executable::new(cpu, core_instruction); executable.execute(); // Check result correct if relu == 0 { assert_eq!( executable .cpu_mut() .host() .load::(4 * size_of::(), 4*size_of::()).unwrap()[0], vec![ 90.0.into(), (-24.0).into(), 110.0.into(), 120.0.into(), ], "Wrong result for {}", err ); } else { assert_eq!( executable .cpu_mut() .host() .load::(4 * size_of::(), 4*size_of::()).unwrap()[0], vec![ 90.0.into(), 0.0.into(), 110.0.into(), 120.0.into(), ], "Wrong result for {}", err ); } // Check first part equal assert_eq!( executable .cpu_mut() .host() .load::(0, 4 * size_of::()).unwrap()[0], &vector, "Altered first part for {}", err ); //Check that later is 0 assert_eq!( executable.cpu_mut().host().load::( 4 * size_of::() + 4*size_of::(), 4 * size_of::() ).unwrap()[0], [0, 0, 0, 0], "Altered first part for {}", err ); } #[test] fn mvmul_test() { mvmul_test_generic::("mvmul",0); mvmul_test_generic::("mvmul",0); mvmul_test_generic::("mvmul",0); mvmul_test_generic::("mvmul",0); mvmul_test_generic::("mvmul",0); mvmul_test_generic::("mvmul",0); mvmul_test_generic::("mvmul",0); mvmul_test_generic::("mvmul",0); mvmul_test_generic::("mvmul",1); mvmul_test_generic::("mvmul",1); mvmul_test_generic::("mvmul",1); mvmul_test_generic::("mvmul",1); mvmul_test_generic::("mvmul",1); mvmul_test_generic::("mvmul",1); mvmul_test_generic::("mvmul",1); mvmul_test_generic::("mvmul",1); }