compiler: Add lowering support for 64-bit saturate operations to software
authorAnuj Phogat <anuj.phogat@gmail.com>
Fri, 10 May 2019 20:22:31 +0000 (13:22 -0700)
committerAnuj Phogat <anuj.phogat@gmail.com>
Wed, 15 May 2019 23:30:30 +0000 (23:30 +0000)
Fixes 7 Khronos GL CTS tests:
KHR-GL45.gpu_shader_fp64.builtin.smoothstep_dvec{double, 2, 3, 4}
KHR-GL45.gpu_shader_fp64.builtin.smoothstep_against_scalar_dvec{2, 3, 4}

Suggested-by: Jason Ekstrand <jason@jlekstrand.net>
Signed-off-by: Anuj Phogat <anuj.phogat@gmail.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/compiler/glsl/float64.glsl
src/compiler/nir/nir_lower_double_ops.c

index 415dde3907c1a3f67f179b80b6e7a1e21a2fdde5..babfad20e9c6b03fe74e70c2c7e7a1c70aa9593c 100644 (file)
@@ -218,6 +218,18 @@ __fge64(uint64_t a, uint64_t b)
    return !__flt64_nonnan(a, b);
 }
 
+uint64_t
+__fsat64(uint64_t __a)
+{
+   if (__flt64(__a, 0ul))
+      return 0ul;
+
+   if (__fge64(__a, 0x3FF0000000000000ul /* 1.0 */))
+      return 0x3FF0000000000000ul;
+
+   return __a;
+}
+
 /* Adds the 64-bit value formed by concatenating `a0' and `a1' to the 64-bit
  * value formed by concatenating `b0' and `b1'.  Addition is modulo 2^64, so
  * any carry out is lost.  The result is broken into two 32-bit pieces which
index 18fe08c7d5dac15e49a23250a86d6aeae6d8f6ea..04ec2a82801ff1b613c7808d31b3802e66828489 100644 (file)
@@ -550,6 +550,9 @@ lower_doubles_instr_to_soft(nir_builder *b, nir_alu_instr *instr,
    case nir_op_ffma:
       name = "__ffma64";
       break;
+   case nir_op_fsat:
+      name = "__fsat64";
+      break;
    default:
       return false;
    }