From cd7ac4b0c5b71f9598822ba6c1581de32c9681b2 Mon Sep 17 00:00:00 2001 From: Benjamin Lee Date: Tue, 24 Oct 2023 16:37:24 -0700 Subject: [PATCH] nak: implement ST* and LD* on SM50 LDG was previously encoded, but the opcode and field offsets were incorrect. Part-of: --- src/nouveau/compiler/nak/encode_sm50.rs | 56 +++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/src/nouveau/compiler/nak/encode_sm50.rs b/src/nouveau/compiler/nak/encode_sm50.rs index a6058e37558..c31f1421ce3 100644 --- a/src/nouveau/compiler/nak/encode_sm50.rs +++ b/src/nouveau/compiler/nak/encode_sm50.rs @@ -709,21 +709,33 @@ impl SM50Instr { } fn encode_ldg(&mut self, op: &OpLd) { - self.set_opcode(0x9c90); + self.set_opcode(0xeed0); self.set_dst(op.dst); self.set_reg_src(8..16, op.addr); - self.set_field(20..52, op.offset); + self.set_field(20..44, op.offset); self.set_mem_access(&op.access); } fn encode_ldl(&mut self, op: &OpLd) { - todo!() + self.set_opcode(0xef40); + + self.set_dst(op.dst); + self.set_reg_src(8..16, op.addr); + self.set_field(20..44, op.offset); + + self.set_mem_access(&op.access); } fn encode_lds(&mut self, op: &OpLd) { - todo!() + self.set_opcode(0xef48); + + self.set_dst(op.dst); + self.set_reg_src(8..16, op.addr); + self.set_field(20..44, op.offset); + + self.set_mem_access(&op.access); } fn encode_ld(&mut self, op: &OpLd) { @@ -734,6 +746,41 @@ impl SM50Instr { } } + fn encode_stg(&mut self, op: &OpSt) { + self.set_opcode(0xeed8); + + self.set_reg_src(0..8, op.data); + self.set_reg_src(8..16, op.addr); + self.set_field(20..44, op.offset); + self.set_mem_access(&op.access); + } + + fn encode_stl(&mut self, op: &OpSt) { + self.set_opcode(0xef50); + + self.set_reg_src(0..8, op.data); + self.set_reg_src(8..16, op.addr); + self.set_field(20..44, op.offset); + self.set_mem_access(&op.access); + } + + fn encode_sts(&mut self, op: &OpSt) { + self.set_opcode(0xef58); + + self.set_reg_src(0..8, op.data); + self.set_reg_src(8..16, op.addr); + self.set_field(20..44, op.offset); + self.set_mem_access(&op.access); + } + + fn encode_st(&mut self, op: &OpSt) { + match op.access.space { + MemSpace::Global(_) => self.encode_stg(op), + MemSpace::Local => self.encode_stl(op), + MemSpace::Shared => self.encode_sts(op), + } + } + fn encode_lop2(&mut self, op: &OpLop2) { if let Some(imm32) = op.srcs[1].as_imm_not_i20() { self.set_opcode(0x0400); @@ -1714,6 +1761,7 @@ impl SM50Instr { Op::Brev(op) => si.encode_brev(&op), Op::Prmt(op) => si.encode_prmt(&op), Op::Ld(op) => si.encode_ld(&op), + Op::St(op) => si.encode_st(&op), Op::Lop2(op) => si.encode_lop2(&op), Op::Shf(op) => si.encode_shf(&op), Op::F2F(op) => si.encode_f2f(&op),