diff --git a/src/nouveau/compiler/nak_encode_tu102.rs b/src/nouveau/compiler/nak_encode_tu102.rs index 1d7c9cdafa7..f0a6b4d8c47 100644 --- a/src/nouveau/compiler/nak_encode_tu102.rs +++ b/src/nouveau/compiler/nak_encode_tu102.rs @@ -197,6 +197,22 @@ fn encode_mov(bs: &mut impl BitSetMut, instr: &Instr) { bs.set_field(72..76, 0xf_u32 /* TODO: Quad lanes */); } +fn encode_iadd3(bs: &mut impl BitSetMut, instr: &Instr) { + encode_alu(bs, instr, 0x010); + + bs.set_field(81..84, 7_u32); /* pred */ + bs.set_field(84..87, 7_u32); /* pred */ +} + +fn encode_shl(bs: &mut impl BitSetMut, instr: &Instr) { + encode_alu(bs, instr, 0x019); + + bs.set_field(73..75, 3_u32 /* U32 */); + bs.set_bit(75, true /* W? */); + bs.set_bit(76, false /* Left */); + bs.set_bit(80, false /* HI */); +} + fn encode_ald(bs: &mut impl BitSetMut, instr: &Instr, attr: &AttrAccess) { encode_instr_base(bs, &instr, 0x321); @@ -299,6 +315,8 @@ pub fn encode_instr(instr: &Instr) -> [u32; 4] { match &instr.op { Opcode::S2R(i) => encode_s2r(&mut bs, instr, *i), Opcode::MOV => encode_mov(&mut bs, instr), + Opcode::IADD3 => encode_iadd3(&mut bs, instr), + Opcode::SHL => encode_shl(&mut bs, instr), Opcode::ALD(a) => encode_ald(&mut bs, instr, &a), Opcode::AST(a) => encode_ast(&mut bs, instr, &a), Opcode::LD(a) => encode_ld(&mut bs, instr, a), diff --git a/src/nouveau/compiler/nak_from_nir.rs b/src/nouveau/compiler/nak_from_nir.rs index a0198ddd89a..e5cf2d82854 100644 --- a/src/nouveau/compiler/nak_from_nir.rs +++ b/src/nouveau/compiler/nak_from_nir.rs @@ -85,6 +85,12 @@ impl<'a> ShaderFromNir<'a> { nir_op_fadd => { self.instrs.push(Instr::new_fadd(dst, srcs[0], srcs[1])); } + nir_op_iadd => { + self.instrs.push(Instr::new_iadd(dst, srcs[0], srcs[1])); + } + nir_op_ishl => { + self.instrs.push(Instr::new_shl(dst, srcs[0], srcs[1])); + } nir_op_mov => { self.instrs.push(Instr::new_mov(dst, srcs[0])); } diff --git a/src/nouveau/compiler/nak_ir.rs b/src/nouveau/compiler/nak_ir.rs index 2d1fe188521..e4747e4daed 100644 --- a/src/nouveau/compiler/nak_ir.rs +++ b/src/nouveau/compiler/nak_ir.rs @@ -628,6 +628,14 @@ impl Instr { Instr::new(Opcode::FADD, slice::from_ref(&dst), &[x, y]) } + pub fn new_iadd(dst: Dst, x: Src, y: Src) -> Instr { + Instr::new(Opcode::IADD3, slice::from_ref(&dst), &[Src::Zero, x, y]) + } + + pub fn new_shl(dst: Dst, x: Src, shift: Src) -> Instr { + Instr::new(Opcode::SHL, slice::from_ref(&dst), &[x, shift]) + } + pub fn new_s2r(dst: Dst, idx: u8) -> Instr { Instr::new(Opcode::S2R(idx), slice::from_ref(&dst), &[]) } @@ -779,6 +787,9 @@ pub enum Opcode { FMNMX, FMUL, + IADD3, + SHL, + S2R(u8), MOV, VEC, @@ -803,6 +814,8 @@ impl fmt::Display for Opcode { Opcode::FFMA => write!(f, "FFMA"), Opcode::FMNMX => write!(f, "FMNMX"), Opcode::FMUL => write!(f, "FMUL"), + Opcode::IADD3 => write!(f, "IADD3"), + Opcode::SHL => write!(f, "SHL"), Opcode::S2R(i) => write!(f, "S2R({})", i), Opcode::MOV => write!(f, "MOV"), Opcode::VEC => write!(f, "VEC"),