diff --git a/src/panfrost/compiler/kraid/nir.rs b/src/panfrost/compiler/kraid/nir.rs index 319d7ac4864..d33ef02f8ed 100644 --- a/src/panfrost/compiler/kraid/nir.rs +++ b/src/panfrost/compiler/kraid/nir.rs @@ -349,6 +349,14 @@ impl<'a> ShaderFromNir<'a> { accum_op: CmpAccumOp::None, }); } + nir_op_iadd => { + b.push_op(OpIAdd { + dst: dst.into(), + dst_type: dst_type(NumericType::UnsignedInteger), + saturate: false, + srcs: [srcs(0), srcs(1)], + }); + } _ => panic!("Unsupported ALU instruction: {}", alu.info().name()), } } diff --git a/src/panfrost/compiler/kraid/ops.rs b/src/panfrost/compiler/kraid/ops.rs index ebf513fa641..2b68b64445d 100644 --- a/src/panfrost/compiler/kraid/ops.rs +++ b/src/panfrost/compiler/kraid/ops.rs @@ -179,6 +179,27 @@ impl fmt::Display for OpFCmp { } } +#[repr(C)] +#[derive(Clone, Opcode)] +#[variants(dst_type in [S16, U16, V2S16, V2U16, S32, U32])] +pub struct OpIAdd { + pub dst: Dst, + pub dst_type: DataType, + pub saturate: bool, + pub srcs: [Src; 2], +} + +impl fmt::Display for OpIAdd { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let sat = if self.saturate { ".sat" } else { "" }; + write!( + f, + "{} = IADD.{}{sat} {} {}", + &self.dst, self.dst_type, &self.srcs[0], &self.srcs[1], + ) + } +} + #[repr(C)] #[derive(Clone, Opcode)] pub struct OpMkVecV2I8 { @@ -244,6 +265,7 @@ pub enum Op { End(OpEnd), FAdd(OpFAdd), FCmp(OpFCmp), + IAdd(OpIAdd), MkVecV2I8(OpMkVecV2I8), MkVecV4I8(OpMkVecV4I8), Mov(OpMov),