nir/builder: Handle f2b conversions specially in nir_type_convert
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 2 Nov 2022 01:28:46 +0000 (18:28 -0700)
committerMarge Bot <emma+marge@anholt.net>
Fri, 3 Feb 2023 22:39:57 +0000 (22:39 +0000)
No shader-db or fossil-db changes on any Intel platform.

Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20509>

src/compiler/nir/nir_builder.c

index 7e2bbec..711208e 100644 (file)
@@ -552,21 +552,32 @@ nir_type_convert(nir_builder *b,
    const nir_alu_type src_base =
       (nir_alu_type) nir_alu_type_get_base_type(src_type);
 
-   /* b2b and f2b use the regular type conversion path, but i2b is implemented
-    * as src != 0.
+   /* b2b uses the regular type conversion path, but i2b and f2b are
+    * implemented as src != 0.
     */
-   if (dst_base == nir_type_bool && (src_base == nir_type_int ||
-                                     src_base == nir_type_uint)) {
+   if (dst_base == nir_type_bool && src_base != nir_type_bool) {
       nir_op opcode;
 
       const unsigned dst_bit_size = nir_alu_type_get_type_size(dest_type);
 
-      switch (dst_bit_size) {
-      case 1:  opcode = nir_op_ine;   break;
-      case 8:  opcode = nir_op_ine8;  break;
-      case 16: opcode = nir_op_ine16; break;
-      case 32: opcode = nir_op_ine32; break;
-      default: unreachable("Invalid Boolean size.");
+      if (src_base == nir_type_float) {
+         switch (dst_bit_size) {
+         case 1:  opcode = nir_op_fneu;   break;
+         case 8:  opcode = nir_op_fneu8;  break;
+         case 16: opcode = nir_op_fneu16; break;
+         case 32: opcode = nir_op_fneu32; break;
+         default: unreachable("Invalid Boolean size.");
+         }
+      } else {
+         assert(src_base == nir_type_int || src_base == nir_type_uint);
+
+         switch (dst_bit_size) {
+         case 1:  opcode = nir_op_ine;   break;
+         case 8:  opcode = nir_op_ine8;  break;
+         case 16: opcode = nir_op_ine16; break;
+         case 32: opcode = nir_op_ine32; break;
+         default: unreachable("Invalid Boolean size.");
+         }
       }
 
       return nir_build_alu(b, opcode, src,