aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2019-11-18 17:04:35 +1000
committerDave Airlie <[email protected]>2019-11-22 04:37:41 +1000
commit7325f6ac987d295b101372bffcb98799251fe678 (patch)
treebe5895a402f0eff09f3b84de20e7d82e4e56f77a /src
parente3b21dfcb118ec097fb48b5c1415c9d2e87beade (diff)
vtn/opencl: add clz support
This is needed for OpenCL Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/compiler/nir/nir_builtin_builder.h8
-rw-r--r--src/compiler/spirv/vtn_opencl.c2
2 files changed, 10 insertions, 0 deletions
diff --git a/src/compiler/nir/nir_builtin_builder.h b/src/compiler/nir/nir_builtin_builder.h
index e2fbf02b3ea..0b4d1d0135e 100644
--- a/src/compiler/nir/nir_builtin_builder.h
+++ b/src/compiler/nir/nir_builtin_builder.h
@@ -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
diff --git a/src/compiler/spirv/vtn_opencl.c b/src/compiler/spirv/vtn_opencl.c
index 165c0de4a7a..c41023256d4 100644
--- a/src/compiler/spirv/vtn_opencl.c
+++ b/src/compiler/spirv/vtn_opencl.c
@@ -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: