From fabffca0bd33e91c565ba4bf21980b00dc932ae8 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 15 Jun 2026 22:56:22 -0400 Subject: [PATCH] kraid/swizzle: Take a src_bytes param in Swizzle::bytes_read() Part-of: --- src/panfrost/compiler/kraid/small_constants.rs | 2 +- src/panfrost/compiler/kraid/swizzle.rs | 13 ++++++++++--- src/panfrost/compiler/kraid/validate.rs | 18 ++++++++++-------- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/panfrost/compiler/kraid/small_constants.rs b/src/panfrost/compiler/kraid/small_constants.rs index 4fa74749a8a..69047f36bfd 100644 --- a/src/panfrost/compiler/kraid/small_constants.rs +++ b/src/panfrost/compiler/kraid/small_constants.rs @@ -19,7 +19,7 @@ fn try_lower_src(src: &mut Src, sc_table: &[SmallConstant]) -> bool { }; let imm32 = u32::from(imm32); - let imm_bytes_read = src.swizzle.bytes_read(); + let imm_bytes_read = src.swizzle.bytes_read(4); if imm_bytes_read.count_ones() == 1 { let imm_byte = imm_bytes_read.trailing_zeros(); diff --git a/src/panfrost/compiler/kraid/swizzle.rs b/src/panfrost/compiler/kraid/swizzle.rs index 1b6196449c6..0dd41694dff 100644 --- a/src/panfrost/compiler/kraid/swizzle.rs +++ b/src/panfrost/compiler/kraid/swizzle.rs @@ -644,16 +644,23 @@ impl Swizzle { Some(folded) } - pub fn bytes_read(&self) -> u8 { + pub fn bytes_read(&self, src_bytes: u8) -> u8 { let mut bytes = 0_u8; - if self.is_word_swizzle() { + if self.is_none() { + if src_bytes >= 8 { + bytes = 0xff; + } else { + bytes = !((!0_u8) << src_bytes); + } + } else if self.is_word_swizzle() { + debug_assert_eq!(src_bytes, 8); for i in 0..2 { if let Some(w) = self.word(i).unwrap().word_idx() { bytes |= 0xf << (w * 4); } } } else { - for i in 0..4 { + for i in 0..src_bytes.min(4) { if let Some(b) = self.byte(i).unwrap().byte_idx() { bytes |= 1 << b; } diff --git a/src/panfrost/compiler/kraid/validate.rs b/src/panfrost/compiler/kraid/validate.rs index 3eb9b808d24..7316df6fbe3 100644 --- a/src/panfrost/compiler/kraid/validate.rs +++ b/src/panfrost/compiler/kraid/validate.rs @@ -31,30 +31,32 @@ fn validate_instr(instr: &Instr, ssa_vals: &mut FxHashSet) { assert!(src.swizzle == Swizzle::NONE); } else { let src_ref_byte_mask = u8::MAX >> (8 - src_ref_bytes); - assert!(src.swizzle.bytes_read() & !src_ref_byte_mask == 0); + let swizzle_byte_mask = + src.swizzle.bytes_read(src_ref_bytes); + assert!(swizzle_byte_mask & !src_ref_byte_mask == 0); } } SrcRef::Reg(reg) => match reg.range { RegRange::Byte0 => { - assert!(src.swizzle.bytes_read() & !0b0001 == 0); + assert!(src.swizzle.bytes_read(4) & !0b0001 == 0); } RegRange::Byte1 => { - assert!(src.swizzle.bytes_read() & !0b0010 == 0); + assert!(src.swizzle.bytes_read(4) & !0b0010 == 0); } RegRange::Byte2 => { - assert!(src.swizzle.bytes_read() & !0b0100 == 0); + assert!(src.swizzle.bytes_read(4) & !0b0100 == 0); } RegRange::Byte3 => { - assert!(src.swizzle.bytes_read() & !0b1000 == 0); + assert!(src.swizzle.bytes_read(4) & !0b1000 == 0); } RegRange::Half0 => { - assert!(src.swizzle.bytes_read() & !0b0011 == 0); + assert!(src.swizzle.bytes_read(4) & !0b0011 == 0); } RegRange::Half1 => { - assert!(src.swizzle.bytes_read() & !0b1100 == 0); + assert!(src.swizzle.bytes_read(4) & !0b1100 == 0); } RegRange::Regs(n) => match n { - 1 => assert!(src.swizzle.bytes_read() & !0x0f == 0), + 1 => assert!(src.swizzle.bytes_read(n * 4) & !0x0f == 0), 2 => (), // Not much we can assert here _ => assert!(src.swizzle == Swizzle::NONE), },