From 5ad06de4d3820e55a2ffe53228ccd3b52f7918b8 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:53:18 -0600 Subject: [PATCH] nak: Allow iadd3 to take an immediate in srcs[2] Part-of: --- src/nouveau/compiler/nak_encode_sm75.rs | 26 ++++++++++++++++++------- src/nouveau/compiler/nak_ir.rs | 7 +++++++ 2 files changed, 26 insertions(+), 7 deletions(-) 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 {