//! CPU reference library โ€” every op in pure Rust f32.
//!
//! This is the correctness authority. GPU backends are verified against
//! these outputs. The library is also the fallback inside wgpu+rs for
//! ops the GPU cannot dispatch.
//!
//! Spec: specs/ops.md

use crate::backend::{Backend, BackendError, BackendKind};
use crate::core::dtype::DType;
use crate::core::op::Op;
use crate::core::tensor::{Tensor, TensorData};
use std::sync::Arc;

mod matmul;
mod rmsnorm;
mod rope;
mod softmax;
mod activation;
pub mod quant;
pub mod quant_matmul;

pub use matmul::matmul_f32;
pub use rmsnorm::rms_norm_f32;
pub use rope::rope_f32;
pub use softmax::softmax_f32;
pub use activation::{silu_f32, gelu_erf_f32, gelu_tanh_f32, swiglu_f32};
pub use quant::dequantize_to_f32;
pub use quant_matmul::matmul_quant_f32;

/// CPU reference backend โ€” implements every op correctly in f32.
pub struct CpuBackend;

impl CpuBackend {
    pub fn new() -> Self {
        Self
    }
}

impl Default for CpuBackend {
    fn default() -> Self {
        Self::new()
    }
}

impl Backend for CpuBackend {
    fn kind(&self) -> BackendKind {
        BackendKind::Cpu
    }

    fn supports(&self, _op: &Op, _inputs: &[&Tensor]) -> bool {
        // CPU supports every op by design (v1 scope).
        // If an op is not yet implemented, execute() returns UnsupportedOp.
        true
    }

    fn execute(&self, op: &Op, inputs: &[&Tensor]) -> Result<Vec<Tensor>, BackendError> {
        match op {
            Op::RmsNorm { eps } => {
                let [x, g] = require(inputs, 2, op)?;
                let out = rms_norm_f32(x, g, *eps)?;
                Ok(vec![out])
            }
            Op::Matmul => {
                let [x, w] = require(inputs, 2, op)?;
                let out = matmul_f32(x, w)?;
                Ok(vec![out])
            }
            Op::Rope { head_dim, rope_dim, base } => {
                // x, pos_ids
                let [x, pos] = require(inputs, 2, op)?;
                let out = rope_f32(x, pos, *head_dim as usize, *rope_dim as usize, *base)?;
                Ok(vec![out])
            }
            Op::Softmax { dim } => {
                let [x] = require(inputs, 1, op)?;
                let out = softmax_f32(x, *dim)?;
                Ok(vec![out])
            }
            Op::Silu => {
                let [x] = require(inputs, 1, op)?;
                let out = silu_f32(x)?;
                Ok(vec![out])
            }
            Op::Gelu { approximate } => {
                let [x] = require(inputs, 1, op)?;
                let out = if *approximate { gelu_tanh_f32(x)? } else { gelu_erf_f32(x)? };
                Ok(vec![out])
            }
            Op::Add => {
                let [a, b] = require(inputs, 2, op)?;
                let out = binary_broadcast(a, b, |x, y| x + y)?;
                Ok(vec![out])
            }
            Op::Mul => {
                let [a, b] = require(inputs, 2, op)?;
                let out = binary_broadcast(a, b, |x, y| x * y)?;
                Ok(vec![out])
            }
            Op::Sub => {
                let [a, b] = require(inputs, 2, op)?;
                let out = binary_broadcast(a, b, |x, y| x - y)?;
                Ok(vec![out])
            }
            Op::SwiGlu => {
                // inputs: x, W_gate, W_up, W_down
                let [x, wg, wu, wd] = require(inputs, 4, op)?;
                let out = swiglu_f32(x, wg, wu, wd)?;
                Ok(vec![out])
            }
            Op::Sdpa { num_heads, kv_heads, head_dim, .. } => {
                // Q: [num_heads, head_dim]
                // K: [total_seq, kv_heads * head_dim]
                // V: [total_seq, kv_heads * head_dim]
                // Output: [num_heads, head_dim]
                let [q, k, v] = require(inputs, 3, op)?;
                let nh = *num_heads as usize;
                let kvh = *kv_heads as usize;
                let hd = *head_dim as usize;
                let groups = if kvh == 0 { 1 } else { nh / kvh };
                let kv_flat = kvh * hd;
                let total_seq = if k.shape.len() >= 1 { k.shape[0] } else { 1 };
                let scale = (hd as f32).sqrt().recip();

                let q_data = q.as_f32();
                let k_data = k.as_f32();
                let v_data = v.as_f32();
                let mut out = vec![0f32; nh * hd];

                for h in 0..nh {
                    let kv_head = h / groups;
                    let q_h = &q_data[h * hd..(h + 1) * hd];

                    let mut scores: Vec<f32> = (0..total_seq)
                        .map(|t| {
                            let k_off = t * kv_flat + kv_head * hd;
                            let k_slice = &k_data[k_off..k_off + hd];
                            q_h.iter().zip(k_slice).map(|(a, b)| a * b).sum::<f32>() * scale
                        })
                        .collect();

                    let max = scores.iter().cloned().fold(f32::NEG_INFINITY, f32::max);
                    let mut sum = 0f32;
                    for s in scores.iter_mut() { *s = (*s - max).exp(); sum += *s; }
                    if sum > 0.0 { for s in scores.iter_mut() { *s /= sum; } }

                    let out_h = &mut out[h * hd..(h + 1) * hd];
                    for t in 0..total_seq {
                        let v_off = t * kv_flat + kv_head * hd;
                        let v_slice = &v_data[v_off..v_off + hd];
                        for d in 0..hd { out_h[d] += scores[t] * v_slice[d]; }
                    }
                }

                Ok(vec![Tensor::from_f32(vec![nh, hd], out)])
            }
            other => Err(BackendError::UnsupportedOp {
                backend: "cpu",
                op: other.name(),
                input_dtype: inputs.first().map(|t| t.dtype).unwrap_or(DType::F32),
            }),
        }
    }

