Files
wasmtime/cranelift/codegen/benches/x64-evex-encoding.rs
2021-10-10 14:19:08 +02:00

56 lines
1.8 KiB
Rust

//! 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 = Register::from(2);
group.bench_function("EvexInstruction (builder pattern)", |b| {
let mut sink = vec![];
b.iter(|| {
sink.clear();
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() {
criterion::__warn_about_html_reports_feature();
criterion::__warn_about_cargo_bench_support_feature();
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.",
);
}