From 8050b57c28c842db5dca55ce77ea47215d8bede3 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Tue, 23 Jul 2024 23:40:02 -0500 Subject: [PATCH] nak/calc_instr_deps: Set a delay of 13 for flow ops pre-Volta Part-of: --- src/nouveau/compiler/nak/calc_instr_deps.rs | 4 +++ src/nouveau/compiler/nak/ir.rs | 29 +++++++++++++++------ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/nouveau/compiler/nak/calc_instr_deps.rs b/src/nouveau/compiler/nak/calc_instr_deps.rs index 2ff0a866d9b..e59bfd6bf63 100644 --- a/src/nouveau/compiler/nak/calc_instr_deps.rs +++ b/src/nouveau/compiler/nak/calc_instr_deps.rs @@ -476,6 +476,10 @@ fn exec_latency(sm: u8, op: &Op) -> u32 { // CCTL.C needs 8, CCTL.I needs 11 11 } + _ if sm < 70 && (op.is_crs_push() || op.is_branch()) => { + // pre-Volta needs a delay for control-flow ops + 13 + } // Op::DepBar(_) => 4, _ => 1, // TODO: co-issue } diff --git a/src/nouveau/compiler/nak/ir.rs b/src/nouveau/compiler/nak/ir.rs index 348f39fa2e8..48a471583a5 100644 --- a/src/nouveau/compiler/nak/ir.rs +++ b/src/nouveau/compiler/nak/ir.rs @@ -5961,6 +5961,26 @@ pub enum Op { } impl_display_for_op!(Op); +impl Op { + pub fn is_crs_push(&self) -> bool { + match self { + Op::SSy(_) | Op::PBk(_) | Op::PCnt(_) => true, + _ => false, + } + } + + pub fn is_branch(&self) -> bool { + match self { + Op::Bra(_) + | Op::Sync(_) + | Op::Brk(_) + | Op::Cont(_) + | Op::Exit(_) => true, + _ => false, + } + } +} + #[derive(Clone, Copy, Eq, Hash, PartialEq)] pub enum PredRef { None, @@ -6254,14 +6274,7 @@ impl Instr { } pub fn is_branch(&self) -> bool { - match &self.op { - Op::Bra(_) - | Op::Sync(_) - | Op::Brk(_) - | Op::Cont(_) - | Op::Exit(_) => true, - _ => false, - } + self.op.is_branch() } pub fn uses_global_mem(&self) -> bool {