nak: Legalize Op[FI]Setp
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24998>
This commit is contained in:
committed by
Marge Bot
parent
3bd42dd254
commit
e8f220f7a1
@@ -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 {
|
||||
|
||||
@@ -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| {
|
||||
|
||||
Reference in New Issue
Block a user