mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-06-21 01:38:23 +02:00
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:
parent
04e3afaac8
commit
fabffca0bd
3 changed files with 21 additions and 12 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
},
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue