Macro for_each_feature

Source
macro_rules! for_each_feature {
    ($m:ident) => { ... };
}
Expand description

A macro listing all available CPU features.

This is generated from the dsl::Feature enumeration defined in the meta crate. It makes it easier to generate code based on the available features.

// Tell the assembler the type of registers we're using; we can always
// encode a HW register as a `u8` (e.g., `eax = 0`).
pub struct Regs;
impl Registers for Regs {
    type ReadGpr = u8;
    type ReadWriteGpr = u8;
    type WriteGpr = u8;
    type ReadXmm = u8;
    type ReadWriteXmm = u8;
    type WriteXmm = u8;
}

// Define a target that says all CPU features are available.
macro_rules! return_true { ($($f:ident)+) => { $(fn $f(&self) -> bool { true })+ }; }
struct AllFeatures;
impl AvailableFeatures for AllFeatures {
    for_each_feature!(return_true);
}

// Define a target that says no CPU features are available.
macro_rules! return_false { ($($f:ident)+) => { $(fn $f(&self) -> bool { false })+ }; }
struct NoFeatures;
impl AvailableFeatures for NoFeatures {
    for_each_feature!(return_false);
}

let rax: u8 = 0;
let and = inst::andb_i::<Regs>::new(Fixed(rax), Imm8::new(0b10101010));

assert!(and.is_available(&AllFeatures));
assert!(!and.is_available(&NoFeatures));