Path: blob/main/cranelift/codegen/meta/src/shared/immediates.rs
1693 views
use crate::cdsl::operands::{EnumValues, OperandKind, OperandKindFields};12use std::collections::HashMap;34pub(crate) struct Immediates {5/// A 64-bit immediate integer operand.6///7/// This type of immediate integer can interact with SSA values with any IntType type.8pub imm64: OperandKind,910/// An unsigned 8-bit immediate integer operand.11///12/// This small operand is used to indicate lane indexes in SIMD vectors and immediate bit13/// counts on shift instructions.14pub uimm8: OperandKind,1516/// A 32-bit immediate signed offset.17///18/// This is used to represent an immediate address offset in load/store instructions.19pub offset32: OperandKind,2021/// A 16-bit immediate floating point operand.22///23/// IEEE 754-2008 binary16 interchange format.24pub ieee16: OperandKind,2526/// A 32-bit immediate floating point operand.27///28/// IEEE 754-2008 binary32 interchange format.29pub ieee32: OperandKind,3031/// A 64-bit immediate floating point operand.32///33/// IEEE 754-2008 binary64 interchange format.34pub ieee64: OperandKind,3536/// A condition code for comparing integer values.37///38/// This enumerated operand kind is used for the `icmp` instruction and corresponds to the39/// condcodes::IntCC` Rust type.40pub intcc: OperandKind,4142/// A condition code for comparing floating point values.43///44/// This enumerated operand kind is used for the `fcmp` instruction and corresponds to the45/// `condcodes::FloatCC` Rust type.46pub floatcc: OperandKind,4748/// Flags for memory operations like `load` and `store`.49pub memflags: OperandKind,5051/// A trap code indicating the reason for trapping.52///53/// The Rust enum type also has a `User(u16)` variant for user-provided trap codes.54pub trapcode: OperandKind,5556/// A code indicating the arithmetic operation to perform in an atomic_rmw memory access.57pub atomic_rmw_op: OperandKind,58}5960fn new_imm(61format_field_name: &'static str,62rust_type: &'static str,63doc: &'static str,64) -> OperandKind {65OperandKind::new(66format_field_name,67rust_type,68OperandKindFields::ImmValue,69doc,70)71}72fn new_enum(73format_field_name: &'static str,74rust_type: &'static str,75values: EnumValues,76doc: &'static str,77) -> OperandKind {78OperandKind::new(79format_field_name,80rust_type,81OperandKindFields::ImmEnum(values),82doc,83)84}8586impl Immediates {87pub fn new() -> Self {88Self {89imm64: new_imm(90"imm",91"ir::immediates::Imm64",92"A 64-bit immediate integer.",93),94uimm8: new_imm(95"imm",96"ir::immediates::Uimm8",97"An 8-bit immediate unsigned integer.",98),99offset32: new_imm(100"offset",101"ir::immediates::Offset32",102"A 32-bit immediate signed offset.",103),104ieee16: new_imm(105"imm",106"ir::immediates::Ieee16",107"A 16-bit immediate floating point number.",108),109ieee32: new_imm(110"imm",111"ir::immediates::Ieee32",112"A 32-bit immediate floating point number.",113),114ieee64: new_imm(115"imm",116"ir::immediates::Ieee64",117"A 64-bit immediate floating point number.",118),119intcc: {120let mut intcc_values = HashMap::new();121intcc_values.insert("eq", "Equal");122intcc_values.insert("ne", "NotEqual");123intcc_values.insert("sge", "SignedGreaterThanOrEqual");124intcc_values.insert("sgt", "SignedGreaterThan");125intcc_values.insert("sle", "SignedLessThanOrEqual");126intcc_values.insert("slt", "SignedLessThan");127intcc_values.insert("uge", "UnsignedGreaterThanOrEqual");128intcc_values.insert("ugt", "UnsignedGreaterThan");129intcc_values.insert("ule", "UnsignedLessThanOrEqual");130intcc_values.insert("ult", "UnsignedLessThan");131new_enum(132"cond",133"ir::condcodes::IntCC",134intcc_values,135"An integer comparison condition code.",136)137},138139floatcc: {140let mut floatcc_values = HashMap::new();141floatcc_values.insert("ord", "Ordered");142floatcc_values.insert("uno", "Unordered");143floatcc_values.insert("eq", "Equal");144floatcc_values.insert("ne", "NotEqual");145floatcc_values.insert("one", "OrderedNotEqual");146floatcc_values.insert("ueq", "UnorderedOrEqual");147floatcc_values.insert("lt", "LessThan");148floatcc_values.insert("le", "LessThanOrEqual");149floatcc_values.insert("gt", "GreaterThan");150floatcc_values.insert("ge", "GreaterThanOrEqual");151floatcc_values.insert("ult", "UnorderedOrLessThan");152floatcc_values.insert("ule", "UnorderedOrLessThanOrEqual");153floatcc_values.insert("ugt", "UnorderedOrGreaterThan");154floatcc_values.insert("uge", "UnorderedOrGreaterThanOrEqual");155new_enum(156"cond",157"ir::condcodes::FloatCC",158floatcc_values,159"A floating point comparison condition code",160)161},162163memflags: new_imm("flags", "ir::MemFlags", "Memory operation flags"),164165trapcode: {166let mut trapcode_values = HashMap::new();167trapcode_values.insert("stk_ovf", "STACK_OVERFLOW");168trapcode_values.insert("heap_oob", "HEAP_OUT_OF_BOUNDS");169trapcode_values.insert("int_ovf", "INTEGER_OVERFLOW");170trapcode_values.insert("int_divz", "INTEGER_DIVISION_BY_ZERO");171trapcode_values.insert("bad_toint", "BAD_CONVERSION_TO_INTEGER");172new_enum(173"code",174"ir::TrapCode",175trapcode_values,176"A trap reason code.",177)178},179atomic_rmw_op: {180let mut atomic_rmw_op_values = HashMap::new();181atomic_rmw_op_values.insert("add", "Add");182atomic_rmw_op_values.insert("sub", "Sub");183atomic_rmw_op_values.insert("and", "And");184atomic_rmw_op_values.insert("nand", "Nand");185atomic_rmw_op_values.insert("or", "Or");186atomic_rmw_op_values.insert("xor", "Xor");187atomic_rmw_op_values.insert("xchg", "Xchg");188atomic_rmw_op_values.insert("umin", "Umin");189atomic_rmw_op_values.insert("umax", "Umax");190atomic_rmw_op_values.insert("smin", "Smin");191atomic_rmw_op_values.insert("smax", "Smax");192new_enum(193"op",194"ir::AtomicRmwOp",195atomic_rmw_op_values,196"Atomic Read-Modify-Write Ops",197)198},199}200}201}202203204