//! AMX matrix coprocessor driver.
//!
//! The Apple AMX unit is a per-thread, undocumented coprocessor present
//! on all Apple Silicon chips. It exposes 8 X rows, 8 Y rows, and 8 Z
//! rows of 64 bytes each, plus a set of fused multiply-accumulate
//! instructions that operate on these registers.
//!
//! [`Matrix`] is the safe entry point: constructing one calls AMX_SET,
//! and dropping it calls AMX_CLR.

pub mod asm;
pub mod fma;
pub mod kern;
pub mod ops;
pub mod regs;
pub mod tile;
pub mod tile_f16;

pub use regs::{XRow, YRow, ZRow, ALL_X, ALL_Y, ALL_Z};

use core::marker::PhantomData;

/// A live AMX coprocessor context.
///
/// Creating an `Matrix` activates the AMX unit on the current thread
/// (AMX_SET). Dropping it deactivates the unit (AMX_CLR). The type is
/// `!Send` and `!Sync` because AMX state is per-thread.
///
/// All AMX operations are methods on this struct, ensuring at compile
/// time that the coprocessor is active.
pub struct Matrix {
    /// `PhantomData<*const ()>` makes the type `!Send + !Sync`.
    _not_send_sync: PhantomData<*const ()>,
}

impl Matrix {
    /// Activate the AMX coprocessor on the current thread.
    ///
    /// # Errors
    ///
    /// Returns [`CpuError::AmxSetFailed`] if the current hardware does
    /// not support AMX (non-Apple-Silicon or virtualised without AMX
    /// passthrough).
    ///
    /// # Safety
    ///
    /// Only one `Matrix` should be live per thread at a time. Creating
    /// a second one is not undefined behaviour but wastes a SET/CLR
    /// pair and the register state from the first context becomes
    /// shared, which is confusing.
    #[inline]
    pub fn new() -> crate::Result<Self> {
        // AMX_SET can only fail on non-Apple-Silicon, where the .word
        // encoding is an illegal instruction, so we cannot easily
        // detect failure after the fact (it would SIGILL). We rely on
        // the probe module having been checked beforehand, but still
        // wrap for API consistency.
        unsafe {
            asm::amx_set();
        }
        Ok(Self {
            _not_send_sync: PhantomData,
        })
    }
}

impl Drop for Matrix {
    #[inline]
    fn drop(&mut self) {
        unsafe {
            asm::amx_clr();
        }
    }
}

Synonyms

trident/src/typecheck/mod.rs
optica/src/scanner/mod.rs
optica/src/output/mod.rs
trident/src/package/mod.rs
trident/src/gpu/mod.rs
trident/src/ir/mod.rs
trident/src/api/mod.rs
trident/src/config/mod.rs
trident/src/import/mod.rs
optica/src/query/mod.rs
trident/src/runtime/mod.rs
optica/src/render/mod.rs
nox/rs/noun/mod.rs
optica/src/server/mod.rs
trident/src/cost/mod.rs
trident/src/syntax/mod.rs
trident/src/field/mod.rs
nox/rs/patterns/mod.rs
optica/src/parser/mod.rs
trident/src/cli/mod.rs
trident/src/compile/mod.rs
trident/src/neural/mod.rs
trident/src/verify/mod.rs
optica/src/graph/mod.rs
trident/src/diagnostic/mod.rs
trident/src/lsp/mod.rs
trident/src/deploy/mod.rs
trident/src/ast/mod.rs
trident/src/neural/training/mod.rs
trident/src/verify/report/mod.rs
honeycrisp/acpu/src/pulse/mod.rs
trident/src/syntax/lexer/mod.rs
trident/src/ir/tir/mod.rs
trident/src/cost/model/mod.rs
rs/rsc/src/lints/mod.rs
trident/src/lsp/util/mod.rs
trident/src/neural/data/mod.rs
bostrom-mcp/rust/src/tools/mod.rs
rs/core/src/bounded/mod.rs
trident/src/package/store/mod.rs
bostrom-mcp/rust/src/proto/mod.rs
radio/iroh-blobs/examples/common/mod.rs
trident/src/syntax/parser/mod.rs
honeycrisp/acpu/src/probe/mod.rs
bostrom-mcp/rust/src/clients/mod.rs
trident/src/verify/smt/mod.rs
trident/src/typecheck/tests/mod.rs
trident/src/config/scaffold/mod.rs
trident/src/syntax/format/mod.rs
trident/src/lsp/semantic/mod.rs
trident/src/neural/model/mod.rs
honeycrisp/acpu/src/crypto/mod.rs
trident/src/package/hash/mod.rs
honeycrisp/rane/src/mil/mod.rs
honeycrisp/aruminium/src/ffi/mod.rs
strata/nebu/rs/extension/mod.rs
trident/src/ir/tree/mod.rs
trident/src/neural/inference/mod.rs
trident/src/verify/synthesize/mod.rs
trident/src/cost/stack_verifier/mod.rs
rs/macros/src/addressed/mod.rs
trident/src/verify/sym/mod.rs
rs/core/src/fixed_point/mod.rs
trident/src/config/resolve/mod.rs
honeycrisp/acpu/src/sync/mod.rs
trident/src/package/registry/mod.rs
trident/src/syntax/grammar/mod.rs
honeycrisp/acpu/src/gemm/mod.rs
radio/iroh-blobs/src/store/mod.rs
trident/src/verify/equiv/mod.rs
honeycrisp/acpu/src/vector/mod.rs
trident/src/package/manifest/mod.rs
rs/macros/src/registers/mod.rs
honeycrisp/acpu/src/field/mod.rs
trident/src/ir/kir/mod.rs
radio/cyber-bao/src/io/mod.rs
trident/src/ir/lir/mod.rs
trident/src/api/tests/mod.rs
rs/macros/src/cell/mod.rs
honeycrisp/acpu/src/numeric/mod.rs
trident/src/verify/solve/mod.rs
trident/src/ir/lir/lower/mod.rs
trident/src/ir/tir/neural/mod.rs
cyb/cyb/cyb-shell/src/shell/mod.rs
trident/src/ir/tree/lower/mod.rs
cw-cyber/packages/cyber-std/src/tokenfactory/mod.rs
strata/trop/wgsl/src/shaders/mod.rs
trident/src/ir/tir/stack/mod.rs
cw-cyber/contracts/cybernet/src/tests/mod.rs
trident/src/syntax/parser/tests/mod.rs
trident/src/ir/tir/lower/mod.rs
cyb/cyb/cyb-shell/src/worlds/mod.rs
trident/src/neural/data/tir_graph/mod.rs
cyb/cyb/cyb-shell/src/agent/mod.rs
trident/src/ir/tir/optimize/mod.rs
strata/genies/wgsl/src/shaders/mod.rs
trident/src/ir/kir/lower/mod.rs
strata/jali/wgsl/src/shaders/mod.rs
strata/kuro/wgsl/src/shaders/mod.rs
trident/src/ir/tir/builder/mod.rs

Neighbours