nak: Rework OpPrmt a bit
This renames `selection` to `sel`, adds a source type for sel, adds the PrmtMode for selecting permute mode, and adds proper legalization. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26348>
This commit is contained in:
committed by
Faith Ekstrand
parent
7b6103ccc8
commit
c0d0ce4c6b
@@ -64,7 +64,8 @@ pub trait Builder {
|
||||
self.push_op(OpPrmt {
|
||||
dst: dst,
|
||||
srcs: [x, y],
|
||||
selection: sel_u32.into(),
|
||||
sel: sel_u32.into(),
|
||||
mode: PrmtMode::Index,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -864,9 +864,22 @@ impl SM70Instr {
|
||||
0x16,
|
||||
Some(op.dst),
|
||||
ALUSrc::from_src(&op.srcs[0]),
|
||||
ALUSrc::from_src(&op.selection),
|
||||
ALUSrc::from_src(&op.sel),
|
||||
ALUSrc::from_src(&op.srcs[1]),
|
||||
);
|
||||
|
||||
self.set_field(
|
||||
72..75,
|
||||
match op.mode {
|
||||
PrmtMode::Index => 0_u8,
|
||||
PrmtMode::Forward4Extract => 1_u8,
|
||||
PrmtMode::Backward4Extract => 2_u8,
|
||||
PrmtMode::Replicate8 => 3_u8,
|
||||
PrmtMode::EdgeClampLeft => 4_u8,
|
||||
PrmtMode::EdgeClampRight => 5_u8,
|
||||
PrmtMode::Replicate16 => 6_u8,
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
fn encode_sel(&mut self, op: &OpSel) {
|
||||
|
||||
@@ -2726,6 +2726,32 @@ impl DisplayOp for OpMov {
|
||||
}
|
||||
impl_display_for_op!(OpMov);
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[derive(Clone, Copy, Eq, Hash, PartialEq)]
|
||||
pub enum PrmtMode {
|
||||
Index,
|
||||
Forward4Extract,
|
||||
Backward4Extract,
|
||||
Replicate8,
|
||||
EdgeClampLeft,
|
||||
EdgeClampRight,
|
||||
Replicate16,
|
||||
}
|
||||
|
||||
impl fmt::Display for PrmtMode {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
match self {
|
||||
PrmtMode::Index => Ok(()),
|
||||
PrmtMode::Forward4Extract => write!(f, ".f4e"),
|
||||
PrmtMode::Backward4Extract => write!(f, ".b4e"),
|
||||
PrmtMode::Replicate8 => write!(f, ".rc8"),
|
||||
PrmtMode::EdgeClampLeft => write!(f, ".ecl"),
|
||||
PrmtMode::EdgeClampRight => write!(f, ".ecl"),
|
||||
PrmtMode::Replicate16 => write!(f, ".rc16"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(SrcsAsSlice, DstsAsSlice)]
|
||||
/// Permutes `srcs` into `dst` using `selection`.
|
||||
@@ -2735,15 +2761,18 @@ pub struct OpPrmt {
|
||||
#[src_type(ALU)]
|
||||
pub srcs: [Src; 2],
|
||||
|
||||
pub selection: Src,
|
||||
#[src_type(ALU)]
|
||||
pub sel: Src,
|
||||
|
||||
pub mode: PrmtMode,
|
||||
}
|
||||
|
||||
impl DisplayOp for OpPrmt {
|
||||
fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(
|
||||
f,
|
||||
"prmt {} [{}] {}",
|
||||
self.srcs[0], self.selection, self.srcs[1],
|
||||
"prmt{} {} [{}] {}",
|
||||
self.mode, self.srcs[0], self.sel, self.srcs[1],
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -198,8 +198,11 @@ fn legalize_instr(b: &mut impl SSABuilder, instr: &mut Instr) {
|
||||
| Op::F2I(_)
|
||||
| Op::I2F(_)
|
||||
| Op::Mov(_)
|
||||
| Op::FRnd(_)
|
||||
| Op::Prmt(_) => (),
|
||||
| Op::FRnd(_) => (),
|
||||
Op::Prmt(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.srcs[0], RegFile::GPR);
|
||||
copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR);
|
||||
}
|
||||
Op::Sel(op) => {
|
||||
let [ref mut src0, ref mut src1] = op.srcs;
|
||||
if !src_is_reg(src0) && src_is_reg(src1) {
|
||||
|
||||
Reference in New Issue
Block a user