vtn/opencl: add clz support
authorDave Airlie <airlied@redhat.com>
Mon, 18 Nov 2019 07:04:35 +0000 (17:04 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 21 Nov 2019 18:37:41 +0000 (04:37 +1000)
This is needed for OpenCL

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/nir/nir_builtin_builder.h
src/compiler/spirv/vtn_opencl.c

index e2fbf02b3eafb55859dcacd1ce224d5741bef13d..0b4d1d0135e2ff72c8056c0b8c373249e6cbd0cb 100644 (file)
@@ -253,6 +253,14 @@ nir_select(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *s)
    return nir_bcsel(b, nir_ieq(b, s, nir_imm_intN_t(b, 0, s->bit_size)), x, y);
 }
 
+static inline nir_ssa_def *
+nir_clz_u(nir_builder *b, nir_ssa_def *a)
+{
+   nir_ssa_def *val;
+   val = nir_isub(b, nir_imm_intN_t(b, a->bit_size - 1, 32), nir_ufind_msb(b, a));
+   return nir_u2u(b, val, a->bit_size);
+}
+
 #ifdef __cplusplus
 }
 #endif
index 165c0de4a7aec69d68c84ac306372348c5a75b00..c41023256d443f9240f530aecf8c7d7f99ac9865 100644 (file)
@@ -185,6 +185,8 @@ handle_special(struct vtn_builder *b, enum OpenCLstd_Entrypoints opcode,
       return nir_rotate(nb, srcs[0], srcs[1]);
    case OpenCLstd_Smoothstep:
       return nir_smoothstep(nb, srcs[0], srcs[1], srcs[2]);
+   case OpenCLstd_Clz:
+      return nir_clz_u(nb, srcs[0]);
    case OpenCLstd_Select:
       return nir_select(nb, srcs[0], srcs[1], srcs[2]);
    case OpenCLstd_Step: