//! Measure instruction encoding latency using various approaches; the //! benchmarking is feature-gated on `x86` since it only measures the encoding //! mechanism of that backend. #[cfg(feature = "x86")] mod x86 { use cranelift_codegen::isa::x64::encoding::{ evex::{EvexInstruction, EvexVectorLength, Register}, rex::{LegacyPrefixes, OpcodeMap}, }; use criterion::{criterion_group, Criterion}; // Define the benchmarks. fn x64_evex_encoding_benchmarks(c: &mut Criterion) { let mut group = c.benchmark_group("x64 EVEX encoding"); let rax = Register::from(0); let rdx = 2; group.bench_function("EvexInstruction (builder pattern)", |b| { b.iter(|| { let mut sink = cranelift_codegen::MachBuffer::new(); EvexInstruction::new() .prefix(LegacyPrefixes::_66) .map(OpcodeMap::_0F38) .w(true) .opcode(0x1F) .reg(rax) .rm(rdx) .length(EvexVectorLength::V128) .encode(&mut sink); }); }); } criterion_group!(benches, x64_evex_encoding_benchmarks); /// Using an inner module to feature-gate the benchmarks means that we must /// manually specify how to run the benchmarks (see `criterion_main!`). pub fn run_benchmarks() { benches(); Criterion::default().configure_from_args().final_summary(); } } fn main() { #[cfg(feature = "x86")] x86::run_benchmarks(); #[cfg(not(feature = "x86"))] println!( "Unable to run the x64-evex-encoding benchmark; the `x86` feature must be enabled in Cargo.", ); }