diff --git a/src/nouveau/compiler/nak_ir.rs b/src/nouveau/compiler/nak_ir.rs index 1b2da642f06..1240d57d3bd 100644 --- a/src/nouveau/compiler/nak_ir.rs +++ b/src/nouveau/compiler/nak_ir.rs @@ -769,6 +769,24 @@ pub enum FloatCmpOp { IsNan, } +impl FloatCmpOp { + pub fn flip(self) -> FloatCmpOp { + match self { + FloatCmpOp::OrdEq | FloatCmpOp::OrdNe => self, + FloatCmpOp::OrdLt => FloatCmpOp::OrdGt, + FloatCmpOp::OrdLe => FloatCmpOp::OrdGe, + FloatCmpOp::OrdGt => FloatCmpOp::OrdLt, + FloatCmpOp::OrdGe => FloatCmpOp::OrdLe, + FloatCmpOp::UnordEq | FloatCmpOp::UnordNe => self, + FloatCmpOp::UnordLt => FloatCmpOp::UnordGt, + FloatCmpOp::UnordLe => FloatCmpOp::UnordGe, + FloatCmpOp::UnordGt => FloatCmpOp::UnordLt, + FloatCmpOp::UnordGe => FloatCmpOp::UnordLe, + FloatCmpOp::IsNum | FloatCmpOp::IsNan => panic!("Cannot flip unop"), + } + } +} + impl fmt::Display for FloatCmpOp { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { @@ -800,6 +818,18 @@ pub enum IntCmpOp { Ge, } +impl IntCmpOp { + pub fn flip(self) -> IntCmpOp { + match self { + IntCmpOp::Eq | IntCmpOp::Ne => self, + IntCmpOp::Lt => IntCmpOp::Gt, + IntCmpOp::Le => IntCmpOp::Ge, + IntCmpOp::Gt => IntCmpOp::Lt, + IntCmpOp::Ge => IntCmpOp::Le, + } + } +} + impl fmt::Display for IntCmpOp { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { diff --git a/src/nouveau/compiler/nak_legalize.rs b/src/nouveau/compiler/nak_legalize.rs index 0297fb53f0e..39a250f1104 100644 --- a/src/nouveau/compiler/nak_legalize.rs +++ b/src/nouveau/compiler/nak_legalize.rs @@ -90,6 +90,14 @@ impl<'a> LegalizeInstr<'a> { self.swap_srcs_if_not_reg(src0, src1); self.mov_src_if_not_reg(src0, RegFile::GPR); } + Op::FSetP(op) => { + let [ref mut src0, ref mut src1] = op.srcs; + if !src_is_reg(src0) && src_is_reg(src1) { + std::mem::swap(src0, src1); + op.cmp_op = op.cmp_op.flip(); + } + self.mov_src_if_not_reg(src0, RegFile::GPR); + } Op::IAdd3(op) => { let [ref mut src0, ref mut src1, ref mut src2] = op.srcs; self.swap_srcs_if_not_reg(src0, src1); @@ -103,6 +111,14 @@ impl<'a> LegalizeInstr<'a> { self.mov_src_if_not_reg(src0, RegFile::GPR); self.mov_src_if_not_reg(src2, RegFile::GPR); } + Op::ISetP(op) => { + let [ref mut src0, ref mut src1] = op.srcs; + if !src_is_reg(src0) && src_is_reg(src1) { + std::mem::swap(src0, src1); + op.cmp_op = op.cmp_op.flip(); + } + self.mov_src_if_not_reg(src0, RegFile::GPR); + } Op::Lop3(op) => { /* Fold constants if we can */ op.op = LogicOp::new_lut(&|mut x, mut y, mut z| {