From f26228fca31e945107d98511336aba2d2f4e1bd2 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:53:19 -0600 Subject: [PATCH] nak: One of the predicates in IADD3 is a destination Part-of: --- src/nouveau/compiler/nak_encode_sm75.rs | 12 +++++++++--- src/nouveau/compiler/nak_ir.rs | 15 +++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/nouveau/compiler/nak_encode_sm75.rs b/src/nouveau/compiler/nak_encode_sm75.rs index f0fe9969f35..99d5a6c3acc 100644 --- a/src/nouveau/compiler/nak_encode_sm75.rs +++ b/src/nouveau/compiler/nak_encode_sm75.rs @@ -147,7 +147,13 @@ impl SM75Instr { } fn set_pred_dst(&mut self, range: Range, dst: Dst) { - self.set_pred_reg(range, *dst.as_reg().unwrap()); + match dst { + Dst::Zero => { + self.set_pred_reg(range, RegRef::zero(RegFile::Pred, 1)); + } + Dst::Reg(reg) => self.set_pred_reg(range, reg), + _ => panic!("Not a register"), + } } fn set_pred_src(&mut self, range: Range, not_bit: isize, src: Src) { @@ -437,8 +443,8 @@ impl SM75Instr { ); } - self.set_pred_src(81..84, -1, op.carry[0]); - self.set_pred_src(84..87, -1, op.carry[1]); + self.set_pred_dst(81..84, op.overflow); + self.set_pred_src(84..87, -1, op.carry); } fn set_int_cmp_op(&mut self, range: Range, op: IntCmpOp) { diff --git a/src/nouveau/compiler/nak_ir.rs b/src/nouveau/compiler/nak_ir.rs index f6f48b7d874..3c84885b9cd 100644 --- a/src/nouveau/compiler/nak_ir.rs +++ b/src/nouveau/compiler/nak_ir.rs @@ -885,21 +885,22 @@ impl fmt::Display for OpFSetP { #[derive(SrcsAsSlice, DstsAsSlice)] pub struct OpIAdd3 { pub dst: Dst, + pub overflow: Dst, pub srcs: [Src; 3], - pub carry: [Src; 2], + pub carry: Src, } impl fmt::Display for OpIAdd3 { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, - "IADD3 {} {{ {}, {}, {}, {}, {} }}", + "IADD3 {{ {} {} }} {{ {}, {}, {}, {} }}", self.dst, + self.overflow, self.srcs[0], self.srcs[1], self.srcs[2], - self.carry[0], - self.carry[1] + self.carry, ) } } @@ -1471,8 +1472,9 @@ impl Instr { pub fn new_iadd(dst: Dst, x: Src, y: Src) -> Instr { Instr::new(Op::IAdd3(OpIAdd3 { dst: dst, + overflow: Dst::Zero, srcs: [Src::new_zero(), x, y], - carry: [Src::new_zero(); 2], + carry: Src::new_zero(), })) } @@ -1783,8 +1785,9 @@ impl Shader { Op::IMov(mov) => { vec![Instr::new(Op::IAdd3(OpIAdd3 { dst: mov.dst, + overflow: Dst::Zero, srcs: [Src::new_zero(), mov.src, Src::new_zero()], - carry: [Src::new_zero(); 2], + carry: Src::new_zero(), }))] } Op::Vec(vec) => {