From: Rob Clark <robdcl...@gmail.com> changes by Karol: v2: make compatible with 64 bit floats fix isfinite v3: use snake_case.
Signed-off-by: Karol Herbst <kher...@redhat.com> --- src/compiler/spirv/vtn_alu.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/compiler/spirv/vtn_alu.c b/src/compiler/spirv/vtn_alu.c index b1492c1501a..ea25d4bcbdc 100644 --- a/src/compiler/spirv/vtn_alu.c +++ b/src/compiler/spirv/vtn_alu.c @@ -583,6 +583,38 @@ vtn_handle_alu(struct vtn_builder *b, SpvOp opcode, break; } + case SpvOpIsFinite: { + nir_ssa_def *inf = nir_imm_floatN_t(&b->nb, INFINITY, src[0]->bit_size); + nir_ssa_def *is_number = nir_feq(&b->nb, src[0], src[0]); + nir_ssa_def *is_not_inf = nir_ine(&b->nb, nir_fabs(&b->nb, src[0]), inf); + val->ssa->def = nir_iand(&b->nb, is_number, is_not_inf); + break; + } + + case SpvOpIsNormal: { + unsigned bit_size = src[0]->bit_size; + + uint32_t m; + if (bit_size == 64) + m = 11; + else if (bit_size == 32) + m = 8; + else if (bit_size == 16) + m = 5; + else + assert(!"unknown float type"); + + nir_ssa_def *shift = nir_imm_int(&b->nb, bit_size - m - 1); + nir_ssa_def *abs = nir_fabs(&b->nb, src[0]); + nir_ssa_def *exp = nir_iadd(&b->nb, + nir_ushr(&b->nb, abs, shift), + nir_imm_intN_t(&b->nb, -1, bit_size)); + val->ssa->def = nir_ult(&b->nb, + exp, + nir_imm_intN_t(&b->nb, (1 << m) - 2, bit_size)); + break; + } + case SpvOpFUnordEqual: case SpvOpFUnordNotEqual: case SpvOpFUnordLessThan: -- 2.19.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev