[Mesa-dev] [PATCH 15/28] nir: support for denorm flush-to-zero in nir_lower_double_ops
Samuel Iglesias Gonsálvez
siglesias at igalia.com
Mon Dec 10 12:35:22 UTC 2018
On 05/12/2018 19:35, Connor Abbott wrote:
> All the current lowerings produce their result using a floating-point
> multiply or add, so denorms should already be flushed (e.g.
> nir_op_frcp), or they never produce a denorm (e.g. nir_op_ftrunc), so
> I don't think this is necessary.
This fix is for nir_op_fsqrt, where we have this code:
if (sqrt) {
/* Here, the special cases we need to handle are
* 0 -> 0 and
* +inf -> +inf
*/
res = nir_bcsel(b, nir_ior(b, nir_feq(b, src, nir_imm_double(b, 0.0)),
nir_feq(b, src, nir_imm_double(b,
INFINITY))),
src, res);
}
Notice that we can return 'src', which is not flushed. We fail 3 tests
because of this.
If you agree, I will fix it here instead for all the double lowerings.
Sam
> On Wed, Dec 5, 2018 at 4:56 PM Samuel Iglesias Gonsálvez
> <siglesias at igalia.com> wrote:
>>
>> Signed-off-by: Samuel Iglesias Gonsálvez <siglesias at igalia.com>
>> ---
>> src/compiler/nir/nir_lower_double_ops.c | 12 ++++++++++++
>> 1 file changed, 12 insertions(+)
>>
>> diff --git a/src/compiler/nir/nir_lower_double_ops.c b/src/compiler/nir/nir_lower_double_ops.c
>> index b3543bc6963..97b825d2fdb 100644
>> --- a/src/compiler/nir/nir_lower_double_ops.c
>> +++ b/src/compiler/nir/nir_lower_double_ops.c
>> @@ -558,6 +558,18 @@ lower_doubles_instr(nir_alu_instr *instr, nir_lower_doubles_options options)
>> unreachable("unhandled opcode");
>> }
>>
>> + bool denorm_flush_to_zero =
>> + bld.shader->info.shader_float_controls_execution_mode & SHADER_DENORM_FLUSH_TO_ZERO_FP64;
>> + if (denorm_flush_to_zero) {
>> + /* TODO: add support for flushing negative denorms to -0.0 */
>> + /* Flush to zero if the result value is a denorm */
>> + result = nir_bcsel(&bld,
>> + nir_flt(&bld, nir_fabs(&bld, result),
>> + nir_imm_double(&bld, 2.22507385850720138309023271733e-308)),
>> + nir_imm_double(&bld, 0.0),
>> + result);
>> + }
>> +
>> nir_ssa_def_rewrite_uses(&instr->dest.dest.ssa, nir_src_for_ssa(result));
>> nir_instr_remove(&instr->instr);
>> return true;
>> --
>> 2.19.1
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20181210/bb1ac295/attachment.sig>
More information about the mesa-dev
mailing list