kraid/swizzle: Take a src_bytes param in Swizzle::bytes_read()

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/42274>
This commit is contained in:
Faith Ekstrand 2026-06-15 22:56:22 -04:00 committed by Marge Bot
parent 04e3afaac8
commit fabffca0bd
3 changed files with 21 additions and 12 deletions

View file

@ -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();

View file

@ -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;
}

View file

@ -31,30 +31,32 @@ fn validate_instr(instr: &Instr, ssa_vals: &mut FxHashSet<SSAValue>) {
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),
},