Module: Mesa Branch: main Commit: ed535c9d982da1fb36b8feef8b0da7d2c149dbbd URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ed535c9d982da1fb36b8feef8b0da7d2c149dbbd
Author: Faith Ekstrand <faith.ekstr...@collabora.com> Date: Thu Nov 23 11:06:29 2023 -0600 nak: Implement integer conversions Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26348> --- src/nouveau/compiler/nak_from_nir.rs | 52 +++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/src/nouveau/compiler/nak_from_nir.rs b/src/nouveau/compiler/nak_from_nir.rs index 7da20e90d2f..71ef1f30be3 100644 --- a/src/nouveau/compiler/nak_from_nir.rs +++ b/src/nouveau/compiler/nak_from_nir.rs @@ -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 {