nak: Use the right source types for I2F, F2I, and F2F

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26246>
This commit is contained in:
Faith Ekstrand
2023-12-04 14:33:37 -06:00
committed by Marge Bot
parent d621f2ccfd
commit 16e55dc7d5
+60 -7
View File
@@ -2630,11 +2630,10 @@ impl DisplayOp for OpShf {
impl_display_for_op!(OpShf);
#[repr(C)]
#[derive(SrcsAsSlice, DstsAsSlice)]
#[derive(DstsAsSlice)]
pub struct OpF2F {
pub dst: Dst,
#[src_type(F32)]
pub src: Src,
pub src_type: FloatType,
@@ -2645,6 +2644,25 @@ pub struct OpF2F {
pub high: bool,
}
impl SrcsAsSlice for OpF2F {
fn srcs_as_slice(&self) -> &[Src] {
std::slice::from_ref(&self.src)
}
fn srcs_as_mut_slice(&mut self) -> &mut [Src] {
std::slice::from_mut(&mut self.src)
}
fn src_types(&self) -> SrcTypeList {
let src_type = match self.src_type {
FloatType::F16 => SrcType::ALU,
FloatType::F32 => SrcType::F32,
FloatType::F64 => SrcType::F64,
};
SrcTypeList::Uniform(src_type)
}
}
impl DisplayOp for OpF2F {
fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "f2f")?;
@@ -2661,11 +2679,10 @@ impl DisplayOp for OpF2F {
impl_display_for_op!(OpF2F);
#[repr(C)]
#[derive(SrcsAsSlice, DstsAsSlice)]
#[derive(DstsAsSlice)]
pub struct OpF2I {
pub dst: Dst,
#[src_type(F32)]
pub src: Src,
pub src_type: FloatType,
@@ -2673,6 +2690,25 @@ pub struct OpF2I {
pub rnd_mode: FRndMode,
}
impl SrcsAsSlice for OpF2I {
fn srcs_as_slice(&self) -> &[Src] {
std::slice::from_ref(&self.src)
}
fn srcs_as_mut_slice(&mut self) -> &mut [Src] {
std::slice::from_mut(&mut self.src)
}
fn src_types(&self) -> SrcTypeList {
let src_type = match self.src_type {
FloatType::F16 => SrcType::ALU,
FloatType::F32 => SrcType::F32,
FloatType::F64 => SrcType::F64,
};
SrcTypeList::Uniform(src_type)
}
}
impl DisplayOp for OpF2I {
fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
@@ -2685,11 +2721,10 @@ impl DisplayOp for OpF2I {
impl_display_for_op!(OpF2I);
#[repr(C)]
#[derive(SrcsAsSlice, DstsAsSlice)]
#[derive(DstsAsSlice)]
pub struct OpI2F {
pub dst: Dst,
#[src_type(ALU)]
pub src: Src,
pub dst_type: FloatType,
@@ -2697,6 +2732,24 @@ pub struct OpI2F {
pub rnd_mode: FRndMode,
}
impl SrcsAsSlice for OpI2F {
fn srcs_as_slice(&self) -> &[Src] {
std::slice::from_ref(&self.src)
}
fn srcs_as_mut_slice(&mut self) -> &mut [Src] {
std::slice::from_mut(&mut self.src)
}
fn src_types(&self) -> SrcTypeList {
if self.src_type.bits() <= 32 {
SrcTypeList::Uniform(SrcType::ALU)
} else {
SrcTypeList::Uniform(SrcType::GPR)
}
}
}
impl DisplayOp for OpI2F {
fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
@@ -2731,7 +2784,7 @@ impl SrcsAsSlice for OpFRnd {
fn src_types(&self) -> SrcTypeList {
let src_type = match self.src_type {
FloatType::F16 => unimplemented!(),
FloatType::F16 => SrcType::ALU,
FloatType::F32 => SrcType::F32,
FloatType::F64 => SrcType::F64,
};