From af64187ec7eb4d146bb70e2a07f0d343943eb6f5 Mon Sep 17 00:00:00 2001 From: Andrew Brown Date: Thu, 12 Dec 2019 13:52:26 -0800 Subject: [PATCH] Truncate over-large parameters to splat (#1276) See https://github.com/WebAssembly/simd/issues/149 for associated discussion on this. --- cranelift/wasm/src/code_translator.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/cranelift/wasm/src/code_translator.rs b/cranelift/wasm/src/code_translator.rs index 41f5726cd6..efd4d22561 100644 --- a/cranelift/wasm/src/code_translator.rs +++ b/cranelift/wasm/src/code_translator.rs @@ -1093,15 +1093,16 @@ pub fn translate_operator( // the v128.const is typed in CLIF as a I8x16 but raw_bitcast to a different type before use state.push1(value) } - Operator::I8x16Splat - | Operator::I16x8Splat - | Operator::I32x4Splat + Operator::I8x16Splat | Operator::I16x8Splat => { + let reduced = builder.ins().ireduce(type_of(op).lane_type(), state.pop1()); + let splatted = builder.ins().splat(type_of(op), reduced); + state.push1(splatted) + } + Operator::I32x4Splat | Operator::I64x2Splat | Operator::F32x4Splat | Operator::F64x2Splat => { - let value_to_splat = state.pop1(); - let ty = type_of(op); - let splatted = builder.ins().splat(ty, value_to_splat); + let splatted = builder.ins().splat(type_of(op), state.pop1()); state.push1(splatted) } Operator::I8x16ExtractLaneS { lane } | Operator::I16x8ExtractLaneS { lane } => {