nak: Add an ftz bit to a bunch of float ops
Specifically, OpFAdd, FFma, FMnMx, FMul, and FSwzAdd Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26557>
This commit is contained in:
committed by
Marge Bot
parent
6881ff4c99
commit
29bfdcd7c1
@@ -177,6 +177,7 @@ pub trait SSABuilder: Builder {
|
|||||||
srcs: [x, y],
|
srcs: [x, y],
|
||||||
saturate: false,
|
saturate: false,
|
||||||
rnd_mode: FRndMode::NearestEven,
|
rnd_mode: FRndMode::NearestEven,
|
||||||
|
ftz: false,
|
||||||
});
|
});
|
||||||
dst
|
dst
|
||||||
}
|
}
|
||||||
@@ -188,6 +189,7 @@ pub trait SSABuilder: Builder {
|
|||||||
srcs: [x, y],
|
srcs: [x, y],
|
||||||
saturate: false,
|
saturate: false,
|
||||||
rnd_mode: FRndMode::NearestEven,
|
rnd_mode: FRndMode::NearestEven,
|
||||||
|
ftz: false,
|
||||||
});
|
});
|
||||||
dst
|
dst
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -425,7 +425,7 @@ impl SM70Instr {
|
|||||||
}
|
}
|
||||||
self.set_bit(77, op.saturate);
|
self.set_bit(77, op.saturate);
|
||||||
self.set_rnd_mode(78..80, op.rnd_mode);
|
self.set_rnd_mode(78..80, op.rnd_mode);
|
||||||
self.set_bit(80, false); /* TODO: FTZ */
|
self.set_bit(80, op.ftz);
|
||||||
self.set_bit(81, false); /* TODO: DNZ */
|
self.set_bit(81, false); /* TODO: DNZ */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -440,7 +440,7 @@ impl SM70Instr {
|
|||||||
self.set_bit(76, false); /* TODO: DNZ */
|
self.set_bit(76, false); /* TODO: DNZ */
|
||||||
self.set_bit(77, op.saturate);
|
self.set_bit(77, op.saturate);
|
||||||
self.set_rnd_mode(78..80, op.rnd_mode);
|
self.set_rnd_mode(78..80, op.rnd_mode);
|
||||||
self.set_bit(80, false); /* TODO: FTZ */
|
self.set_bit(80, op.ftz);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn encode_fmnmx(&mut self, op: &OpFMnMx) {
|
fn encode_fmnmx(&mut self, op: &OpFMnMx) {
|
||||||
@@ -452,7 +452,7 @@ impl SM70Instr {
|
|||||||
ALUSrc::from_src(&Src::new_zero()),
|
ALUSrc::from_src(&Src::new_zero()),
|
||||||
);
|
);
|
||||||
self.set_pred_src(87..90, 90, op.min);
|
self.set_pred_src(87..90, 90, op.min);
|
||||||
self.set_bit(80, false); /* TODO: FMZ */
|
self.set_bit(80, op.ftz);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn encode_fmul(&mut self, op: &OpFMul) {
|
fn encode_fmul(&mut self, op: &OpFMul) {
|
||||||
@@ -466,7 +466,7 @@ impl SM70Instr {
|
|||||||
self.set_bit(76, false); /* TODO: DNZ */
|
self.set_bit(76, false); /* TODO: DNZ */
|
||||||
self.set_bit(77, op.saturate);
|
self.set_bit(77, op.saturate);
|
||||||
self.set_rnd_mode(78..80, op.rnd_mode);
|
self.set_rnd_mode(78..80, op.rnd_mode);
|
||||||
self.set_bit(80, false); /* TODO: FTZ */
|
self.set_bit(80, op.ftz);
|
||||||
self.set_field(84..87, 0x4_u8) /* TODO: PDIV */
|
self.set_field(84..87, 0x4_u8) /* TODO: PDIV */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -561,7 +561,7 @@ impl SM70Instr {
|
|||||||
|
|
||||||
self.set_bit(77, false); /* NDV */
|
self.set_bit(77, false); /* NDV */
|
||||||
self.set_rnd_mode(78..80, op.rnd_mode);
|
self.set_rnd_mode(78..80, op.rnd_mode);
|
||||||
self.set_bit(80, false); /* TODO: FTZ */
|
self.set_bit(80, op.ftz);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn encode_mufu(&mut self, op: &OpMuFu) {
|
fn encode_mufu(&mut self, op: &OpMuFu) {
|
||||||
@@ -877,7 +877,7 @@ impl SM70Instr {
|
|||||||
self.set_field(75..77, (op.dst_type.bits() / 8).ilog2());
|
self.set_field(75..77, (op.dst_type.bits() / 8).ilog2());
|
||||||
self.set_bit(77, false); /* NTZ */
|
self.set_bit(77, false); /* NTZ */
|
||||||
self.set_rnd_mode(78..80, op.rnd_mode);
|
self.set_rnd_mode(78..80, op.rnd_mode);
|
||||||
self.set_bit(80, false); /* FTZ */
|
self.set_bit(80, op.ftz); /* FTZ */
|
||||||
self.set_bit(81, false); /* DNZ */
|
self.set_bit(81, false); /* DNZ */
|
||||||
self.set_field(84..86, (op.src_type.bits() / 8).ilog2());
|
self.set_field(84..86, (op.src_type.bits() / 8).ilog2());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -535,6 +535,7 @@ impl<'a> ShaderFromNir<'a> {
|
|||||||
dst_is_signed,
|
dst_is_signed,
|
||||||
),
|
),
|
||||||
rnd_mode: FRndMode::Zero,
|
rnd_mode: FRndMode::Zero,
|
||||||
|
ftz: false,
|
||||||
});
|
});
|
||||||
dst
|
dst
|
||||||
}
|
}
|
||||||
@@ -553,6 +554,7 @@ impl<'a> ShaderFromNir<'a> {
|
|||||||
srcs: [x, y],
|
srcs: [x, y],
|
||||||
saturate: saturate,
|
saturate: saturate,
|
||||||
rnd_mode: FRndMode::NearestEven,
|
rnd_mode: FRndMode::NearestEven,
|
||||||
|
ftz: false,
|
||||||
});
|
});
|
||||||
dst
|
dst
|
||||||
}
|
}
|
||||||
@@ -591,6 +593,7 @@ impl<'a> ShaderFromNir<'a> {
|
|||||||
srcs: [srcs[0], srcs[1], srcs[2]],
|
srcs: [srcs[0], srcs[1], srcs[2]],
|
||||||
saturate: self.try_saturate_alu_dst(&alu.def),
|
saturate: self.try_saturate_alu_dst(&alu.def),
|
||||||
rnd_mode: FRndMode::NearestEven,
|
rnd_mode: FRndMode::NearestEven,
|
||||||
|
ftz: false,
|
||||||
};
|
};
|
||||||
b.push_op(ffma);
|
b.push_op(ffma);
|
||||||
dst
|
dst
|
||||||
@@ -614,6 +617,7 @@ impl<'a> ShaderFromNir<'a> {
|
|||||||
dst: dst.into(),
|
dst: dst.into(),
|
||||||
srcs: [srcs[0], srcs[1]],
|
srcs: [srcs[0], srcs[1]],
|
||||||
min: (alu.op == nir_op_fmin).into(),
|
min: (alu.op == nir_op_fmin).into(),
|
||||||
|
ftz: false,
|
||||||
});
|
});
|
||||||
dst
|
dst
|
||||||
}
|
}
|
||||||
@@ -625,6 +629,7 @@ impl<'a> ShaderFromNir<'a> {
|
|||||||
srcs: [srcs[0], srcs[1]],
|
srcs: [srcs[0], srcs[1]],
|
||||||
saturate: self.try_saturate_alu_dst(&alu.def),
|
saturate: self.try_saturate_alu_dst(&alu.def),
|
||||||
rnd_mode: FRndMode::NearestEven,
|
rnd_mode: FRndMode::NearestEven,
|
||||||
|
ftz: false,
|
||||||
};
|
};
|
||||||
b.push_op(fmul);
|
b.push_op(fmul);
|
||||||
dst
|
dst
|
||||||
@@ -673,6 +678,7 @@ impl<'a> ShaderFromNir<'a> {
|
|||||||
srcs: [srcs[0], 0.into()],
|
srcs: [srcs[0], 0.into()],
|
||||||
saturate: true,
|
saturate: true,
|
||||||
rnd_mode: FRndMode::NearestEven,
|
rnd_mode: FRndMode::NearestEven,
|
||||||
|
ftz: false,
|
||||||
});
|
});
|
||||||
dst
|
dst
|
||||||
}
|
}
|
||||||
@@ -1154,6 +1160,7 @@ impl<'a> ShaderFromNir<'a> {
|
|||||||
FSwzAddOp::SubRight,
|
FSwzAddOp::SubRight,
|
||||||
],
|
],
|
||||||
rnd_mode: FRndMode::NearestEven,
|
rnd_mode: FRndMode::NearestEven,
|
||||||
|
ftz: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
dst
|
dst
|
||||||
@@ -1185,6 +1192,7 @@ impl<'a> ShaderFromNir<'a> {
|
|||||||
FSwzAddOp::SubRight,
|
FSwzAddOp::SubRight,
|
||||||
],
|
],
|
||||||
rnd_mode: FRndMode::NearestEven,
|
rnd_mode: FRndMode::NearestEven,
|
||||||
|
ftz: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
dst
|
dst
|
||||||
@@ -2499,6 +2507,7 @@ impl<'a> ShaderFromNir<'a> {
|
|||||||
srcs: [depth.into(), 0.into()],
|
srcs: [depth.into(), 0.into()],
|
||||||
saturate: true,
|
saturate: true,
|
||||||
rnd_mode: FRndMode::NearestEven,
|
rnd_mode: FRndMode::NearestEven,
|
||||||
|
ftz: false,
|
||||||
});
|
});
|
||||||
srcs.push(sat_depth.into());
|
srcs.push(sat_depth.into());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2182,6 +2182,7 @@ pub struct OpFAdd {
|
|||||||
|
|
||||||
pub saturate: bool,
|
pub saturate: bool,
|
||||||
pub rnd_mode: FRndMode,
|
pub rnd_mode: FRndMode,
|
||||||
|
pub ftz: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DisplayOp for OpFAdd {
|
impl DisplayOp for OpFAdd {
|
||||||
@@ -2193,6 +2194,9 @@ impl DisplayOp for OpFAdd {
|
|||||||
if self.rnd_mode != FRndMode::NearestEven {
|
if self.rnd_mode != FRndMode::NearestEven {
|
||||||
write!(f, "{}", self.rnd_mode)?;
|
write!(f, "{}", self.rnd_mode)?;
|
||||||
}
|
}
|
||||||
|
if self.ftz {
|
||||||
|
write!(f, ".ftz")?;
|
||||||
|
}
|
||||||
write!(f, " {} {}", self.srcs[0], self.srcs[1],)
|
write!(f, " {} {}", self.srcs[0], self.srcs[1],)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2208,6 +2212,7 @@ pub struct OpFFma {
|
|||||||
|
|
||||||
pub saturate: bool,
|
pub saturate: bool,
|
||||||
pub rnd_mode: FRndMode,
|
pub rnd_mode: FRndMode,
|
||||||
|
pub ftz: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DisplayOp for OpFFma {
|
impl DisplayOp for OpFFma {
|
||||||
@@ -2219,6 +2224,9 @@ impl DisplayOp for OpFFma {
|
|||||||
if self.rnd_mode != FRndMode::NearestEven {
|
if self.rnd_mode != FRndMode::NearestEven {
|
||||||
write!(f, "{}", self.rnd_mode)?;
|
write!(f, "{}", self.rnd_mode)?;
|
||||||
}
|
}
|
||||||
|
if self.ftz {
|
||||||
|
write!(f, ".ftz")?;
|
||||||
|
}
|
||||||
write!(f, " {} {} {}", self.srcs[0], self.srcs[1], self.srcs[2])
|
write!(f, " {} {} {}", self.srcs[0], self.srcs[1], self.srcs[2])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2234,11 +2242,18 @@ pub struct OpFMnMx {
|
|||||||
|
|
||||||
#[src_type(Pred)]
|
#[src_type(Pred)]
|
||||||
pub min: Src,
|
pub min: Src,
|
||||||
|
|
||||||
|
pub ftz: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DisplayOp for OpFMnMx {
|
impl DisplayOp for OpFMnMx {
|
||||||
fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
write!(f, "fmnmx {} {} {}", self.srcs[0], self.srcs[1], self.min)
|
let ftz = if self.ftz { ".ftz" } else { "" };
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"fmnmx{} {} {} {}",
|
||||||
|
ftz, self.srcs[0], self.srcs[1], self.min
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl_display_for_op!(OpFMnMx);
|
impl_display_for_op!(OpFMnMx);
|
||||||
@@ -2253,6 +2268,7 @@ pub struct OpFMul {
|
|||||||
|
|
||||||
pub saturate: bool,
|
pub saturate: bool,
|
||||||
pub rnd_mode: FRndMode,
|
pub rnd_mode: FRndMode,
|
||||||
|
pub ftz: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DisplayOp for OpFMul {
|
impl DisplayOp for OpFMul {
|
||||||
@@ -2264,6 +2280,9 @@ impl DisplayOp for OpFMul {
|
|||||||
if self.rnd_mode != FRndMode::NearestEven {
|
if self.rnd_mode != FRndMode::NearestEven {
|
||||||
write!(f, "{}", self.rnd_mode)?;
|
write!(f, "{}", self.rnd_mode)?;
|
||||||
}
|
}
|
||||||
|
if self.ftz {
|
||||||
|
write!(f, ".ftz")?;
|
||||||
|
}
|
||||||
write!(f, " {} {}", self.srcs[0], self.srcs[1],)
|
write!(f, " {} {}", self.srcs[0], self.srcs[1],)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2345,6 +2364,7 @@ pub struct OpFSwzAdd {
|
|||||||
pub srcs: [Src; 2],
|
pub srcs: [Src; 2],
|
||||||
|
|
||||||
pub rnd_mode: FRndMode,
|
pub rnd_mode: FRndMode,
|
||||||
|
pub ftz: bool,
|
||||||
|
|
||||||
pub ops: [FSwzAddOp; 4],
|
pub ops: [FSwzAddOp; 4],
|
||||||
}
|
}
|
||||||
@@ -2355,6 +2375,9 @@ impl DisplayOp for OpFSwzAdd {
|
|||||||
if self.rnd_mode != FRndMode::NearestEven {
|
if self.rnd_mode != FRndMode::NearestEven {
|
||||||
write!(f, "{}", self.rnd_mode)?;
|
write!(f, "{}", self.rnd_mode)?;
|
||||||
}
|
}
|
||||||
|
if self.ftz {
|
||||||
|
write!(f, ".ftz")?;
|
||||||
|
}
|
||||||
write!(
|
write!(
|
||||||
f,
|
f,
|
||||||
" {} {} [{}, {}, {}, {}]",
|
" {} {} [{}, {}, {}, {}]",
|
||||||
@@ -2959,6 +2982,7 @@ pub struct OpF2I {
|
|||||||
pub src_type: FloatType,
|
pub src_type: FloatType,
|
||||||
pub dst_type: IntType,
|
pub dst_type: IntType,
|
||||||
pub rnd_mode: FRndMode,
|
pub rnd_mode: FRndMode,
|
||||||
|
pub ftz: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SrcsAsSlice for OpF2I {
|
impl SrcsAsSlice for OpF2I {
|
||||||
@@ -2982,10 +3006,11 @@ impl SrcsAsSlice for OpF2I {
|
|||||||
|
|
||||||
impl DisplayOp for OpF2I {
|
impl DisplayOp for OpF2I {
|
||||||
fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
let ftz = if self.ftz { ".ftz" } else { "" };
|
||||||
write!(
|
write!(
|
||||||
f,
|
f,
|
||||||
"f2i{}{}{} {}",
|
"f2i{}{}{}{} {}",
|
||||||
self.dst_type, self.src_type, self.rnd_mode, self.src,
|
self.dst_type, self.src_type, self.rnd_mode, ftz, self.src,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user