From: Caio Marcelo de Oliveira Filho Date: Sat, 18 May 2019 05:52:42 +0000 (-0700) Subject: spirv: Implement NoSignedWrap and NoUnsignedWrap decorations X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5a143965b8f4119501e973d15f7f72673b3ce416;p=mesa.git 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 [v3] Reviewed-by: Jason Ekstrand --- diff --git a/src/compiler/spirv/vtn_alu.c b/src/compiler/spirv/vtn_alu.c index f7fb82774bd..f60d7cddafc 100644 --- a/src/compiler/spirv/vtn_alu.c +++ b/src/compiler/spirv/vtn_alu.c @@ -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; }