diff --git a/cranelift/wasm/src/code_translator.rs b/cranelift/wasm/src/code_translator.rs index b20d3091e7..2c237e7404 100644 --- a/cranelift/wasm/src/code_translator.rs +++ b/cranelift/wasm/src/code_translator.rs @@ -73,13 +73,27 @@ pub fn translate_operator( builder.set_val_label(val, label); } Operator::LocalSet { local_index } => { - let val = state.pop1(); + let mut val = state.pop1(); + + // Ensure SIMD values are cast to their default Cranelift type, I8x16. + let ty = builder.func.dfg.value_type(val); + if ty.is_vector() { + val = optionally_bitcast_vector(val, I8X16, builder); + } + builder.def_var(Variable::with_u32(*local_index), val); let label = ValueLabel::from_u32(*local_index); builder.set_val_label(val, label); } Operator::LocalTee { local_index } => { - let val = state.peek1(); + let mut val = state.peek1(); + + // Ensure SIMD values are cast to their default Cranelift type, I8x16. + let ty = builder.func.dfg.value_type(val); + if ty.is_vector() { + val = optionally_bitcast_vector(val, I8X16, builder); + } + builder.def_var(Variable::with_u32(*local_index), val); let label = ValueLabel::from_u32(*local_index); builder.set_val_label(val, label); diff --git a/cranelift/wasmtests/simd.wat b/cranelift/wasmtests/simd.wat index 99b7d5c10d..0e40648993 100644 --- a/cranelift/wasmtests/simd.wat +++ b/cranelift/wasmtests/simd.wat @@ -17,6 +17,12 @@ i32x4.extract_lane 3 ) + (func $test_locals (local i32 v128) + local.get 0 + i32x4.splat + local.set 1 + ) + (export "test_splat" (func $test_splat)) (export "test_insert_lane" (func $test_insert_lane)) (export "test_const" (func $test_const))