Add flags to allow wasm SIMD instructions (#910)

Add `--enable-simd` flag to `clif-util wasm`
This commit is contained in:
Andrew Brown
2019-08-27 01:52:06 -07:00
committed by Benjamin Bouvier
parent ca6449626f
commit 2b49b51306
3 changed files with 20 additions and 5 deletions

View File

@@ -104,7 +104,13 @@ fn add_print_flag<'a>() -> clap::Arg<'a, 'a> {
fn add_debug_flag<'a>() -> clap::Arg<'a, 'a> { fn add_debug_flag<'a>() -> clap::Arg<'a, 'a> {
Arg::with_name("debug") Arg::with_name("debug")
.short("d") .short("d")
.help("enable debug output on stderr/stdout") .help("Enable debug output on stderr/stdout")
}
fn add_enable_simd_flag<'a>() -> clap::Arg<'a, 'a> {
Arg::with_name("enable-simd")
.long("enable-simd")
.help("Enable WASM's SIMD operations")
} }
/// Returns a vector of clap value options and changes these options into a vector of strings /// Returns a vector of clap value options and changes these options into a vector of strings
@@ -137,6 +143,7 @@ fn add_wasm_or_compile<'a>(cmd: &str) -> clap::App<'a, 'a> {
.arg(add_target_flag()) .arg(add_target_flag())
.arg(add_input_file_arg()) .arg(add_input_file_arg())
.arg(add_debug_flag()) .arg(add_debug_flag())
.arg(add_enable_simd_flag())
} }
fn handle_debug_flag(debug: bool) { fn handle_debug_flag(debug: bool) {
@@ -296,6 +303,7 @@ fn main() {
rest_cmd.is_present("print-size"), rest_cmd.is_present("print-size"),
rest_cmd.is_present("time-passes"), rest_cmd.is_present("time-passes"),
rest_cmd.is_present("value-ranges"), rest_cmd.is_present("value-ranges"),
rest_cmd.is_present("enable-simd"),
) )
}; };

View File

@@ -19,7 +19,7 @@ use cranelift_wasm::{translate_module, DummyEnvironment, FuncIndex, ReturnMode};
use std::path::Path; use std::path::Path;
use std::path::PathBuf; use std::path::PathBuf;
use term; use term;
use wabt::wat2wasm; use wabt::{wat2wasm_with_features, Features};
macro_rules! vprintln { macro_rules! vprintln {
($x: expr, $($tts:tt)*) => { ($x: expr, $($tts:tt)*) => {
@@ -49,6 +49,7 @@ pub fn run(
flag_print_size: bool, flag_print_size: bool,
flag_report_times: bool, flag_report_times: bool,
flag_calc_value_ranges: bool, flag_calc_value_ranges: bool,
flag_enable_simd: bool,
) -> Result<(), String> { ) -> Result<(), String> {
let parsed = parse_sets_and_triple(flag_set, flag_triple)?; let parsed = parse_sets_and_triple(flag_set, flag_triple)?;
@@ -64,6 +65,7 @@ pub fn run(
flag_print_disasm, flag_print_disasm,
flag_report_times, flag_report_times,
flag_calc_value_ranges, flag_calc_value_ranges,
flag_enable_simd,
&path.to_path_buf(), &path.to_path_buf(),
&name, &name,
parsed.as_fisa(), parsed.as_fisa(),
@@ -81,6 +83,7 @@ fn handle_module(
flag_print_disasm: bool, flag_print_disasm: bool,
flag_report_times: bool, flag_report_times: bool,
flag_calc_value_ranges: bool, flag_calc_value_ranges: bool,
flag_enable_simd: bool,
path: &PathBuf, path: &PathBuf,
name: &str, name: &str,
fisa: FlagsOrIsa, fisa: FlagsOrIsa,
@@ -97,7 +100,11 @@ fn handle_module(
let mut module_binary = read_to_end(path.clone()).map_err(|err| err.to_string())?; let mut module_binary = read_to_end(path.clone()).map_err(|err| err.to_string())?;
if !module_binary.starts_with(&[b'\0', b'a', b's', b'm']) { if !module_binary.starts_with(&[b'\0', b'a', b's', b'm']) {
module_binary = match wat2wasm(&module_binary) { let mut features = Features::new();
if flag_enable_simd {
features.enable_simd();
}
module_binary = match wat2wasm_with_features(&module_binary, features) {
Ok(data) => data, Ok(data) => data,
Err(e) => return Err(e.to_string()), Err(e) => return Err(e.to_string()),
}; };

View File

@@ -53,6 +53,8 @@ fn read_file(path: &Path) -> io::Result<Vec<u8>> {
} }
fn handle_module(path: &Path, flags: &Flags, return_mode: ReturnMode) { fn handle_module(path: &Path, flags: &Flags, return_mode: ReturnMode) {
let mut features = Features::new();
features.enable_all();
let data = match path.extension() { let data = match path.extension() {
None => { None => {
panic!("the file extension is not wasm or wat"); panic!("the file extension is not wasm or wat");
@@ -61,8 +63,6 @@ fn handle_module(path: &Path, flags: &Flags, return_mode: ReturnMode) {
Some("wasm") => read_file(path).expect("error reading wasm file"), Some("wasm") => read_file(path).expect("error reading wasm file"),
Some("wat") => { Some("wat") => {
let wat = read_file(path).expect("error reading wat file"); let wat = read_file(path).expect("error reading wat file");
let mut features = Features::new();
features.enable_all();
match wat2wasm_with_features(&wat, features) { match wat2wasm_with_features(&wat, features) {
Ok(wasm) => wasm, Ok(wasm) => wasm,
Err(e) => { Err(e) => {