From 9f54d269c20e1c7a668a2ca41ac5ffee76cf60e3 Mon Sep 17 00:00:00 2001 From: Daniel Almeida Date: Fri, 15 Dec 2023 08:21:07 -0600 Subject: [PATCH] nak/sm50 add support for suld Part-of: --- src/nouveau/compiler/nak/encode_sm50.rs | 32 +++++++++++++++++++++++++ src/nouveau/compiler/nak/legalize.rs | 4 ++++ 2 files changed, 36 insertions(+) diff --git a/src/nouveau/compiler/nak/encode_sm50.rs b/src/nouveau/compiler/nak/encode_sm50.rs index a9a650d2d15..d1c2094c3f9 100644 --- a/src/nouveau/compiler/nak/encode_sm50.rs +++ b/src/nouveau/compiler/nak/encode_sm50.rs @@ -1917,6 +1917,37 @@ impl SM50Instr { // TODO: subop? } + fn encode_suld(&mut self, op: &OpSuLd) { + self.set_opcode(0xeb00); + + assert!(op.mask == 0x1 || op.mask == 0x3 || op.mask == 0xf); + self.set_field(20..24, op.mask); + self.set_image_dim(33..36, op.image_dim); + + // mem_eviction_policy not a thing for sm < 70 + + let scope = match op.mem_order { + MemOrder::Constant => MemScope::System, + MemOrder::Weak => MemScope::CTA, + MemOrder::Strong(s) => s, + }; + + self.set_field( + 24..26, + match scope { + MemScope::CTA => 0_u8, + /* SM => 1_u8, */ + MemScope::GPU => 2_u8, + MemScope::System => 3_u8, + }, + ); + + self.set_dst(op.dst); + + self.set_reg_src(8..16, op.coord); + self.set_reg_src(39..47, op.handle); + } + pub fn encode( instr: &Instr, sm: u8, @@ -1981,6 +2012,7 @@ impl SM50Instr { Op::Bra(op) => si.encode_bra(&op, ip, labels), Op::Exit(op) => si.encode_exit(&op), Op::Bar(op) => si.encode_bar(&op), + Op::SuLd(op) => si.encode_suld(&op), _ => panic!("Unhandled instruction {}", instr.op), } diff --git a/src/nouveau/compiler/nak/legalize.rs b/src/nouveau/compiler/nak/legalize.rs index 1b3993436c4..1e4b63c8ab6 100644 --- a/src/nouveau/compiler/nak/legalize.rs +++ b/src/nouveau/compiler/nak/legalize.rs @@ -343,6 +343,10 @@ fn legalize_sm50_instr( Op::Ldc(_) => (), // Nothing to do Op::Copy(_) => (), // Nothing to do Op::INeg(_) => (), /* we unconditionally lower this */ + Op::SuLd(op) => { + copy_alu_src_if_not_reg(b, &mut op.handle, SrcType::GPR); + copy_alu_src_if_not_reg(b, &mut op.coord, SrcType::GPR); + } _ => { let src_types = instr.src_types(); for (i, src) in instr.srcs_mut().iter_mut().enumerate() {