diff --git a/src/nouveau/compiler/nak/builder.rs b/src/nouveau/compiler/nak/builder.rs index 829898d9c9d..2c7352764fa 100644 --- a/src/nouveau/compiler/nak/builder.rs +++ b/src/nouveau/compiler/nak/builder.rs @@ -289,19 +289,6 @@ pub trait SSABuilder: Builder { dst } - fn fmul(&mut self, x: Src, y: Src) -> SSAValue { - let dst = self.alloc_ssa(RegFile::GPR); - self.push_op(OpFMul { - dst: dst.into(), - srcs: [x, y], - saturate: false, - rnd_mode: FRndMode::NearestEven, - ftz: false, - dnz: false, - }); - dst - } - fn fset(&mut self, cmp_op: FloatCmpOp, x: Src, y: Src) -> SSAValue { let dst = self.alloc_ssa(RegFile::GPR); self.push_op(OpFSet { @@ -754,34 +741,24 @@ pub trait SSABuilder: Builder { } fn fsin(&mut self, src: Src) -> SSAValue { - let tmp = if self.sm() >= 70 { - let frac_1_2pi = 1.0 / (2.0 * std::f32::consts::PI); - self.fmul(src, frac_1_2pi.into()) - } else { - let tmp = self.alloc_ssa(RegFile::GPR); - self.push_op(OpRro { - dst: tmp.into(), - op: RroOp::SinCos, - src, - }); - tmp - }; + assert!(self.sm() < 70); + let tmp = self.alloc_ssa(RegFile::GPR); + self.push_op(OpRro { + dst: tmp.into(), + op: RroOp::SinCos, + src, + }); self.mufu(MuFuOp::Sin, tmp.into()) } fn fcos(&mut self, src: Src) -> SSAValue { - let tmp = if self.sm() >= 70 { - let frac_1_2pi = 1.0 / (2.0 * std::f32::consts::PI); - self.fmul(src, frac_1_2pi.into()) - } else { - let tmp = self.alloc_ssa(RegFile::GPR); - self.push_op(OpRro { - dst: tmp.into(), - op: RroOp::SinCos, - src, - }); - tmp - }; + assert!(self.sm() < 70); + let tmp = self.alloc_ssa(RegFile::GPR); + self.push_op(OpRro { + dst: tmp.into(), + op: RroOp::SinCos, + src, + }); self.mufu(MuFuOp::Cos, tmp.into()) } diff --git a/src/nouveau/compiler/nak/from_nir.rs b/src/nouveau/compiler/nak/from_nir.rs index d51ec610deb..6098ec33d96 100644 --- a/src/nouveau/compiler/nak/from_nir.rs +++ b/src/nouveau/compiler/nak/from_nir.rs @@ -982,6 +982,10 @@ impl<'a> ShaderFromNir<'a> { dst.into() } nir_op_fcos => b.fcos(srcs(0)).into(), + nir_op_fcos_normalized_2_pi => { + assert!(self.sm.sm() >= 70); + b.mufu(MuFuOp::Cos, srcs(0)).into() + } nir_op_feq | nir_op_fge | nir_op_flt | nir_op_fneu => { let src_type = FloatType::from_bits(alu.get_src(0).bit_size().into()); @@ -1317,6 +1321,10 @@ impl<'a> ShaderFromNir<'a> { } } nir_op_fsin => b.fsin(srcs(0)).into(), + nir_op_fsin_normalized_2_pi => { + assert!(self.sm.sm() >= 70); + b.mufu(MuFuOp::Sin, srcs(0)).into() + } nir_op_fsqrt => b.mufu(MuFuOp::Sqrt, srcs(0)).into(), nir_op_i2f16 | nir_op_i2f32 | nir_op_i2f64 => { let src_bits = alu.get_src(0).src.bit_size(); diff --git a/src/nouveau/compiler/nak_nir.c b/src/nouveau/compiler/nak_nir.c index 66d82fb3cc3..fc07530de04 100644 --- a/src/nouveau/compiler/nak_nir.c +++ b/src/nouveau/compiler/nak_nir.c @@ -1308,6 +1308,9 @@ nak_postprocess_nir(nir_shader *nir, OPT(nir, nir_lower_doubles, NULL, nak->nir_options.lower_doubles_options); OPT(nir, nir_lower_int64); + if (nak->sm >= 70) + OPT(nir, nir_normalize_sin_cos); + nak_optimize_nir(nir, nak); do {