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:
@@ -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
|
||||
|
||||
10
tests/misc_testsuite/simd/issue_3173_select_v128.wast
Normal file
10
tests/misc_testsuite/simd/issue_3173_select_v128.wast
Normal 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))
|
||||
Reference in New Issue
Block a user