From cd679dbc5d8a36e1afef9e52c55b6d7fc9a7d9cf Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Fri, 29 May 2026 22:16:52 -0400 Subject: [PATCH] kraid: Support signless IAdd Signed and unsigned types are only allowed for IADD and not IADD_IMM so it's simpler if we support signless for regular IADD. Part-of: --- src/panfrost/compiler/kraid/data_type.rs | 8 ++++++++ src/panfrost/compiler/kraid/encode_v9.rs | 4 ++-- src/panfrost/compiler/kraid/nir.rs | 2 +- src/panfrost/compiler/kraid/ops.rs | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/panfrost/compiler/kraid/data_type.rs b/src/panfrost/compiler/kraid/data_type.rs index d2390b6fbd9..d88d96ab3d3 100644 --- a/src/panfrost/compiler/kraid/data_type.rs +++ b/src/panfrost/compiler/kraid/data_type.rs @@ -108,6 +108,14 @@ impl DataType { DataType::from_pieces(1, num_type, bits) } + pub const fn i_as_u(self) -> DataType { + let (comps, mut num_type, bits) = self.to_pieces(); + if matches!(num_type, Some(NumericType::Integer)) { + num_type = Some(NumericType::UnsignedInteger); + } + DataType::from_pieces(comps, num_type, bits) + } + pub fn bits(&self) -> Option { NonZeroU8::new(self.to_pieces().2) } diff --git a/src/panfrost/compiler/kraid/encode_v9.rs b/src/panfrost/compiler/kraid/encode_v9.rs index 6c7304ba99b..b750a36f11d 100644 --- a/src/panfrost/compiler/kraid/encode_v9.rs +++ b/src/panfrost/compiler/kraid/encode_v9.rs @@ -459,7 +459,7 @@ impl V9Instr for OpIAdd { if let SrcRef::Imm32(_) = &self.srcs[1].src_ref { IaddImm::get_info(self.dst_type.try_into().ok()?, arch) } else { - Iadd::get_info(self.dst_type.try_into().ok()?, arch) + Iadd::get_info(self.dst_type.i_as_u().try_into().ok()?, arch) } } @@ -473,7 +473,7 @@ impl V9Instr for OpIAdd { }) } else { e.encode(Iadd { - variant: self.dst_type.try_into().unwrap(), + variant: self.dst_type.i_as_u().try_into().unwrap(), dst: op_encode_dst(self, &self.dst), src0: op_encode_src(self, &self.srcs[0]), src1: op_encode_src(self, &self.srcs[1]), diff --git a/src/panfrost/compiler/kraid/nir.rs b/src/panfrost/compiler/kraid/nir.rs index 20bfe3bb7e9..f85c387c596 100644 --- a/src/panfrost/compiler/kraid/nir.rs +++ b/src/panfrost/compiler/kraid/nir.rs @@ -352,7 +352,7 @@ impl<'a> ShaderFromNir<'a> { nir_op_iadd => { b.push_op(OpIAdd { dst: dst.into(), - dst_type: dst_type(NumericType::UnsignedInteger), + dst_type: dst_type(NumericType::Integer), saturate: false, srcs: [srcs(0), srcs(1)], }); diff --git a/src/panfrost/compiler/kraid/ops.rs b/src/panfrost/compiler/kraid/ops.rs index ab2f3231deb..a491ece6cc7 100644 --- a/src/panfrost/compiler/kraid/ops.rs +++ b/src/panfrost/compiler/kraid/ops.rs @@ -205,7 +205,7 @@ impl fmt::Display for OpFCmp { #[repr(C)] #[derive(Clone, Opcode)] -#[variants(dst_type in [S16, U16, V2S16, V2U16, S32, U32])] +#[variants(dst_type in [I16, S16, U16, V2I16, V2S16, V2U16, I32, S32, U32])] pub struct OpIAdd { pub dst: Dst, pub dst_type: DataType,