From 7b84319ec431d28d07472f9fc4d63cefdd96ec75 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Sun, 28 Jul 2024 12:00:00 -0500 Subject: [PATCH] nak: Manually flush denorms for nir_op_fquantize2f16 pre-Volta Part-of: --- src/nouveau/compiler/nak/from_nir.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/nouveau/compiler/nak/from_nir.rs b/src/nouveau/compiler/nak/from_nir.rs index fb5f60b6954..8caedebdb8d 100644 --- a/src/nouveau/compiler/nak/from_nir.rs +++ b/src/nouveau/compiler/nak/from_nir.rs @@ -1160,7 +1160,25 @@ impl<'a> ShaderFromNir<'a> { high: false, integer_rnd: false, }); - dst + if b.sm() < 70 { + // Pre-Volta, F2F.ftz doesn't flush denorms so we need to do + // that manually + let denorm = b.alloc_ssa(RegFile::Pred, 1); + b.push_op(OpFSetP { + dst: denorm.into(), + set_op: PredSetOp::And, + cmp_op: FloatCmpOp::OrdLt, + srcs: [srcs[0].fabs(), 0x38800000.into()], + accum: true.into(), + ftz: false, + }); + // Get the correctly signed zero + let zero = + b.lop2(LogicOp2::And, srcs[0], 0x80000000.into()); + b.sel(denorm.into(), zero.into(), dst.into()) + } else { + dst + } } nir_op_frcp => { assert!(alu.def.bit_size() == 32);