From 95f368a105af8b333f8ec543b5f5a97e4e2a9086 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Tue, 24 Oct 2023 12:44:55 -0500 Subject: [PATCH] nak: Add OpBreak Part-of: --- src/nouveau/compiler/nak_encode_sm75.rs | 7 +++++++ src/nouveau/compiler/nak_ir.rs | 19 ++++++++++++++++++- src/nouveau/compiler/nak_legalize.rs | 2 +- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/nouveau/compiler/nak_encode_sm75.rs b/src/nouveau/compiler/nak_encode_sm75.rs index ac82d22bf20..c8552e2f0f3 100644 --- a/src/nouveau/compiler/nak_encode_sm75.rs +++ b/src/nouveau/compiler/nak_encode_sm75.rs @@ -1615,6 +1615,12 @@ impl SM75Instr { self.set_bit(84, op.clear); } + fn encode_break(&mut self, op: &OpBreak) { + self.set_opcode(0x942); + self.set_field(16..20, op.bar.idx()); + self.set_pred_src(87..90, 90, op.cond); + } + fn encode_bssy( &mut self, op: &OpBSSy, @@ -1824,6 +1830,7 @@ impl SM75Instr { Op::Ipa(op) => si.encode_ipa(&op), Op::MemBar(op) => si.encode_membar(&op), Op::BMov(op) => si.encode_bmov(&op), + Op::Break(op) => si.encode_break(&op), Op::BSSy(op) => si.encode_bssy(&op, ip, labels), Op::BSync(op) => si.encode_bsync(&op), Op::Bra(op) => si.encode_bra(&op, ip, labels), diff --git a/src/nouveau/compiler/nak_ir.rs b/src/nouveau/compiler/nak_ir.rs index 8e1f7e47185..17500f95a93 100644 --- a/src/nouveau/compiler/nak_ir.rs +++ b/src/nouveau/compiler/nak_ir.rs @@ -3515,6 +3515,21 @@ impl fmt::Display for OpBMov { } } +#[repr(C)] +#[derive(SrcsAsSlice, DstsAsSlice)] +pub struct OpBreak { + pub bar: BarRef, + + #[src_type(Pred)] + pub cond: Src, +} + +impl fmt::Display for OpBreak { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "BREAK {} {}", self.cond, self.bar) + } +} + #[repr(C)] #[derive(SrcsAsSlice, DstsAsSlice)] pub struct OpBSSy { @@ -4108,6 +4123,7 @@ pub enum Op { Ipa(OpIpa), MemBar(OpMemBar), BMov(OpBMov), + Break(OpBreak), BSSy(OpBSSy), BSync(OpBSync), Bra(OpBra), @@ -4462,6 +4478,7 @@ impl Instr { | Op::AtomCas(_) | Op::MemBar(_) | Op::Kill(_) + | Op::Break(_) | Op::BSSy(_) | Op::BSync(_) | Op::Bra(_) @@ -4541,7 +4558,7 @@ impl Instr { | Op::MemBar(_) => false, // Control-flow ops - Op::BMov(_) | Op::BSSy(_) | Op::BSync(_) => false, + Op::BMov(_) | Op::Break(_) | Op::BSSy(_) | Op::BSync(_) => false, Op::Bra(_) | Op::Exit(_) => true, Op::WarpSync(_) => false, diff --git a/src/nouveau/compiler/nak_legalize.rs b/src/nouveau/compiler/nak_legalize.rs index 92c65cb7957..952a0bd6f23 100644 --- a/src/nouveau/compiler/nak_legalize.rs +++ b/src/nouveau/compiler/nak_legalize.rs @@ -260,7 +260,7 @@ fn legalize_instr(b: &mut impl SSABuilder, instr: &mut Instr) { copy_src_if_not_reg(b, &mut op.handle, RegFile::GPR); } Op::Ldc(_) => (), // Nothing to do - Op::BMov(_) | Op::BSSy(_) | Op::BSync(_) => (), // Nothing to do + Op::BMov(_) | Op::Break(_) | Op::BSSy(_) | Op::BSync(_) => (), Op::Copy(_) => (), // Nothing to do _ => { let src_types = instr.src_types();