mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
nak: Implement nir_op_bfm
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26550>
This commit is contained in:
parent
c14f4cc052
commit
bb10f7f5da
5 changed files with 51 additions and 2 deletions
|
|
@ -138,6 +138,7 @@ fn nir_options(dev: &nv_device_info) -> nir_shader_compiler_options {
|
||||||
op.has_fmulz_no_denorms = true;
|
op.has_fmulz_no_denorms = true;
|
||||||
op.has_find_msb_rev = true;
|
op.has_find_msb_rev = true;
|
||||||
op.has_pack_half_2x16_rtz = true;
|
op.has_pack_half_2x16_rtz = true;
|
||||||
|
op.has_bfm = dev.sm >= 70;
|
||||||
|
|
||||||
op.max_unroll_iterations = 32;
|
op.max_unroll_iterations = 32;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -643,6 +643,18 @@ impl SM70Instr {
|
||||||
self.set_pred_src(87..90, 90, op.accum);
|
self.set_pred_src(87..90, 90, op.accum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn encode_bmsk(&mut self, op: &OpBMsk) {
|
||||||
|
self.encode_alu(
|
||||||
|
0x01b,
|
||||||
|
Some(op.dst),
|
||||||
|
ALUSrc::from_src(&op.pos),
|
||||||
|
ALUSrc::from_src(&op.width),
|
||||||
|
ALUSrc::None,
|
||||||
|
);
|
||||||
|
|
||||||
|
self.set_bit(75, op.wrap);
|
||||||
|
}
|
||||||
|
|
||||||
fn encode_brev(&mut self, op: &OpBRev) {
|
fn encode_brev(&mut self, op: &OpBRev) {
|
||||||
self.encode_alu(
|
self.encode_alu(
|
||||||
0x101,
|
0x101,
|
||||||
|
|
@ -1995,6 +2007,7 @@ impl SM70Instr {
|
||||||
Op::DMul(op) => si.encode_dmul(&op),
|
Op::DMul(op) => si.encode_dmul(&op),
|
||||||
Op::DSetP(op) => si.encode_dsetp(&op),
|
Op::DSetP(op) => si.encode_dsetp(&op),
|
||||||
Op::MuFu(op) => si.encode_mufu(&op),
|
Op::MuFu(op) => si.encode_mufu(&op),
|
||||||
|
Op::BMsk(op) => si.encode_bmsk(&op),
|
||||||
Op::BRev(op) => si.encode_brev(&op),
|
Op::BRev(op) => si.encode_brev(&op),
|
||||||
Op::Flo(op) => si.encode_flo(&op),
|
Op::Flo(op) => si.encode_flo(&op),
|
||||||
Op::IAbs(op) => si.encode_iabs(&op),
|
Op::IAbs(op) => si.encode_iabs(&op),
|
||||||
|
|
|
||||||
|
|
@ -525,6 +525,16 @@ impl<'a> ShaderFromNir<'a> {
|
||||||
[lo[0], hi[0]].into()
|
[lo[0], hi[0]].into()
|
||||||
}
|
}
|
||||||
nir_op_bcsel => b.sel(srcs[0], srcs[1], srcs[2]),
|
nir_op_bcsel => b.sel(srcs[0], srcs[1], srcs[2]),
|
||||||
|
nir_op_bfm => {
|
||||||
|
let dst = b.alloc_ssa(RegFile::GPR, 1);
|
||||||
|
b.push_op(OpBMsk {
|
||||||
|
dst: dst.into(),
|
||||||
|
pos: srcs[1],
|
||||||
|
width: srcs[0],
|
||||||
|
wrap: true,
|
||||||
|
});
|
||||||
|
dst
|
||||||
|
}
|
||||||
nir_op_bit_count => {
|
nir_op_bit_count => {
|
||||||
let dst = b.alloc_ssa(RegFile::GPR, 1);
|
let dst = b.alloc_ssa(RegFile::GPR, 1);
|
||||||
b.push_op(OpPopC {
|
b.push_op(OpPopC {
|
||||||
|
|
|
||||||
|
|
@ -2578,6 +2578,28 @@ impl DisplayOp for OpDSetP {
|
||||||
}
|
}
|
||||||
impl_display_for_op!(OpDSetP);
|
impl_display_for_op!(OpDSetP);
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(SrcsAsSlice, DstsAsSlice)]
|
||||||
|
pub struct OpBMsk {
|
||||||
|
pub dst: Dst,
|
||||||
|
|
||||||
|
#[src_type(ALU)]
|
||||||
|
pub pos: Src,
|
||||||
|
|
||||||
|
#[src_type(ALU)]
|
||||||
|
pub width: Src,
|
||||||
|
|
||||||
|
pub wrap: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DisplayOp for OpBMsk {
|
||||||
|
fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
let wrap = if self.wrap { ".wrap" } else { ".clamp" };
|
||||||
|
write!(f, "bmsk{} {} {}", wrap, self.pos, self.width)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl_display_for_op!(OpBMsk);
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(SrcsAsSlice, DstsAsSlice)]
|
#[derive(SrcsAsSlice, DstsAsSlice)]
|
||||||
pub struct OpBRev {
|
pub struct OpBRev {
|
||||||
|
|
@ -4727,6 +4749,7 @@ pub enum Op {
|
||||||
DMnMx(OpDMnMx),
|
DMnMx(OpDMnMx),
|
||||||
DMul(OpDMul),
|
DMul(OpDMul),
|
||||||
DSetP(OpDSetP),
|
DSetP(OpDSetP),
|
||||||
|
BMsk(OpBMsk),
|
||||||
BRev(OpBRev),
|
BRev(OpBRev),
|
||||||
Flo(OpFlo),
|
Flo(OpFlo),
|
||||||
IAbs(OpIAbs),
|
IAbs(OpIAbs),
|
||||||
|
|
@ -5172,7 +5195,8 @@ impl Instr {
|
||||||
|
|
||||||
// Integer ALU
|
// Integer ALU
|
||||||
Op::BRev(_) | Op::Flo(_) | Op::PopC(_) => false,
|
Op::BRev(_) | Op::Flo(_) | Op::PopC(_) => false,
|
||||||
Op::IAbs(_)
|
Op::BMsk(_)
|
||||||
|
| Op::IAbs(_)
|
||||||
| Op::INeg(_)
|
| Op::INeg(_)
|
||||||
| Op::IAdd2(_)
|
| Op::IAdd2(_)
|
||||||
| Op::IAdd3(_)
|
| Op::IAdd3(_)
|
||||||
|
|
|
||||||
|
|
@ -432,7 +432,8 @@ fn legalize_sm70_instr(
|
||||||
}
|
}
|
||||||
copy_alu_src_if_not_reg(b, src0, SrcType::F64);
|
copy_alu_src_if_not_reg(b, src0, SrcType::F64);
|
||||||
}
|
}
|
||||||
Op::BRev(_) | Op::Flo(_) | Op::IAbs(_) | Op::INeg(_) => (),
|
Op::BMsk(_) | Op::BRev(_) | Op::Flo(_) => (),
|
||||||
|
Op::IAbs(_) | Op::INeg(_) => (),
|
||||||
Op::IAdd3(op) => {
|
Op::IAdd3(op) => {
|
||||||
let [ref mut src0, ref mut src1, ref mut src2] = op.srcs;
|
let [ref mut src0, ref mut src1, ref mut src2] = op.srcs;
|
||||||
swap_srcs_if_not_reg(src0, src1);
|
swap_srcs_if_not_reg(src0, src1);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue