nak: implement SHFL on SM50

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26114>
This commit is contained in:
Benjamin Lee 2023-11-13 23:10:52 -08:00 committed by Marge Bot
parent 2d63f3dad6
commit 8fd7ee2a4f
2 changed files with 47 additions and 0 deletions

View file

@ -310,6 +310,47 @@ impl SM50Instr {
self.set_pred_src(39..42, 42, op.cond);
}
fn encode_shfl(&mut self, op: &OpShfl) {
self.set_opcode(0xef10);
self.set_dst(op.dst);
self.set_pred_dst(48..51, op.in_bounds);
self.set_reg_src(8..16, op.src);
match op.lane.src_ref {
SrcRef::Zero | SrcRef::Reg(_) => {
self.set_bit(28, false);
self.set_reg_src(20..28, op.lane);
}
SrcRef::Imm32(imm) => {
self.set_bit(28, true);
self.set_field(20..25, imm & 0x1f);
}
lane => panic!("unsupported lane src type for SHFL: {lane}"),
}
match op.c.src_ref {
SrcRef::Zero | SrcRef::Reg(_) => {
self.set_bit(29, false);
self.set_reg_src(39..47, op.c);
}
SrcRef::Imm32(imm) => {
self.set_bit(29, true);
self.set_field(34..47, imm & 0x1f1f);
}
c => panic!("unsupported c src type for SHFL: {c}"),
}
self.set_field(
30..32,
match op.op {
ShflOp::Idx => 0u8,
ShflOp::Up => 1u8,
ShflOp::Down => 2u8,
ShflOp::Bfly => 3u8,
},
);
}
fn encode_psetp(&mut self, op: &OpPSetP) {
self.set_opcode(0x5090);
@ -1682,6 +1723,7 @@ impl SM50Instr {
Op::IAdd2(op) => si.encode_iadd2(&op),
Op::Mov(op) => si.encode_mov(&op),
Op::Sel(op) => si.encode_sel(&op),
Op::Shfl(op) => si.encode_shfl(&op),
Op::PSetP(op) => si.encode_psetp(&op),
Op::SuSt(op) => si.encode_sust(&op),
Op::S2R(op) => si.encode_s2r(&op),

View file

@ -140,6 +140,11 @@ fn legalize_sm50_instr(
Op::Sel(op) => {
copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR);
}
Op::Shfl(op) => {
copy_src_if_not_reg(b, &mut op.src, RegFile::GPR);
copy_src_if_cbuf(b, &mut op.lane, RegFile::GPR);
copy_src_if_cbuf(b, &mut op.c, RegFile::GPR);
}
Op::IAdd2(op) => {
copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR);
}