use crate::ir::{BufferDecl, DataType, Expr, Node, Program};
use crate::ops::{AlgebraicLaw, OpSpec, U32_U32_INPUTS};
pub const BOOL_OUTPUTS: &[DataType] = &[DataType::Bool];
pub const LAWS: &[AlgebraicLaw] = &[
AlgebraicLaw::SelfInverse { result: 1 },
AlgebraicLaw::Bounded { lo: 0, hi: 1 },
];
#[derive(Debug, Clone, Copy, Default)]
pub struct Ge;
impl Ge {
pub const SPEC: OpSpec = OpSpec::composition_inlinable(
"primitive.compare.ge",
U32_U32_INPUTS,
BOOL_OUTPUTS,
LAWS,
Self::program,
);
#[must_use]
pub fn program() -> Program {
let idx = Expr::var("idx");
Program::new(
vec![
BufferDecl::read("a", 0, DataType::U32),
BufferDecl::read("b", 1, DataType::U32),
BufferDecl::output("out", 2, DataType::Bool),
],
[64, 1, 1],
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(),
Expr::ge(Expr::load("a", idx.clone()), Expr::load("b", idx)),
)],
),
],
)
}
}