vyre-libs 0.6.1

vyre Category A library ecosystem - pure-IR compositions over vyre-ops hardware primitives
Documentation
use super::*;

pub(crate) fn emit_identifier_hash_for_row(
    vast_nodes: &str,
    haystack: &str,
    haystack_len: &Expr,
    row_base: Expr,
    prefix: &str,
    packed_haystack: bool,
) -> Vec<Node> {
    let start = format!("{prefix}_start");
    let len = format!("{prefix}_len");
    let hash = format!("{prefix}_hash");
    let i = format!("{prefix}_i");
    let byte = format!("{prefix}_byte");

    vec![
        Node::let_bind(
            &start,
            Expr::load(vast_nodes, Expr::add(row_base.clone(), Expr::u32(5))),
        ),
        Node::let_bind(
            &len,
            Expr::load(vast_nodes, Expr::add(row_base.clone(), Expr::u32(6))),
        ),
        Node::let_bind(
            &hash,
            Expr::load(
                vast_nodes,
                Expr::add(row_base, Expr::u32(VAST_TYPEDEF_SYMBOL_FIELD)),
            ),
        ),
        Node::if_then(
            Expr::eq(Expr::var(&hash), Expr::u32(0)),
            vec![
                Node::assign(&hash, Expr::u32(0x811c9dc5)),
                Node::loop_for(
                    &i,
                    Expr::u32(0),
                    Expr::var(&len),
                    vec![Node::if_then(
                        Expr::lt(
                            Expr::add(Expr::var(&start), Expr::var(&i)),
                            haystack_len.clone(),
                        ),
                        vec![
                            Node::let_bind(
                                &byte,
                                load_source_byte(
                                    haystack,
                                    Expr::add(Expr::var(&start), Expr::var(&i)),
                                    packed_haystack,
                                ),
                            ),
                            Node::assign(&hash, Expr::bitxor(Expr::var(&hash), Expr::var(&byte))),
                            Node::assign(&hash, Expr::mul(Expr::var(&hash), Expr::u32(0x01000193))),
                        ],
                    )],
                ),
            ],
        ),
    ]
}