nak: implement ST* and LD* on SM50

LDG was previously encoded, but the opcode and field offsets were incorrect.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26114>
This commit is contained in:
Benjamin Lee 2023-10-24 16:37:24 -07:00 committed by Marge Bot
parent 8a82f426a2
commit cd7ac4b0c5

View file

@ -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),