nak: Add dnz bits to OpFMul and OpFFma

Also, while we're here, clean up the from_nir code a bit.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26572>
This commit is contained in:
Faith Ekstrand 2023-12-07 11:28:01 -06:00 committed by Marge Bot
parent 97a59ded43
commit 5bfb46a735
4 changed files with 17 additions and 10 deletions

View file

@ -190,6 +190,7 @@ pub trait SSABuilder: Builder {
saturate: false,
rnd_mode: FRndMode::NearestEven,
ftz: false,
dnz: false,
});
dst
}

View file

@ -437,7 +437,7 @@ impl SM70Instr {
ALUSrc::from_src(&op.srcs[1]),
ALUSrc::from_src(&op.srcs[2]),
);
self.set_bit(76, false); /* TODO: DNZ */
self.set_bit(76, op.dnz);
self.set_bit(77, op.saturate);
self.set_rnd_mode(78..80, op.rnd_mode);
self.set_bit(80, op.ftz);
@ -463,7 +463,7 @@ impl SM70Instr {
ALUSrc::from_src(&op.srcs[1]),
ALUSrc::from_src(&Src::new_zero()),
);
self.set_bit(76, false); /* TODO: DNZ */
self.set_bit(76, op.dnz);
self.set_bit(77, op.saturate);
self.set_rnd_mode(78..80, op.rnd_mode);
self.set_bit(80, op.ftz);

View file

@ -707,14 +707,14 @@ impl<'a> ShaderFromNir<'a> {
let ftype = FloatType::from_bits(alu.def.bit_size().into());
assert!(alu.def.bit_size() == 32);
let dst = b.alloc_ssa(RegFile::GPR, 1);
let ffma = OpFFma {
b.push_op(OpFFma {
dst: dst.into(),
srcs: [srcs[0], srcs[1], srcs[2]],
saturate: self.try_saturate_alu_dst(&alu.def),
rnd_mode: self.float_ctl[ftype].rnd_mode,
ftz: self.float_ctl[ftype].ftz,
};
b.push_op(ffma);
dnz: false,
});
dst
}
nir_op_flog2 => {
@ -736,14 +736,14 @@ impl<'a> ShaderFromNir<'a> {
let ftype = FloatType::from_bits(alu.def.bit_size().into());
assert!(alu.def.bit_size() == 32);
let dst = b.alloc_ssa(RegFile::GPR, 1);
let fmul = OpFMul {
b.push_op(OpFMul {
dst: dst.into(),
srcs: [srcs[0], srcs[1]],
saturate: self.try_saturate_alu_dst(&alu.def),
rnd_mode: self.float_ctl[ftype].rnd_mode,
ftz: self.float_ctl[ftype].ftz,
};
b.push_op(fmul);
dnz: false,
});
dst
}
nir_op_fquantize2f16 => {

View file

@ -2213,6 +2213,7 @@ pub struct OpFFma {
pub saturate: bool,
pub rnd_mode: FRndMode,
pub ftz: bool,
pub dnz: bool,
}
impl DisplayOp for OpFFma {
@ -2224,7 +2225,9 @@ impl DisplayOp for OpFFma {
if self.rnd_mode != FRndMode::NearestEven {
write!(f, "{}", self.rnd_mode)?;
}
if self.ftz {
if self.dnz {
write!(f, ".dnz")?;
} else if self.ftz {
write!(f, ".ftz")?;
}
write!(f, " {} {} {}", self.srcs[0], self.srcs[1], self.srcs[2])
@ -2269,6 +2272,7 @@ pub struct OpFMul {
pub saturate: bool,
pub rnd_mode: FRndMode,
pub ftz: bool,
pub dnz: bool,
}
impl DisplayOp for OpFMul {
@ -2280,7 +2284,9 @@ impl DisplayOp for OpFMul {
if self.rnd_mode != FRndMode::NearestEven {
write!(f, "{}", self.rnd_mode)?;
}
if self.ftz {
if self.dnz {
write!(f, ".dnz")?;
} else if self.ftz {
write!(f, ".ftz")?;
}
write!(f, " {} {}", self.srcs[0], self.srcs[1],)