cubecl_ir/
bitwise.rs

1use core::fmt::Display;
2
3use crate::TypeHash;
4
5use crate::{BinaryOperator, OperationReflect, UnaryOperator};
6
7/// Bitwise operations
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9#[derive(Debug, Clone, TypeHash, PartialEq, Eq, Hash, OperationReflect)]
10#[operation(opcode_name = BitwiseOpCode, pure)]
11pub enum Bitwise {
12    #[operation(commutative)]
13    BitwiseAnd(BinaryOperator),
14    #[operation(commutative)]
15    BitwiseOr(BinaryOperator),
16    #[operation(commutative)]
17    BitwiseXor(BinaryOperator),
18    ShiftLeft(BinaryOperator),
19    ShiftRight(BinaryOperator),
20    CountOnes(UnaryOperator),
21    ReverseBits(UnaryOperator),
22    BitwiseNot(UnaryOperator),
23    /// Count leading zeros
24    LeadingZeros(UnaryOperator),
25    /// Find least significant bit set
26    FindFirstSet(UnaryOperator),
27}
28
29impl Display for Bitwise {
30    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
31        match self {
32            Bitwise::BitwiseAnd(op) => write!(f, "{} & {}", op.lhs, op.rhs),
33            Bitwise::BitwiseOr(op) => write!(f, "{} | {}", op.lhs, op.rhs),
34            Bitwise::BitwiseXor(op) => write!(f, "{} ^ {}", op.lhs, op.rhs),
35            Bitwise::CountOnes(op) => write!(f, "{}.count_bits()", op.input),
36            Bitwise::ReverseBits(op) => write!(f, "{}.reverse_bits()", op.input),
37            Bitwise::ShiftLeft(op) => write!(f, "{} << {}", op.lhs, op.rhs),
38            Bitwise::ShiftRight(op) => write!(f, "{} >> {}", op.lhs, op.rhs),
39            Bitwise::BitwiseNot(op) => write!(f, "!{}", op.input),
40            Bitwise::LeadingZeros(op) => write!(f, "{}.leading_zeros()", op.input),
41            Bitwise::FindFirstSet(op) => write!(f, "{}.find_first_set()", op.input),
42        }
43    }
44}