nak: Implement integer conversions

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26348>
This commit is contained in:
Faith Ekstrand 2023-11-23 11:06:29 -06:00 committed by Faith Ekstrand
parent 3b3f251471
commit ed535c9d98

View file

@ -460,7 +460,7 @@ impl<'a> ShaderFromNir<'a> {
assert!(alu.get_src(0).bit_size() == 32);
b.isetp(IntCmpType::I32, IntCmpOp::Ne, srcs[0], 0.into())
}
nir_op_b2b32 | nir_op_b2i32 => {
nir_op_b2b32 | nir_op_b2i8 | nir_op_b2i16 | nir_op_b2i32 => {
b.sel(srcs[0].bnot(), 0.into(), 1.into())
}
nir_op_b2f32 => {
@ -734,6 +734,56 @@ impl<'a> ShaderFromNir<'a> {
});
dst
}
nir_op_i2i8 | nir_op_i2i16 | nir_op_i2i32 | nir_op_i2i64
| nir_op_u2u8 | nir_op_u2u16 | nir_op_u2u32 | nir_op_u2u64 => {
let src_bits = alu.get_src(0).src.bit_size();
let dst_bits = alu.def.bit_size();
let mut prmt = [0_u8; 8];
match alu.op {
nir_op_i2i8 | nir_op_i2i16
| nir_op_i2i32 | nir_op_i2i64 => {
let sign = ((src_bits / 8) - 1) | 0x8;
for i in 0..8 {
if i < (src_bits / 8) {
prmt[usize::from(i)] = i;
} else {
prmt[usize::from(i)] = sign;
}
}
}
nir_op_u2u8 | nir_op_u2u16
| nir_op_u2u32 | nir_op_u2u64 => {
for i in 0..8 {
if i < (src_bits / 8) {
prmt[usize::from(i)] = i;
} else {
prmt[usize::from(i)] = 4;
}
}
}
_ => panic!("Invalid integer conversion: {}", alu.op),
}
let prmt_lo: [u8; 4] = prmt[0..4].try_into().unwrap();
let prmt_hi: [u8; 4] = prmt[4..8].try_into().unwrap();
let src = srcs[0].as_ssa().unwrap();
if src_bits == 64 {
if dst_bits == 64 {
*src
} else {
b.prmt(src[0].into(), src[1].into(), prmt_lo)
}
} else {
if dst_bits == 64 {
let lo = b.prmt(src[0].into(), 0.into(), prmt_lo);
let hi = b.prmt(src[0].into(), 0.into(), prmt_hi);
[lo[0], hi[0]].into()
} else {
b.prmt(src[0].into(), 0.into(), prmt_lo)
}
}
}
nir_op_iabs => b.iabs(srcs[0]),
nir_op_iadd => {
if alu.def.bit_size == 64 {