From 4c1d579db4f1778502f8defe217486a2cf1fdf5f Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Wed, 27 May 2026 13:52:39 -0400 Subject: [PATCH] kraid/isa: Specially handle small_constant_t Part-of: --- src/panfrost/compiler/kraid/isa.rs | 6 ++++ src/panfrost/compiler/kraid/proc/isa/enums.rs | 36 +++++++++++++++++++ src/panfrost/compiler/kraid/proc/isa/xml.rs | 20 ++++++++++- 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/panfrost/compiler/kraid/isa.rs b/src/panfrost/compiler/kraid/isa.rs index db888882354..a8d2beb7506 100644 --- a/src/panfrost/compiler/kraid/isa.rs +++ b/src/panfrost/compiler/kraid/isa.rs @@ -64,6 +64,12 @@ pub trait TryDecode: Sized { fn try_decode(value: T, arch: u8) -> Result; } +pub trait SmallConstantTable: TryDecode { + const TABLE_LEN: u8; + fn name(&self) -> &'static str; + fn const_value(&self) -> u32; +} + #[derive(Clone, Copy)] pub struct EncodedSrc { pub encoded: u8, diff --git a/src/panfrost/compiler/kraid/proc/isa/enums.rs b/src/panfrost/compiler/kraid/proc/isa/enums.rs index 69458c13a56..82ad97d45cb 100644 --- a/src/panfrost/compiler/kraid/proc/isa/enums.rs +++ b/src/panfrost/compiler/kraid/proc/isa/enums.rs @@ -15,6 +15,7 @@ pub struct EnumValue { pub arch: ArchSet, pub canonical: bool, pub value: u8, + pub const_value: Option, } impl EnumValue { @@ -38,6 +39,7 @@ impl EnumValue { .get_u8_attr("value") .ok_or(err("Enum value has no value"))? .into(), + const_value: xml.get_u32_attr("const_value"), }) } @@ -245,6 +247,40 @@ impl Enum { }); } + if self.name == "small_constant_t" { + let mut const_name_cases_ts = TokenStream2::new(); + let mut const_value_cases_ts = TokenStream2::new(); + for v in self.values.values() { + let v_name = &v.name; + let v_ident = &v.ident; + let const_value = v.const_value.unwrap(); + const_name_cases_ts.extend(quote! { + #e_ident::#v_ident => #v_name, + }); + const_value_cases_ts.extend(quote! { + #e_ident::#v_ident => #const_value, + }); + } + let table_len = max_value + 1; + ts.extend(quote! { + impl SmallConstantTable for #e_ident { + const TABLE_LEN: u8 = #table_len; + + fn name(&self) -> &'static str { + match self { + #const_name_cases_ts + } + } + + fn const_value(&self) -> u32 { + match self { + #const_value_cases_ts + } + } + } + }); + } + // Add a per-value arch array which we'll use for TryEncode/Decode if unique_values { diff --git a/src/panfrost/compiler/kraid/proc/isa/xml.rs b/src/panfrost/compiler/kraid/proc/isa/xml.rs index ff54ca104b9..60d294b5368 100644 --- a/src/panfrost/compiler/kraid/proc/isa/xml.rs +++ b/src/panfrost/compiler/kraid/proc/isa/xml.rs @@ -7,6 +7,16 @@ use xml::attribute::OwnedAttribute; use xml::name::OwnedName; use xml::reader::{EventReader, XmlEvent}; +fn split_str_radix(s: &str) -> (&str, u32) { + if s.starts_with("0x") || s.starts_with("0X") { + (&s[2..], 16) + } else if s.starts_with("0b") || s.starts_with("0B") { + (&s[2..], 2) + } else { + (s, 10) + } +} + /// A very simpl DOM pub struct XmlElement { pub name: OwnedName, @@ -73,7 +83,15 @@ impl XmlElement { pub fn get_u8_attr(&self, name: &str) -> Option { let s = self.attrs.get(name)?; - let u = u8::from_str_radix(s, 10).unwrap(); + let (s, r) = split_str_radix(s); + let u = u8::from_str_radix(s, r).unwrap(); + Some(u) + } + + pub fn get_u32_attr(&self, name: &str) -> Option { + let s = self.attrs.get(name)?; + let (s, r) = split_str_radix(s); + let u = u32::from_str_radix(s, r).unwrap(); Some(u) }