nir/lower_int64: Enable lowering of 64-bit float to 64-bit integer conversions.
authorFrancisco Jerez <currojerez@riseup.net>
Mon, 17 Oct 2022 21:00:59 +0000 (14:00 -0700)
committerMarge Bot <emma+marge@anholt.net>
Sat, 29 Oct 2022 19:45:44 +0000 (19:45 +0000)
The existing code for this appears to work okay for conversions
involving 64-bit floats, relax the assert and enable the lowering
path.  This fixes 64-bit float to 64-bit integer integer conversions
on devices that have native support for 64-bit floats but lack 64-bit
integer support, like Intel MTL hardware.

Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19128>

src/compiler/nir/nir_lower_int64.c

index da393c8..10db7cd 100644 (file)
@@ -754,7 +754,7 @@ lower_2f(nir_builder *b, nir_ssa_def *x, unsigned dest_bit_size,
 static nir_ssa_def *
 lower_f2(nir_builder *b, nir_ssa_def *x, bool dst_is_signed)
 {
-   assert(x->bit_size == 16 || x->bit_size == 32);
+   assert(x->bit_size == 16 || x->bit_size == 32 || x->bit_size == 64);
    nir_ssa_def *x_sign = NULL;
 
    if (dst_is_signed)
@@ -977,10 +977,6 @@ lower_int64_alu_instr(nir_builder *b, nir_alu_instr *alu)
       return lower_2f(b, src[0], nir_dest_bit_size(alu->dest.dest), false);
    case nir_op_f2i64:
    case nir_op_f2u64:
-      /* We don't support f64toi64 (yet?). */
-      if (src[0]->bit_size > 32)
-         return false;
-
       return lower_f2(b, src[0], alu->op == nir_op_f2i64);
    default:
       unreachable("Invalid ALU opcode to lower");