diff --git a/src/nouveau/compiler/nak/encode_sm50.rs b/src/nouveau/compiler/nak/encode_sm50.rs index 211998470d5..180e3f072cb 100644 --- a/src/nouveau/compiler/nak/encode_sm50.rs +++ b/src/nouveau/compiler/nak/encode_sm50.rs @@ -2037,6 +2037,36 @@ impl SM50Instr { self.set_reg_src(8..16, op.idx); } + fn encode_out(&mut self, op: &OpOut) { + match &op.stream.src_ref { + SrcRef::Imm32(imm32) => { + self.set_opcode(0xf6e0); + self.set_src_imm_i20(20..39, 56, *imm32); + } + SrcRef::CBuf(cbuf) => { + self.set_opcode(0xebe0); + self.set_src_cb(20..39, cbuf); + } + SrcRef::Zero | SrcRef::Reg(_) => { + self.set_opcode(0xfbe0); + self.set_reg_src(20..28, op.stream); + } + src => panic!("Unsupported src type for OUT: {src}"), + } + + self.set_field( + 39..41, + match op.out_type { + OutType::Emit => 1_u8, + OutType::Cut => 2_u8, + OutType::EmitThenCut => 3_u8, + }, + ); + + self.set_reg_src(8..16, op.handle); + self.set_dst(op.dst); + } + pub fn encode( instr: &Instr, sm: u8, @@ -2108,6 +2138,7 @@ impl SM50Instr { Op::CS2R(op) => si.encode_cs2r(op), Op::Nop(_) => si.encode_nop(), Op::Isberd(op) => si.encode_isberd(&op), + Op::Out(op) => si.encode_out(&op), _ => panic!("Unhandled instruction {}", instr.op), } diff --git a/src/nouveau/compiler/nak/legalize.rs b/src/nouveau/compiler/nak/legalize.rs index a3847cb9714..d943f9aa230 100644 --- a/src/nouveau/compiler/nak/legalize.rs +++ b/src/nouveau/compiler/nak/legalize.rs @@ -354,6 +354,10 @@ fn legalize_sm50_instr( copy_alu_src_if_not_reg(b, &mut op.handle, SrcType::GPR); copy_alu_src_if_not_reg(b, &mut op.data, SrcType::GPR); } + Op::Out(op) => { + copy_alu_src_if_not_reg(b, &mut op.handle, SrcType::GPR); + copy_alu_src_if_i20_overflow(b, &mut op.stream, SrcType::ALU); + } _ => { let src_types = instr.src_types(); for (i, src) in instr.srcs_mut().iter_mut().enumerate() {