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:
Faith Ekstrand
2023-11-22 14:41:48 -06:00
committed by Faith Ekstrand
parent 7b6103ccc8
commit c0d0ce4c6b
4 changed files with 53 additions and 7 deletions
+2 -1
View File
@@ -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,
});
}
}
+14 -1
View File
@@ -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) {
+32 -3
View File
@@ -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],
)
}
}
+5 -2
View File
@@ -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) {