nak: Legalize Op[FI]Setp

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24998>
This commit is contained in:
Faith Ekstrand
2023-04-22 15:32:58 -05:00
committed by Marge Bot
parent 3bd42dd254
commit e8f220f7a1
2 changed files with 46 additions and 0 deletions
+30
View File
@@ -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 {
+16
View File
@@ -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| {