Path: blob/main/cranelift/codegen/src/ir/atomic_rmw_op.rs
1693 views
/// Describes the arithmetic operation in an atomic memory read-modify-write operation.1use core::fmt::{self, Display, Formatter};2use core::str::FromStr;3#[cfg(feature = "enable-serde")]4use serde_derive::{Deserialize, Serialize};56#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]7#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]8/// Describes the arithmetic operation in an atomic memory read-modify-write operation.9pub enum AtomicRmwOp {10/// Add11Add,12/// Sub13Sub,14/// And15And,16/// Nand17Nand,18/// Or19Or,20/// Xor21Xor,22/// Exchange23Xchg,24/// Unsigned min25Umin,26/// Unsigned max27Umax,28/// Signed min29Smin,30/// Signed max31Smax,32}3334impl AtomicRmwOp {35/// Returns a slice with all supported [AtomicRmwOp]'s.36pub fn all() -> &'static [AtomicRmwOp] {37&[38AtomicRmwOp::Add,39AtomicRmwOp::Sub,40AtomicRmwOp::And,41AtomicRmwOp::Nand,42AtomicRmwOp::Or,43AtomicRmwOp::Xor,44AtomicRmwOp::Xchg,45AtomicRmwOp::Umin,46AtomicRmwOp::Umax,47AtomicRmwOp::Smin,48AtomicRmwOp::Smax,49]50}51}5253impl Display for AtomicRmwOp {54fn fmt(&self, f: &mut Formatter) -> fmt::Result {55let s = match self {56AtomicRmwOp::Add => "add",57AtomicRmwOp::Sub => "sub",58AtomicRmwOp::And => "and",59AtomicRmwOp::Nand => "nand",60AtomicRmwOp::Or => "or",61AtomicRmwOp::Xor => "xor",62AtomicRmwOp::Xchg => "xchg",63AtomicRmwOp::Umin => "umin",64AtomicRmwOp::Umax => "umax",65AtomicRmwOp::Smin => "smin",66AtomicRmwOp::Smax => "smax",67};68f.write_str(s)69}70}7172impl FromStr for AtomicRmwOp {73type Err = ();74fn from_str(s: &str) -> Result<Self, Self::Err> {75match s {76"add" => Ok(AtomicRmwOp::Add),77"sub" => Ok(AtomicRmwOp::Sub),78"and" => Ok(AtomicRmwOp::And),79"nand" => Ok(AtomicRmwOp::Nand),80"or" => Ok(AtomicRmwOp::Or),81"xor" => Ok(AtomicRmwOp::Xor),82"xchg" => Ok(AtomicRmwOp::Xchg),83"umin" => Ok(AtomicRmwOp::Umin),84"umax" => Ok(AtomicRmwOp::Umax),85"smin" => Ok(AtomicRmwOp::Smin),86"smax" => Ok(AtomicRmwOp::Smax),87_ => Err(()),88}89}90}9192#[cfg(test)]93mod tests {94use super::*;9596#[test]97fn roundtrip_parse() {98for op in AtomicRmwOp::all() {99let roundtripped = format!("{op}").parse::<AtomicRmwOp>().unwrap();100assert_eq!(*op, roundtripped);101}102}103}104105106