diff --git a/cranelift/wasm/src/func_translator.rs b/cranelift/wasm/src/func_translator.rs index b49cffd474..cced9d87e6 100644 --- a/cranelift/wasm/src/func_translator.rs +++ b/cranelift/wasm/src/func_translator.rs @@ -179,6 +179,10 @@ fn declare_locals( I64 => builder.ins().iconst(ir::types::I64, 0), F32 => builder.ins().f32const(ir::immediates::Ieee32::with_bits(0)), F64 => builder.ins().f64const(ir::immediates::Ieee64::with_bits(0)), + V128 => { + let constant_handle = builder.func.dfg.constants.insert([0; 16].to_vec()); + builder.ins().vconst(ir::types::I8X16, constant_handle) + } AnyRef => builder.ins().null(environ.reference_type()), ty => wasm_unsupported!("unsupported local type {:?}", ty), }; diff --git a/cranelift/wasm/src/sections_translator.rs b/cranelift/wasm/src/sections_translator.rs index 67830af3ff..47aeb495cb 100644 --- a/cranelift/wasm/src/sections_translator.rs +++ b/cranelift/wasm/src/sections_translator.rs @@ -14,6 +14,7 @@ use crate::translation_utils::{ }; use crate::{wasm_unsupported, HashMap}; use core::convert::TryFrom; +use cranelift_codegen::ir::immediates::Uimm128; use cranelift_codegen::ir::{self, AbiParam, Signature}; use cranelift_entity::EntityRef; use std::vec::Vec; @@ -201,6 +202,9 @@ pub fn parse_global_section( Operator::I64Const { value } => GlobalInit::I64Const(value), Operator::F32Const { value } => GlobalInit::F32Const(value.bits()), Operator::F64Const { value } => GlobalInit::F64Const(value.bits()), + Operator::V128Const { value } => { + GlobalInit::V128Const(Uimm128::from(value.bytes().to_vec().as_slice())) + } Operator::GetGlobal { global_index } => { GlobalInit::GetGlobal(GlobalIndex::from_u32(global_index)) } diff --git a/cranelift/wasm/src/translation_utils.rs b/cranelift/wasm/src/translation_utils.rs index 7dd774a626..23d2c2892d 100644 --- a/cranelift/wasm/src/translation_utils.rs +++ b/cranelift/wasm/src/translation_utils.rs @@ -4,6 +4,7 @@ use crate::wasm_unsupported; use core::u32; use cranelift_codegen::entity::entity_impl; use cranelift_codegen::ir; +use cranelift_codegen::ir::immediates::Uimm128; #[cfg(feature = "enable-serde")] use serde::{Deserialize, Serialize}; use wasmparser; @@ -77,7 +78,7 @@ pub enum GlobalInit { /// An `f64.const`. F64Const(u64), /// A `vconst`. - V128Const([u8; 16]), + V128Const(Uimm128), /// A `get_global` of another global. GetGlobal(GlobalIndex), ///< The global is imported from, and thus initialized by, a different module.