    fn upload(
        &self,
        bytes: &[u8],
        shape: Vec<usize>,
        dtype: DType,
    ) -> Result<Tensor, BackendError> {
        // CPU "upload" = zero-copy host Tensor construction.
        Ok(Tensor {
            shape,
            dtype,
            data: TensorData::Host(Arc::new(bytes.to_vec())),
        })
    }

    fn download_f32(&self, t: &Tensor) -> Result<Vec<f32>, BackendError> {
        if t.dtype == DType::F32 {
            return Ok(t.to_f32_vec());
        }
        let bytes = t.as_host_bytes().ok_or_else(|| {
            BackendError::Internal("cpu download_f32: backend-resident tensor".into())
        })?;
        Ok(quant::dequantize_to_f32(bytes, t.dtype))
    }
}

/// Helper: require exactly N inputs, return fixed-size array.
fn require<'a, const N: usize>(
    inputs: &[&'a Tensor],
    n: usize,
    op: &Op,
) -> Result<[&'a Tensor; N], BackendError> {
    assert_eq!(N, n, "require<N>: n must match N");
    if inputs.len() != N {
        return Err(BackendError::InvalidInput {
            op: op.name(),
            reason: format!("expected {N} inputs, got {}", inputs.len()),
        });
    }
    let arr: [&'a Tensor; N] = std::array::from_fn(|i| inputs[i]);
    Ok(arr)
}

/// Element-wise binary op with NumPy broadcasting rules.
fn binary_broadcast(a: &Tensor, b: &Tensor, f: impl Fn(f32, f32) -> f32) -> Result<Tensor, BackendError> {
    let (out_shape, a_strides, b_strides) = broadcast_shapes(&a.shape, &b.shape)
        .ok_or_else(|| BackendError::ShapeMismatch {
            op: "binary_broadcast",
            expected: a.shape.clone(),
            got: b.shape.clone(),
        })?;
    let n: usize = out_shape.iter().product();
    let a_data = a.as_f32();
    let b_data = b.as_f32();
    let mut out = vec![0f32; n];
    for idx in 0..n {
        let ai = strided_index(idx, &out_shape, &a_strides);
        let bi = strided_index(idx, &out_shape, &b_strides);
        out[idx] = f(a_data[ai], b_data[bi]);
    }
    Ok(Tensor::from_f32(out_shape, out))
}

/// Compute broadcast output shape and per-input strides (0 where a dim broadcasts).
fn broadcast_shapes(a: &[usize], b: &[usize]) -> Option<(Vec<usize>, Vec<usize>, Vec<usize>)> {
    let rank = a.len().max(b.len());
    let a_pad: Vec<usize> = std::iter::repeat(1).take(rank - a.len()).chain(a.iter().copied()).collect();
    let b_pad: Vec<usize> = std::iter::repeat(1).take(rank - b.len()).chain(b.iter().copied()).collect();
    let mut out_shape = Vec::with_capacity(rank);
    for i in 0..rank {
        if a_pad[i] == b_pad[i] {
            out_shape.push(a_pad[i]);
        } else if a_pad[i] == 1 {
            out_shape.push(b_pad[i]);
        } else if b_pad[i] == 1 {
            out_shape.push(a_pad[i]);
        } else {
            return None;
        }
    }
    // Strides for broadcasting: 0 where input dim == 1, else normal stride.
    let real_strides = |shape: &[usize]| -> Vec<usize> {
        let mut s = vec![0usize; rank];
        let mut stride = 1usize;
        for i in (0..rank).rev() {
            let dim = if i < rank - shape.len() { 1 } else { shape[i - (rank - shape.len())] };
            s[i] = if dim == 1 { 0 } else { stride };
            stride *= dim;
        }
        s
    };
    Some((out_shape, real_strides(a), real_strides(b)))
}

/// Map a flat output index to the input's strided address.
fn strided_index(flat: usize, out_shape: &[usize], strides: &[usize]) -> usize {
    let mut rem = flat;
    let mut addr = 0usize;
    for i in 0..out_shape.len() {
        let div: usize = out_shape[i + 1..].iter().product();
        let coord = rem / div;
        rem %= div;
        addr += coord * strides[i];
    }
    addr
}

Homonyms

cyberia/src/components/mod.rs
cyberia/src/pages/mod.rs
cyb/optica/src/output/mod.rs
neural/trident/src/compile/mod.rs
cyb/optica/src/parser/mod.rs
soft3/nox/rs/data/mod.rs
neural/trident/src/api/mod.rs
soft3/mir/src/graph/mod.rs
cyb/optica/src/render/mod.rs
cyb/optica/src/scanner/mod.rs
soft3/cybergraph/tests/common/mod.rs
neural/trident/src/verify/mod.rs
soft3/tru/rs/model/mod.rs
neural/trident/src/diagnostic/mod.rs
soft3/mudra/src/proof/mod.rs
cyb/optica/src/graph/mod.rs
soft3/glia/import/loader/mod.rs
soft3/glia/run/backend/mod.rs
neural/trident/src/import/mod.rs
soft3/tru/rs/pass/mod.rs
soft3/mir/src/bevy/mod.rs
neural/trident/src/package/mod.rs
neural/trident/src/lsp/mod.rs
neural/trident/src/field/mod.rs
cyb/prysm/atoms/rs/mod.rs
soft3/tru/rs/graph/mod.rs
neural/trident/src/deploy/mod.rs
soft3/mir/src/epoch/mod.rs
neural/trident/src/runtime/mod.rs
soft3/glia/run/arch/mod.rs
neural/trident/src/typecheck/mod.rs
neural/trident/src/gpu/mod.rs
soft3/nox/rs/jets/mod.rs
soft3/glia/run/tokenizer/mod.rs
soft3/mir/src/frame/mod.rs
neural/trident/src/ir/mod.rs
neural/trident/src/config/mod.rs
soft3/nox/rs/patterns/mod.rs
neural/trident/src/cost/mod.rs
soft3/glia/run/ir/mod.rs
neural/trident/src/cli/mod.rs
soft3/tru/rs/focusing/mod.rs
neural/trident/src/neural/mod.rs
cyb/optica/src/query/mod.rs
cyb/prysm/system/rs/mod.rs
neural/trident/src/ast/mod.rs
soft3/glia/run/bench/mod.rs
cyb/prysm/molecules/rs/mod.rs
cyb/optica/src/server/mod.rs
soft3/glia/run/core/mod.rs
neural/trident/src/syntax/mod.rs
cyb/honeycrisp/acpu/src/vector/mod.rs
soft3/zheng/rs/src/spartan/mod.rs
soft3/bbg/rs/src/storage/mod.rs
neural/trident/src/config/resolve/mod.rs
cyb/honeycrisp/aruminium/src/ffi/mod.rs
cyb/cyb/cyb-shell/src/worlds/mod.rs
cyb/wysm/crates/wasi/tests/mod.rs
soft3/zheng/rs/src/ccs/mod.rs
neural/trident/src/package/store/mod.rs
cyb/cyb/cyb-shell/src/shell/mod.rs
cyb/wysm/crates/wasmi/tests/mod.rs
neural/trident/src/verify/synthesize/mod.rs
cyb/honeycrisp/acpu/src/field/mod.rs
neural/rs/macros/src/addressed/mod.rs
soft3/glia/run/cli/cmd/mod.rs
neural/trident/src/cost/stack_verifier/mod.rs
neural/eidos/rs/src/stdlib/mod.rs
neural/trident/src/verify/sym/mod.rs
neural/trident/src/syntax/format/mod.rs
neural/trident/src/syntax/grammar/mod.rs
neural/trident/src/lsp/util/mod.rs
neural/rs/rsc/src/lints/mod.rs
neural/trident/src/typecheck/tests/mod.rs
neural/eidos/rs/src/surface/mod.rs
soft3/mir/src/frame/tiers/mod.rs
cyb/honeycrisp/acpu/src/pulse/mod.rs
neural/trident/src/ir/lir/mod.rs
neural/trident/src/package/registry/mod.rs
neural/trident/src/neural/model/mod.rs
neural/trident/src/package/hash/mod.rs
cyb/honeycrisp/acpu/src/sync/mod.rs
soft3/glia/run/arch/decoder/mod.rs
neural/trident/src/verify/report/mod.rs
neural/trident/src/ir/tir/mod.rs
cyb/honeycrisp/rane/src/mil/mod.rs
cyb/honeycrisp/acpu/src/crypto/mod.rs
soft3/zheng/rs/src/folding/mod.rs
neural/trident/src/ir/tree/mod.rs
cyb/honeycrisp/acpu/src/matrix/mod.rs
soft3/glia/run/backend/honeycrisp/mod.rs
neural/eidos/rs/src/elab/mod.rs
neural/rs/macros/src/registers/mod.rs
neural/trident/src/verify/solve/mod.rs
neural/rs/core/src/fixed_point/mod.rs
neural/trident/src/syntax/parser/mod.rs
neural/trident/src/neural/data/mod.rs
neural/trident/src/verify/smt/mod.rs
soft3/radio/iroh-blobs/examples/common/mod.rs
soft3/strata/nebu/rs/extension/mod.rs
neural/rs/darwin-sys/src/ffi/mod.rs
cyb/honeycrisp/acpu/src/sparse/mod.rs
soft3/glia/run/backend/wgpu/mod.rs
neural/rs/core/src/bounded/mod.rs
neural/eidos/rs/src/tactic_ext/mod.rs
neural/trident/src/cost/model/mod.rs
cyb/wysm/crates/wast/tests/mod.rs
soft3/radio/iroh-blobs/src/store/mod.rs
neural/trident/src/package/manifest/mod.rs
cyb/cyb/cyb-shell/src/agent/mod.rs
neural/trident/src/neural/training/mod.rs
neural/trident/src/verify/equiv/mod.rs
neural/trident/src/syntax/lexer/mod.rs
cyb/honeycrisp/acpu/src/numeric/mod.rs
soft3/radio/cyber-bao/src/io/mod.rs
neural/trident/src/ir/kir/mod.rs
cyb/honeycrisp/aruminium/src/render/mod.rs
neural/trident/src/neural/inference/mod.rs
cyb/honeycrisp/acpu/src/probe/mod.rs
neural/trident/src/api/tests/mod.rs
cyb/honeycrisp/acpu/src/gemm/mod.rs
soft3/nox/rs/jets/backends/mod.rs
neural/trident/src/lsp/semantic/mod.rs
neural/rs/macros/src/cell/mod.rs
neural/trident/src/config/scaffold/mod.rs
soft3/zheng/rs/src/sumcheck/mod.rs
cyb/evy/forks/bevy_ecs/src/entity/mod.rs
neural/trident/src/ir/tir/builder/mod.rs
cyb/evy/forks/bevy_ecs/src/system/mod.rs
cyb/evy/forks/bevy_sprite_render/src/render/mod.rs
soft3/strata/jali/wgsl/src/shaders/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/tonemapping/mod.rs
cyb/evy/forks/bevy_anti_alias/src/dlss/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/skybox/mod.rs
cyb/evy/forks/bevy_sprite_render/src/text2d/mod.rs
cyb/evy/forks/bevy_render/src/batching/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/experimental/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/oit/mod.rs
cyb/evy/forks/bevy_sprite_render/src/tilemap_chunk/mod.rs
cyb/evy/forks/bevy_pbr/src/atmosphere/mod.rs
cyb/evy/forks/bevy_post_process/src/motion_blur/mod.rs
cyb/wysm/crates/wasmi/src/store/mod.rs
cyb/evy/forks/bevy_render/src/render_graph/mod.rs
cyb/wysm/crates/wasmi/benches/bench/mod.rs
cyb/evy/forks/bevy_anti_alias/src/contrast_adaptive_sharpening/mod.rs
neural/trident/src/ir/tir/stack/mod.rs
cyb/evy/forks/bevy_render/src/texture/mod.rs
cyb/wysm/crates/c_api/src/types/mod.rs
soft3/strata/genies/wgsl/src/shaders/mod.rs
cyb/wysm/crates/core/src/memory/mod.rs
bootloader/go-cyber/mcp/rust/src/proto/mod.rs
cyb/evy/forks/bevy_ecs/src/bundle/mod.rs
cyb/evy/forks/bevy_mesh/src/primitives/mod.rs
cyb/evy/forks/bevy_ecs/src/schedule/mod.rs
cyb/wysm/crates/wasmi/src/module/mod.rs
cyb/evy/forks/bevy_sprite/src/texture_slice/mod.rs
cyb/evy/forks/bevy_ecs/src/observer/mod.rs
neural/trident/src/ir/tir/neural/mod.rs
cyb/evy/forks/bevy_render/src/view/mod.rs
neural/trident/src/ir/lir/lower/mod.rs
cyb/evy/forks/bevy_anti_alias/src/smaa/mod.rs
bootloader/go-cyber/mcp/rust/src/clients/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/fullscreen_vertex_shader/mod.rs
cyb/wysm/crates/wasmi/tests/integration/mod.rs
cyb/wysm/crates/ir/src/decode/mod.rs
cyb/wysm/crates/wasmi/src/memory/mod.rs
cyb/evy/crates/evy_prysm_core/src/layout/mod.rs
cyb/evy/forks/bevy_anti_alias/src/fxaa/mod.rs
cyb/evy/forks/bevy_pbr/src/prepass/mod.rs
cyb/evy/forks/bevy_render/src/render_resource/mod.rs
cyb/evy/forks/bevy_ecs/src/query/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/core_2d/mod.rs
cyb/wysm/crates/cli/src/commands/mod.rs
cyb/evy/forks/bevy_render/src/renderer/mod.rs
cyb/wysm/crates/collections/src/arena/mod.rs
cyb/evy/forks/bevy_post_process/src/effect_stack/mod.rs
cyb/evy/forks/bevy_ecs/src/change_detection/mod.rs
cyb/evy/forks/bevy_pbr/src/ssao/mod.rs
cyb/evy/forks/naga/src/keywords/mod.rs
cyb/evy/forks/naga/src/compact/mod.rs
neural/trident/src/ir/tir/lower/mod.rs
cyb/evy/forks/bevy_pbr/src/render/mod.rs
cyb/evy/forks/bevy_ecs/src/world/mod.rs
cyb/evy/forks/bevy_anti_alias/src/taa/mod.rs
cyb/evy/forks/bevy_ecs/src/reflect/mod.rs
soft3/strata/kuro/wgsl/src/shaders/mod.rs
cyb/evy/forks/bevy_ecs/src/error/mod.rs
neural/trident/src/ir/kir/lower/mod.rs
cyb/evy/forks/naga/src/proc/mod.rs
cyb/evy/forks/bevy_ecs/src/event/mod.rs
cyb/evy/forks/bevy_ecs/src/component/mod.rs
cyb/evy/forks/bevy_sprite_render/src/mesh2d/mod.rs
cyb/evy/forks/bevy_ecs/src/relationship/mod.rs
cyb/wysm/crates/wasmi/src/instance/mod.rs
cyb/evy/forks/bevy_pbr/src/ssr/mod.rs
bootloader/go-cyber/mcp/rust/src/tools/mod.rs
soft3/glia/run/backend/honeycrisp/kernels/mod.rs
cyb/evy/forks/naga/src/back/mod.rs
soft3/glia/run/backend/cpu/quant/mod.rs
cyb/wysm/crates/core/src/table/mod.rs
cyb/evy/forks/bevy_post_process/src/dof/mod.rs
cyb/evy/forks/bevy_pbr/src/light_probe/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/prepass/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/upscaling/mod.rs
cyb/wysm/crates/wasmi/src/table/mod.rs
cyb/evy/forks/bevy_post_process/src/bloom/mod.rs
cyb/evy/forks/bevy_pbr/src/lightmap/mod.rs
neural/trident/src/ir/tir/optimize/mod.rs
cyb/evy/forks/bevy_gizmos/src/primitives/mod.rs
cyb/evy/forks/bevy_post_process/src/auto_exposure/mod.rs
neural/trident/src/neural/data/tir_graph/mod.rs
cyb/evy/forks/bevy_render/src/experimental/mod.rs
cyb/wysm/crates/wasmi/src/engine/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/deferred/mod.rs
cyb/evy/forks/naga/src/arena/mod.rs
cyb/evy/forks/bevy_render/src/diagnostic/mod.rs
cyb/evy/forks/bevy_render/src/render_phase/mod.rs
cyb/evy/forks/bevy_transform/src/components/mod.rs
soft3/strata/trop/wgsl/src/shaders/mod.rs
soft3/glia/run/backend/wgpu/kernels/mod.rs
cyb/evy/forks/bevy_sprite_render/src/texture_slice/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/core_3d/mod.rs
cyb/evy/forks/bevy_render/src/mesh/mod.rs
neural/trident/src/ir/tree/lower/mod.rs
cyb/evy/forks/bevy_pbr/src/volumetric_fog/mod.rs
cyb/evy/forks/bevy_pbr/src/decal/mod.rs
cyb/wysm/crates/fuzz/src/oracle/mod.rs
cyb/evy/forks/bevy_ecs/src/message/mod.rs
cyb/evy/forks/naga/src/valid/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/blit/mod.rs
cyb/evy/forks/naga/src/front/mod.rs
cyb/wysm/crates/wasi/src/sync/mod.rs
cyb/evy/forks/bevy_pbr/src/meshlet/mod.rs
cyb/evy/forks/bevy_pbr/src/deferred/mod.rs
neural/trident/src/syntax/parser/tests/mod.rs
cyb/evy/forks/bevy_ecs/src/storage/mod.rs
cyb/evy/forks/bevy_tasks/src/iter/mod.rs
soft3/glia/run/arch/decoder/families/mod.rs
cyb/wysm/crates/wasmi/src/func/mod.rs
cyb/evy/forks/naga/src/common/mod.rs
cyb/evy/forks/naga/src/front/wgsl/mod.rs
cyb/evy/forks/naga/src/back/spv/mod.rs
cyb/evy/forks/naga/src/back/dot/mod.rs
cyb/evy/forks/bevy_render/src/view/window/mod.rs
cyb/wysm/crates/wasi/src/sync/snapshots/mod.rs
cyb/evy/forks/bevy_render/src/experimental/occlusion_culling/mod.rs
cyb/evy/forks/bevy_ecs/src/schedule/graph/mod.rs
cyb/wysm/crates/wasmi/src/engine/translator/mod.rs
cyb/wysm/crates/wasmi/src/module/parser/mod.rs
cyb/wysm/crates/wasmi/src/engine/limits/mod.rs
cyb/wysm/crates/wasmi/src/engine/executor/mod.rs
cyb/evy/forks/bevy_ecs/src/system/commands/mod.rs
cyb/evy/forks/naga/src/back/wgsl/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/oit/resolve/mod.rs
cyb/wysm/crates/wasmi/src/module/instantiate/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/experimental/mip_generation/mod.rs
cyb/evy/forks/bevy_ecs/src/storage/table/mod.rs
bootloader/go-cyber/cw/packages/cyber-std/src/tokenfactory/mod.rs
cyb/evy/forks/bevy_render/src/view/visibility/mod.rs
cyb/evy/forks/bevy_ecs/src/schedule/executor/mod.rs
cyb/evy/forks/naga/src/front/spv/mod.rs
cyb/evy/forks/naga/src/back/msl/mod.rs
cyb/evy/forks/naga/src/front/glsl/mod.rs
cyb/evy/forks/bevy_ecs/src/world/entity_access/mod.rs
cyb/evy/forks/bevy_mesh/src/primitives/dim3/mod.rs
cyb/evy/forks/naga/src/back/glsl/mod.rs
cyb/evy/forks/naga/src/back/hlsl/mod.rs
struct Baz { m: mat3x2, } struct Baz { float2 m_0; float2 m_1; float2 m_2; }; float3x2 GetMatmOnBaz(Baz obj) { return float3x2(obj.m_0, obj.m_1, obj.m_2); }
cyb/wysm/crates/wasmi/src/engine/executor/handler/mod.rs
cyb/wysm/crates/wasmi/src/engine/translator/func/mod.rs
cyb/evy/forks/naga/src/front/wgsl/parse/mod.rs
cyb/evy/forks/naga/src/back/wgsl/polyfill/mod.rs
cyb/evy/forks/naga/src/front/wgsl/lower/mod.rs
cyb/wysm/crates/wasmi/src/engine/translator/func/simd/mod.rs
cyb/wysm/crates/wasmi/src/engine/translator/func/stack/mod.rs
cyb/wysm/crates/wasmi/src/engine/executor/handler/dispatch/mod.rs

Graph