Path: blob/main/cranelift/assembler-x64/src/inst.rs
3071 views
//! Expose all known instructions as Rust `struct`s; this is generated in1//! `build.rs`.2//!3//! See also: [`Inst`], an `enum` containing all these instructions.45use crate::Fixed;6use crate::api::{AsReg, CodeSink, RegisterVisitor, Registers, TrapCode};7use crate::evex::EvexPrefix;8use crate::features::{AvailableFeatures, Feature, Features};9use crate::gpr::{self, Gpr, Size};10use crate::imm::{Extension, Imm8, Imm16, Imm32, Imm64, Simm8, Simm32};11use crate::mem::{Amode, GprMem, XmmMem};12use crate::rex::RexPrefix;13use crate::vex::VexPrefix;14use crate::xmm::{self, Xmm};1516use alloc::string::ToString;1718// Include code generated by the `meta` crate.19include!(concat!(env!("OUT_DIR"), "/assembler.rs"));2021/// A macro listing all available CPU features.22///23/// This is generated from the `dsl::Feature` enumeration defined in the `meta`24/// crate. It makes it easier to generate code based on the available features.25///26/// ```27/// # use cranelift_assembler_x64::{AvailableFeatures, Fixed, for_each_feature, Imm8, inst, Registers};28/// // Tell the assembler the type of registers we're using; we can always29/// // encode a HW register as a `u8` (e.g., `eax = 0`).30/// pub struct Regs;31/// impl Registers for Regs {32/// type ReadGpr = u8;33/// type ReadWriteGpr = u8;34/// type WriteGpr = u8;35/// type ReadXmm = u8;36/// type ReadWriteXmm = u8;37/// type WriteXmm = u8;38/// }39///40/// // Define a target that says all CPU features are available.41/// macro_rules! return_true { ($($f:ident)+) => { $(fn $f(&self) -> bool { true })+ }; }42/// struct AllFeatures;43/// impl AvailableFeatures for AllFeatures {44/// for_each_feature!(return_true);45/// }46///47/// // Define a target that says no CPU features are available.48/// macro_rules! return_false { ($($f:ident)+) => { $(fn $f(&self) -> bool { false })+ }; }49/// struct NoFeatures;50/// impl AvailableFeatures for NoFeatures {51/// for_each_feature!(return_false);52/// }53///54/// let rax: u8 = 0;55/// let and = inst::andb_i::<Regs>::new(Fixed(rax), Imm8::new(0b10101010));56///57/// assert!(and.is_available(&AllFeatures));58/// assert!(!and.is_available(&NoFeatures));59/// ```60#[doc(inline)]61pub use for_each_feature;626364