x64: allow vector types in select move

As reported in #3173, the `select` instruction fails an assertion when it is given `v128` types as operands. This change relaxes the assertion to allow the same type of XMM move that occurs for the f32 and f64 types. This fixes #3173 in the old `lower.rs` code temporarily until the relatively complex `select` lowering can be ported to ISLE.
This commit is contained in:
Andrew Brown
2021-11-19 10:29:37 -08:00
parent ef8ea644f4
commit 994fe41daf
2 changed files with 15 additions and 1 deletions

View File

@@ -5297,7 +5297,11 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
if is_int_or_ref_ty(ty) || ty == types::I128 {
emit_cmoves(ctx, size, cc, lhs, dst);
} else {
debug_assert!(ty == types::F32 || ty == types::F64);
debug_assert!(
ty == types::F32
|| ty == types::F64
|| (ty.is_vector() && ty.bits() == 128)
);
ctx.emit(Inst::xmm_cmove(
if ty == types::F64 {
OperandSize::Size64

View File

@@ -0,0 +1,10 @@
(; See issue https://github.com/bytecodealliance/wasmtime/issues/3173. ;)
(module
(func (export "select_v128") (result v128)
v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000
v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000
i32.const 0
select))
(assert_return (invoke "select_v128") (v128.const i32x4 0 0 0 0))