spirv: Implement NoSignedWrap and NoUnsignedWrap decorations

When handling the specified ALU operations, check for the decorations
and set nir_alu_instr no_signed_wrap and no_unsigned_wrap flags accordingly.

v2: Add a glsl_base_type_is_unsigned_integer() helper.  (Karol)

v3: Rename helper to glsl_base_type_is_uint().

v4: Use two flags, so we don't need the helper anymore.  (Connor)

v5: Pass alu directly to handle function.  (Jason)

Reviewed-by: Karol Herbst <kherbst@redhat.com> [v3]
Reviewed-by: Jason Ekstrand's avatarJason Ekstrand <jason@jlekstrand.net>
parent ae372377
......@@ -377,6 +377,24 @@ handle_rounding_mode(struct vtn_builder *b, struct vtn_value *val, int member,
}
}
static void
handle_no_wrap(struct vtn_builder *b, struct vtn_value *val, int member,
const struct vtn_decoration *dec, void *_alu)
{
nir_alu_instr *alu = _alu;
switch (dec->decoration) {
case SpvDecorationNoSignedWrap:
alu->no_signed_wrap = true;
break;
case SpvDecorationNoUnsignedWrap:
alu->no_unsigned_wrap = true;
break;
default:
/* Do nothing. */
break;
}
}
void
vtn_handle_alu(struct vtn_builder *b, SpvOp opcode,
const uint32_t *w, unsigned count)
......@@ -651,6 +669,21 @@ vtn_handle_alu(struct vtn_builder *b, SpvOp opcode,
} /* default */
}
switch (opcode) {
case SpvOpIAdd:
case SpvOpIMul:
case SpvOpISub:
case SpvOpShiftLeftLogical:
case SpvOpSNegate: {
nir_alu_instr *alu = nir_instr_as_alu(val->ssa->def->parent_instr);
vtn_foreach_decoration(b, val, handle_no_wrap, alu);
break;
}
default:
/* Do nothing. */
break;
}
b->nb.exact = b->exact;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment