nak: Implement Srcs/DstsAsSlice directly on ops

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41410>
This commit is contained in:
Faith Ekstrand 2026-05-06 19:43:33 -04:00 committed by Marge Bot
parent 57d7544896
commit b0ccba02f7

View file

@ -1390,6 +1390,7 @@ fn all_dsts_uniform(dsts: &[Dst]) -> bool {
} }
#[repr(u8)] #[repr(u8)]
#[allow(dead_code)]
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum DstType { pub enum DstType {
Pred, Pred,
@ -3190,18 +3191,16 @@ pub struct OpMuFu {
pub op_type: FloatType, pub op_type: FloatType,
} }
impl AsSlice<Src> for OpMuFu { impl SrcsAsSlice for OpMuFu {
type Attr = SrcType; fn srcs_as_slice(&self) -> &[Src] {
fn as_slice(&self) -> &[Src] {
std::slice::from_ref(&self.src) std::slice::from_ref(&self.src)
} }
fn as_mut_slice(&mut self) -> &mut [Src] { fn srcs_as_mut_slice(&mut self) -> &mut [Src] {
std::slice::from_mut(&mut self.src) std::slice::from_mut(&mut self.src)
} }
fn attrs(&self) -> SrcTypeList { fn src_types(&self) -> SrcTypeList {
let src_type = match self.op_type { let src_type = match self.op_type {
FloatType::F16 => SrcType::F16, FloatType::F16 => SrcType::F16,
FloatType::F32 => SrcType::F32, FloatType::F32 => SrcType::F32,
@ -4707,18 +4706,16 @@ pub struct OpF2F {
pub integer_rnd: bool, pub integer_rnd: bool,
} }
impl AsSlice<Src> for OpF2F { impl SrcsAsSlice for OpF2F {
type Attr = SrcType; fn srcs_as_slice(&self) -> &[Src] {
fn as_slice(&self) -> &[Src] {
std::slice::from_ref(&self.src) std::slice::from_ref(&self.src)
} }
fn as_mut_slice(&mut self) -> &mut [Src] { fn srcs_as_mut_slice(&mut self) -> &mut [Src] {
std::slice::from_mut(&mut self.src) std::slice::from_mut(&mut self.src)
} }
fn attrs(&self) -> SrcTypeList { fn src_types(&self) -> SrcTypeList {
let src_type = match self.src_type { let src_type = match self.src_type {
FloatType::F16 => SrcType::F16, FloatType::F16 => SrcType::F16,
FloatType::F32 => SrcType::F32, FloatType::F32 => SrcType::F32,
@ -4728,18 +4725,16 @@ impl AsSlice<Src> for OpF2F {
} }
} }
impl AsSlice<Dst> for OpF2F { impl DstsAsSlice for OpF2F {
type Attr = DstType; fn dsts_as_slice(&self) -> &[Dst] {
fn as_slice(&self) -> &[Dst] {
std::slice::from_ref(&self.dst) std::slice::from_ref(&self.dst)
} }
fn as_mut_slice(&mut self) -> &mut [Dst] { fn dsts_as_mut_slice(&mut self) -> &mut [Dst] {
std::slice::from_mut(&mut self.dst) std::slice::from_mut(&mut self.dst)
} }
fn attrs(&self) -> DstTypeList { fn dst_types(&self) -> DstTypeList {
let dst_type = match self.dst_type { let dst_type = match self.dst_type {
FloatType::F16 => DstType::F16, FloatType::F16 => DstType::F16,
FloatType::F32 => DstType::F32, FloatType::F32 => DstType::F32,
@ -4804,18 +4799,16 @@ pub struct OpF2I {
pub ftz: bool, pub ftz: bool,
} }
impl AsSlice<Src> for OpF2I { impl SrcsAsSlice for OpF2I {
type Attr = SrcType; fn srcs_as_slice(&self) -> &[Src] {
fn as_slice(&self) -> &[Src] {
std::slice::from_ref(&self.src) std::slice::from_ref(&self.src)
} }
fn as_mut_slice(&mut self) -> &mut [Src] { fn srcs_as_mut_slice(&mut self) -> &mut [Src] {
std::slice::from_mut(&mut self.src) std::slice::from_mut(&mut self.src)
} }
fn attrs(&self) -> SrcTypeList { fn src_types(&self) -> SrcTypeList {
let src_type = match self.src_type { let src_type = match self.src_type {
FloatType::F16 => SrcType::F16, FloatType::F16 => SrcType::F16,
FloatType::F32 => SrcType::F32, FloatType::F32 => SrcType::F32,
@ -4847,18 +4840,16 @@ pub struct OpI2F {
pub rnd_mode: FRndMode, pub rnd_mode: FRndMode,
} }
impl AsSlice<Src> for OpI2F { impl SrcsAsSlice for OpI2F {
type Attr = SrcType; fn srcs_as_slice(&self) -> &[Src] {
fn as_slice(&self) -> &[Src] {
std::slice::from_ref(&self.src) std::slice::from_ref(&self.src)
} }
fn as_mut_slice(&mut self) -> &mut [Src] { fn srcs_as_mut_slice(&mut self) -> &mut [Src] {
std::slice::from_mut(&mut self.src) std::slice::from_mut(&mut self.src)
} }
fn attrs(&self) -> SrcTypeList { fn src_types(&self) -> SrcTypeList {
if self.src_type.bits() <= 32 { if self.src_type.bits() <= 32 {
SrcTypeList::Uniform(SrcType::ALU) SrcTypeList::Uniform(SrcType::ALU)
} else { } else {
@ -4867,18 +4858,16 @@ impl AsSlice<Src> for OpI2F {
} }
} }
impl AsSlice<Dst> for OpI2F { impl DstsAsSlice for OpI2F {
type Attr = DstType; fn dsts_as_slice(&self) -> &[Dst] {
fn as_slice(&self) -> &[Dst] {
std::slice::from_ref(&self.dst) std::slice::from_ref(&self.dst)
} }
fn as_mut_slice(&mut self) -> &mut [Dst] { fn dsts_as_mut_slice(&mut self) -> &mut [Dst] {
std::slice::from_mut(&mut self.dst) std::slice::from_mut(&mut self.dst)
} }
fn attrs(&self) -> DstTypeList { fn dst_types(&self) -> DstTypeList {
let dst_type = match self.dst_type { let dst_type = match self.dst_type {
FloatType::F16 => DstType::F16, FloatType::F16 => DstType::F16,
FloatType::F32 => DstType::F32, FloatType::F32 => DstType::F32,
@ -4949,18 +4938,16 @@ pub struct OpFRnd {
pub ftz: bool, pub ftz: bool,
} }
impl AsSlice<Src> for OpFRnd { impl SrcsAsSlice for OpFRnd {
type Attr = SrcType; fn srcs_as_slice(&self) -> &[Src] {
fn as_slice(&self) -> &[Src] {
std::slice::from_ref(&self.src) std::slice::from_ref(&self.src)
} }
fn as_mut_slice(&mut self) -> &mut [Src] { fn srcs_as_mut_slice(&mut self) -> &mut [Src] {
std::slice::from_mut(&mut self.src) std::slice::from_mut(&mut self.src)
} }
fn attrs(&self) -> SrcTypeList { fn src_types(&self) -> SrcTypeList {
let src_type = match self.src_type { let src_type = match self.src_type {
FloatType::F16 => SrcType::F16, FloatType::F16 => SrcType::F16,
FloatType::F32 => SrcType::F32, FloatType::F32 => SrcType::F32,
@ -7799,18 +7786,16 @@ impl OpPhiSrcs {
} }
} }
impl AsSlice<Src> for OpPhiSrcs { impl SrcsAsSlice for OpPhiSrcs {
type Attr = SrcType; fn srcs_as_slice(&self) -> &[Src] {
fn as_slice(&self) -> &[Src] {
&self.srcs.b &self.srcs.b
} }
fn as_mut_slice(&mut self) -> &mut [Src] { fn srcs_as_mut_slice(&mut self) -> &mut [Src] {
&mut self.srcs.b &mut self.srcs.b
} }
fn attrs(&self) -> SrcTypeList { fn src_types(&self) -> SrcTypeList {
SrcTypeList::Uniform(SrcType::GPR) SrcTypeList::Uniform(SrcType::GPR)
} }
} }
@ -7848,18 +7833,16 @@ impl OpPhiDsts {
} }
} }
impl AsSlice<Dst> for OpPhiDsts { impl DstsAsSlice for OpPhiDsts {
type Attr = DstType; fn dsts_as_slice(&self) -> &[Dst] {
fn as_slice(&self) -> &[Dst] {
&self.dsts.b &self.dsts.b
} }
fn as_mut_slice(&mut self) -> &mut [Dst] { fn dsts_as_mut_slice(&mut self) -> &mut [Dst] {
&mut self.dsts.b &mut self.dsts.b
} }
fn attrs(&self) -> DstTypeList { fn dst_types(&self) -> DstTypeList {
DstTypeList::Uniform(DstType::Vec) DstTypeList::Uniform(DstType::Vec)
} }
} }
@ -7965,34 +7948,30 @@ impl OpParCopy {
} }
} }
impl AsSlice<Src> for OpParCopy { impl SrcsAsSlice for OpParCopy {
type Attr = SrcType; fn srcs_as_slice(&self) -> &[Src] {
fn as_slice(&self) -> &[Src] {
&self.dsts_srcs.b &self.dsts_srcs.b
} }
fn as_mut_slice(&mut self) -> &mut [Src] { fn srcs_as_mut_slice(&mut self) -> &mut [Src] {
&mut self.dsts_srcs.b &mut self.dsts_srcs.b
} }
fn attrs(&self) -> SrcTypeList { fn src_types(&self) -> SrcTypeList {
SrcTypeList::Uniform(SrcType::GPR) SrcTypeList::Uniform(SrcType::GPR)
} }
} }
impl AsSlice<Dst> for OpParCopy { impl DstsAsSlice for OpParCopy {
type Attr = DstType; fn dsts_as_slice(&self) -> &[Dst] {
fn as_slice(&self) -> &[Dst] {
&self.dsts_srcs.a &self.dsts_srcs.a
} }
fn as_mut_slice(&mut self) -> &mut [Dst] { fn dsts_as_mut_slice(&mut self) -> &mut [Dst] {
&mut self.dsts_srcs.a &mut self.dsts_srcs.a
} }
fn attrs(&self) -> DstTypeList { fn dst_types(&self) -> DstTypeList {
DstTypeList::Uniform(DstType::Vec) DstTypeList::Uniform(DstType::Vec)
} }
} }
@ -8021,18 +8000,16 @@ pub struct OpRegOut {
pub srcs: Vec<Src>, pub srcs: Vec<Src>,
} }
impl AsSlice<Src> for OpRegOut { impl SrcsAsSlice for OpRegOut {
type Attr = SrcType; fn srcs_as_slice(&self) -> &[Src] {
fn as_slice(&self) -> &[Src] {
&self.srcs &self.srcs
} }
fn as_mut_slice(&mut self) -> &mut [Src] { fn srcs_as_mut_slice(&mut self) -> &mut [Src] {
&mut self.srcs &mut self.srcs
} }
fn attrs(&self) -> SrcTypeList { fn src_types(&self) -> SrcTypeList {
SrcTypeList::Uniform(SrcType::GPR) SrcTypeList::Uniform(SrcType::GPR)
} }
} }