use crate::ir::{Expr, Program};
use crate::ops::primitive;
use crate::ops::{AlgebraicLaw, OpSpec, U32_INPUTS, U32_OUTPUTS};
pub const LAWS: &[AlgebraicLaw] = &[AlgebraicLaw::Bounded {
lo: 0,
hi: u32::MAX,
}];
#[derive(Debug, Clone, Copy, Default)]
pub struct Abs;
impl Abs {
pub const SPEC: OpSpec = OpSpec::composition_inlinable(
"primitive.math.abs",
U32_INPUTS,
U32_OUTPUTS,
LAWS,
Self::program,
);
#[must_use]
pub fn program() -> Program {
primitive::unary_u32_program(|a| {
let is_neg = Expr::ne(
Expr::bitand(a.clone(), Expr::u32(0x8000_0000)),
Expr::u32(0),
);
Expr::select(is_neg, Expr::negate(a.clone()), a)
})
}
}