From 93ddaa90b3d34dcab693e2ec7586270e9eb3b197 Mon Sep 17 00:00:00 2001 From: Lorenzo Rossi Date: Mon, 19 May 2025 21:05:04 +0200 Subject: [PATCH] nak/sm32: Add encodings for OpLdSharedLock and OpStSCheckUnlock Part-of: --- src/nouveau/compiler/nak/sm32.rs | 39 +++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/nouveau/compiler/nak/sm32.rs b/src/nouveau/compiler/nak/sm32.rs index 4202bed622e..feb923f987b 100644 --- a/src/nouveau/compiler/nak/sm32.rs +++ b/src/nouveau/compiler/nak/sm32.rs @@ -2276,7 +2276,6 @@ impl SM32Op for OpLd { fn encode(&self, e: &mut SM32Encoder<'_>) { // Missing: - // 0x774 for load locked // 0x7c8 for indirect const load match self.access.space { MemSpace::Global(_) => { @@ -2338,14 +2337,28 @@ impl SM32Op for OpLdc { } } +impl SM32Op for OpLdSharedLock { + fn legalize(&mut self, b: &mut LegalizeBuilder) { + legalize_ext_instr(self, b); + } + + fn encode(&self, e: &mut SM32Encoder<'_>) { + e.set_opcode(0x774, 2); + e.set_dst(&self.dst); + e.set_reg_src(10..18, &self.addr); + e.set_field(23..47, self.offset); + + e.set_pred_dst(48..51, &self.locked); + e.set_mem_type(51..54, self.mem_type); + } +} + impl SM32Op for OpSt { fn legalize(&mut self, b: &mut LegalizeBuilder) { legalize_ext_instr(self, b); } fn encode(&self, e: &mut SM32Encoder<'_>) { - // Missing: - // 0x784 for store locked match self.access.space { MemSpace::Global(_) => { e.set_opcode(0xe00, 0); @@ -2372,6 +2385,24 @@ impl SM32Op for OpSt { } } +impl SM32Op for OpStSCheckUnlock { + fn legalize(&mut self, b: &mut LegalizeBuilder) { + legalize_ext_instr(self, b); + } + + fn encode(&self, e: &mut SM32Encoder<'_>) { + e.set_opcode(0x784, 2); + + e.set_reg_src(2..10, &self.data); + e.set_reg_src(10..18, &self.addr); + + e.set_field(23..47, self.offset); + // 47..49: cache hints (.ca, .cg, .lu, .cv) + e.set_pred_dst(48..51, &self.locked); + e.set_mem_type(51..54, self.mem_type); + } +} + fn atom_src_as_ssa( b: &mut LegalizeBuilder, src: &Src, @@ -3024,7 +3055,9 @@ macro_rules! as_sm50_op_match { Op::Txq(op) => op, Op::Ld(op) => op, Op::Ldc(op) => op, + Op::LdSharedLock(op) => op, Op::St(op) => op, + Op::StSCheckUnlock(op) => op, Op::Atom(op) => op, Op::AL2P(op) => op, Op::ALd(op) => op,