From 16e55dc7d5ca240748cda02b2e3713a185fc2165 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 4 Dec 2023 14:33:37 -0600 Subject: [PATCH] nak: Use the right source types for I2F, F2I, and F2F Part-of: --- src/nouveau/compiler/nak_ir.rs | 67 ++++++++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/src/nouveau/compiler/nak_ir.rs b/src/nouveau/compiler/nak_ir.rs index 14e271bcb67..c4a2951083f 100644 --- a/src/nouveau/compiler/nak_ir.rs +++ b/src/nouveau/compiler/nak_ir.rs @@ -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, };