diff --git a/src/nouveau/compiler/nak/hw_tests.rs b/src/nouveau/compiler/nak/hw_tests.rs index dcf5afe82da..0794d530ade 100644 --- a/src/nouveau/compiler/nak/hw_tests.rs +++ b/src/nouveau/compiler/nak/hw_tests.rs @@ -740,6 +740,39 @@ fn test_iadd64() { } } +#[test] +fn test_ineg64() { + let run = RunSingleton::get(); + let invocations = 100; + + let mut b = TestShaderBuilder::new(run.sm.as_ref()); + + let x = SSARef::from([ + b.ld_test_data(0, MemType::B32)[0], + b.ld_test_data(4, MemType::B32)[0], + ]); + let dst = b.ineg64(x.into()); + b.st_test_data(8, MemType::B32, dst[0].into()); + b.st_test_data(12, MemType::B32, dst[1].into()); + + let bin = b.compile(); + + let mut a = Acorn::new(); + let mut data = Vec::new(); + for _ in 0..invocations { + data.push([a.get_u32(), a.get_u32(), 0, 0]); + } + + run.run.run(&bin, &mut data).unwrap(); + + for d in &data { + let x = u64::from(d[0]) | (u64::from(d[1]) << 32); + let dst = -(x as i64) as u64; + assert_eq!(d[2], dst as u32); + assert_eq!(d[3], (dst >> 32) as u32); + } +} + #[test] fn test_isetp64() { let run = RunSingleton::get();