mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 08:58:02 +02:00
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:
parent
8a82f426a2
commit
cd7ac4b0c5
1 changed files with 52 additions and 4 deletions
|
|
@ -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),
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue