vyre 0.4.0

GPU compute intermediate representation with a standard operation library
Documentation
pub use super::bitwise::{
    and, clz, ctz, extract_bits, insert_bits, not, or, popcount, reverse_bits, rotl, rotr, shl,
    shr, xor,
};
pub use super::compare::logical_not;
pub use super::compare::{eq, ge, gt, le, lt, ne};
pub use super::math::{
    abs, add, add_sat, div, gcd, lcm, mod_op, mul, neg, negate, sign, sub, sub_sat,
};
use crate::ir::{BufferDecl, DataType, Expr, Node, Program};

pub(crate) fn unary_u32_program(compute: fn(Expr) -> Expr) -> Program {
    let idx = Expr::var("idx");
    Program::new(
        vec![
            BufferDecl::read("a", 0, DataType::U32),
            BufferDecl::output("out", 1, DataType::U32),
        ],
        crate::ops::primitive::WORKGROUP_SIZE,
        vec![
            Node::let_bind("idx", Expr::gid_x()),
            Node::if_then(
                Expr::lt(idx.clone(), Expr::buf_len("out")),
                vec![Node::store(
                    "out",
                    idx.clone(),
                    compute(Expr::load("a", idx)),
                )],
            ),
        ],
    )
}