diff --git a/src/nouveau/compiler/nak_encode_sm75.rs b/src/nouveau/compiler/nak_encode_sm75.rs index 089b3dbc12a..7099825189a 100644 --- a/src/nouveau/compiler/nak_encode_sm75.rs +++ b/src/nouveau/compiler/nak_encode_sm75.rs @@ -336,13 +336,25 @@ impl SM75Instr { } fn encode_iadd3(&mut self, op: &OpIAdd3) { - self.encode_alu( - 0x010, - Some(op.dst), - Some(op.mod_src(0)), - op.mod_src(1), - Some(op.mod_src(2)), - ); + /* TODO: This should happen as part of a legalization pass */ + assert!(op.srcs[0].is_reg_or_zero()); + if op.srcs[2].is_reg_or_zero() { + self.encode_alu( + 0x010, + Some(op.dst), + Some(op.mod_src(0)), + op.mod_src(1), + Some(op.mod_src(2)), + ); + } else { + self.encode_alu( + 0x010, + Some(op.dst), + Some(op.mod_src(0)), + op.mod_src(2), + Some(op.mod_src(1)), + ); + } self.set_pred_src(81..84, op.carry[0]); self.set_pred_src(84..87, op.carry[1]); diff --git a/src/nouveau/compiler/nak_ir.rs b/src/nouveau/compiler/nak_ir.rs index 50fe68f01ed..7d730788be8 100644 --- a/src/nouveau/compiler/nak_ir.rs +++ b/src/nouveau/compiler/nak_ir.rs @@ -277,6 +277,13 @@ impl Ref { Src::SSA(ssa) => Some(ssa), } } + + pub fn is_reg_or_zero(&self) -> bool { + match self { + Ref::Zero | Ref::SSA(_) | Ref::Reg(_) => true, + Ref::Imm(_) | Ref::CBuf(_) => false, + } + } } impl fmt::Display for Ref {