nak: add support for nir_op_bitfield_reverse
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24998>
This commit is contained in:
committed by
Marge Bot
parent
d27e271ba5
commit
e887c4d07a
@@ -1494,6 +1494,16 @@ impl SM75Instr {
|
||||
self.set_field(63..64, not_mod)
|
||||
}
|
||||
|
||||
fn encode_brev(&mut self, op: &OpBrev) {
|
||||
self.encode_alu(
|
||||
0x101,
|
||||
Some(op.dst),
|
||||
ALUSrc::None,
|
||||
ALUSrc::from_src(&op.src),
|
||||
ALUSrc::None,
|
||||
);
|
||||
}
|
||||
|
||||
pub fn encode(
|
||||
instr: &Instr,
|
||||
sm: u8,
|
||||
@@ -1553,6 +1563,7 @@ impl SM75Instr {
|
||||
Op::Bar(op) => si.encode_bar(&op),
|
||||
Op::S2R(op) => si.encode_s2r(&op),
|
||||
Op::PopC(op) => si.encode_popc(&op),
|
||||
Op::Brev(op) => si.encode_brev(&op),
|
||||
_ => panic!("Unhandled instruction"),
|
||||
}
|
||||
|
||||
|
||||
@@ -216,6 +216,14 @@ impl<'a> ShaderFromNir<'a> {
|
||||
});
|
||||
dst
|
||||
}
|
||||
nir_op_bitfield_reverse => {
|
||||
let dst = b.alloc_ssa(RegFile::GPR, 1);
|
||||
b.push_op(OpBrev {
|
||||
dst: dst.into(),
|
||||
src: srcs[0],
|
||||
});
|
||||
dst
|
||||
}
|
||||
nir_op_f2i32 | nir_op_f2u32 => {
|
||||
let src_bits = usize::from(alu.get_src(0).bit_size());
|
||||
let dst_bits = alu.def.bit_size();
|
||||
|
||||
@@ -3150,6 +3150,21 @@ impl fmt::Display for OpPopC {
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(SrcsAsSlice, DstsAsSlice)]
|
||||
pub struct OpBrev {
|
||||
pub dst: Dst,
|
||||
|
||||
#[src_type(ALU)]
|
||||
pub src: Src,
|
||||
}
|
||||
|
||||
impl fmt::Display for OpBrev {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "BREV {} {}", self.dst, self.src,)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Display, DstsAsSlice, SrcsAsSlice, FromVariants)]
|
||||
pub enum Op {
|
||||
FAdd(OpFAdd),
|
||||
@@ -3205,6 +3220,7 @@ pub enum Op {
|
||||
ParCopy(OpParCopy),
|
||||
FSOut(OpFSOut),
|
||||
PopC(OpPopC),
|
||||
Brev(OpBrev),
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Eq, Hash, PartialEq)]
|
||||
@@ -3521,7 +3537,7 @@ impl Instr {
|
||||
| Op::FSOut(_) => {
|
||||
panic!("Not a hardware opcode")
|
||||
}
|
||||
Op::PopC(_) => Some(15),
|
||||
Op::PopC(_) | Op::Brev(_) => Some(15),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -187,7 +187,8 @@ impl<'a> LegalizeInstr<'a> {
|
||||
| Op::I2F(_)
|
||||
| Op::Mov(_)
|
||||
| Op::FRnd(_)
|
||||
| Op::PopC(_) => (),
|
||||
| Op::PopC(_)
|
||||
| Op::Brev(_) => (),
|
||||
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