diff --git a/cranelift/wasm/src/code_translator.rs b/cranelift/wasm/src/code_translator.rs index 79e91f6e9d..ee3c15ff16 100644 --- a/cranelift/wasm/src/code_translator.rs +++ b/cranelift/wasm/src/code_translator.rs @@ -2407,8 +2407,16 @@ fn translate_store( state: &mut FuncTranslationState, environ: &mut FE, ) -> WasmResult<()> { - let val = state.pop1(); - let val_ty = builder.func.dfg.value_type(val); + let mut val = state.pop1(); + let mut val_ty = builder.func.dfg.value_type(val); + + // Boolean-vector types don't validate with a `store` instruction, so + // bitcast them to a vector type which is compatible with the store + // instruction. + if val_ty.is_vector() && val_ty.lane_type().is_bool() { + val = builder.ins().raw_bitcast(I8X16, val); + val_ty = I8X16; + } let (flags, base, offset) = prepare_addr(memarg, mem_op_size(opcode, val_ty), builder, state, environ)?; diff --git a/cranelift/wasm/wasmtests/simd-store.wat b/cranelift/wasm/wasmtests/simd-store.wat new file mode 100644 index 0000000000..f3bdd1d5c0 --- /dev/null +++ b/cranelift/wasm/wasmtests/simd-store.wat @@ -0,0 +1,83 @@ +(module + (func (param v128) + (v128.store (i32.const 0) (i8x16.eq (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i16x8.eq (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i32x4.eq (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i64x2.eq (local.get 0) (local.get 0)))) + + (func (param v128) + (v128.store (i32.const 0) (i8x16.ne (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i16x8.ne (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i32x4.ne (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i64x2.ne (local.get 0) (local.get 0)))) + + (func (param v128) + (v128.store (i32.const 0) (i8x16.lt_s (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i16x8.lt_s (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i32x4.lt_s (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i64x2.lt_s (local.get 0) (local.get 0)))) + + (func (param v128) + (v128.store (i32.const 0) (i8x16.lt_u (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i16x8.lt_u (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i32x4.lt_u (local.get 0) (local.get 0)))) + + (func (param v128) + (v128.store (i32.const 0) (i8x16.gt_s (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i16x8.gt_s (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i32x4.gt_s (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i64x2.gt_s (local.get 0) (local.get 0)))) + + (func (param v128) + (v128.store (i32.const 0) (i8x16.gt_u (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i16x8.gt_u (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (i32x4.gt_u (local.get 0) (local.get 0)))) + + (func (param v128) + (v128.store (i32.const 0) (f32x4.eq (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (f64x2.eq (local.get 0) (local.get 0)))) + + (func (param v128) + (v128.store (i32.const 0) (f32x4.ne (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (f64x2.ne (local.get 0) (local.get 0)))) + + (func (param v128) + (v128.store (i32.const 0) (f32x4.lt (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (f64x2.lt (local.get 0) (local.get 0)))) + + (func (param v128) + (v128.store (i32.const 0) (f32x4.le (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (f64x2.le (local.get 0) (local.get 0)))) + + (func (param v128) + (v128.store (i32.const 0) (f32x4.gt (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (f64x2.gt (local.get 0) (local.get 0)))) + + (func (param v128) + (v128.store (i32.const 0) (f32x4.ge (local.get 0) (local.get 0)))) + (func (param v128) + (v128.store (i32.const 0) (f64x2.ge (local.get 0) (local.get 0)))) + + (memory 0) +)